因为最近织梦开启了版权收费,所以之前用织梦开发的网站都需要换一下,正好之前自己写了一套tp5开发的cms,本着为客户负责的态度,我们公司开始给之前的老客户免费更换后台,今天写这篇文章是为了记录下,tp
2021-08-17 17:12:57
242
今天做项目,有个需求网站根据用户访问自动获取当地的天气预报,其实刚开始觉得这个功能超级简单,直接iframe一个页面不就行了么。但是iframe的基本都有别人的链接,那么今天我就给大家分享一个比较的方法吧!
首先规划一下思路,这个需求应该分成两步根据ip获取城市名称,第二步更具城市名称获取城市天气预报。好下面我们具体操作:
步:根据ip获取城市名称
这里我们用太平洋的公共接口(主要是免费)http://whois.pconline.com.cn/ 这是接口说明
/* * 太平洋根据ip获取城市名字 */ function getCityFormIp($url) { $cityName = @file_get_contents($url); $cityName = iconv('GBK//IGNORE', 'UTF-8', $cityName); $cityName = preg_replace("/\s+/", "", $cityName); $cityName = json_decode($cityName); if ($cityName->err == '' || $cityName->city == '') { $city = '北京'; }else{ $city = str_replace('市','',$cityName->city); } return $city; }
这里我做了下处理如果没获取到 默认城市就是北京,可以根据自己的情况修改,因为后面我们的天气预报接口需要用到城市,但是不能有市这个字所以过滤掉先,这个只是获取的方法下面我们做一下参数的处理
public function getWeather() { $ip = $_SERVER["REMOTE_ADDR"]; $url = "http://whois.pconline.com.cn/ipJson.jsp?json=true&ip=".$ip; $city = getCityFormIp($url); $today = strtotime(date('Y-m-d')); $weather = []; // 是否获取到了城市名称 if ($city) { // cookies里是否有天气信息 $cookieWeather = cookie($city); if ($cookieWeather) { // cookie里的信息是否是昨天的 $ckWeather = encryption($cookieWeather,1); if ($ckWeather['time'] < $today) { // 如果是昨天的那么就重新获取 $weather = $this->_getWeather($city); }else{ // 否则直接将cookie里的信息给$weather $weather = $ckWeather; } }else{ $weather = $this->_getWeather($city); } } foreach ($weather as $k => $v) { if ($k == 'wid') { $weather['cnwid'] = cnwid($v); } } return $weather; } public function _getWeather($city) { // 请求的接口URL $apiUrl = 'http://apis.juhe.cn/simpleWeather/query'; $weatherkey = $ipkey = $this->config['juhe_weather']; // 请求参数 $params = [ 'city' => $city, // 要查询的城市 'key' => $weatherkey, ]; $paramsString = http_build_query($params); // 发起接口网络请求 $response = juheHttpRequest($apiUrl, $paramsString , 1); $result = json_decode($response, true); if ($result['error_code'] == 0) { $weather['code'] = 0; $weather['data'] = $result['result']['realtime']; $weather['data']['city'] = $result['result']['city']; $weather['data']['time'] = time(); $jsonData = encryption($weather['data'],0); cookie($result['result']['city'], $jsonData); }else{ $weather['code'] = 1; $weather['data'] = ''; } return $weather; }
因为获取ip的api是免费的,获取天气预报的是 收费的所以我将每天次获取到的天气预报的数据放到了cookies里面,这样就不用,同一个用户每天重复扣费的问题,也提升了速度,cookies这里用到了序列化和base64加密,这样别人就看不到具体的内容了,天气的具体查询方法就不贴出来了,聚合api的说明文档里有原封不动的复制过来就可以了,好了今天就分享到这里,感谢各位的浏览。