2.使用PHP根据ip地址查出所在城市天气

  1 <?php
  2     header("Content-type:text/html;charset=utf8");
  3 
  4     /**
  5      * 本地ip获取函数 
  6      *     
  7      * @return   string
  8      * @author   Matthew
  9      * @copyright 2016-07-06
 10      */
 11     function get_client_ip(){
 12         if ($_SERVER['REMOTE_ADDR']) {
 13              $cip = $_SERVER['REMOTE_ADDR'];
 14         } elseif (getenv("REMOTE_ADDR")) {
 15              $cip = getenv("REMOTE_ADDR");
 16         } elseif (getenv("HTTP_CLIENT_IP")) {
 17              $cip = getenv("HTTP_CLIENT_IP");
 18         } else {
 19              $cip = "unknown";
 20         }
 21         return $cip;
 22     }
 23     
 24 
 25     $local_ip = get_client_ip();        //获取本地ip
 26 
 27     /**
 28      * 本地ip对应城市名称函数
 29      * @param     string $ip
 30      * @author Matthew
 31      * @copyright 2016-07-06
 32      */
 33     function GetIpLookup($ip){  
 34         if(empty($ip)){  
 35             $ip = get_client_ip();  
 36         }  
 37         /*使用新浪的 api 根据ip来查询城市*/
 38         $res = @file_get_contents('http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js&ip='.$ip);  
 39         if(empty($res)){
 40             return false; 
 41         }  
 42         $jsonMatches = array(); 
 43 
 44         // . 匹配除"\n"以外的任何单个字符
 45         // + 匹配前面的子表达式一次或多次
 46         // ? 匹配前面的子表达式 0次或 1次 
 47         //var_dump($res);
 48         /*从得到的数据中取出json格式部分,并将其赋值给数组 $jsonMatches[0]*/
 49         preg_match('#\{.+?\}#', $res, $jsonMatches);  
 50 
 51         if(!isset($jsonMatches[0])){ 
 52             return false; 
 53         }
 54 
 55         /*接受一个 JSON 格式的字符串并且把它转换为 PHP 变量,true表示返回 Array*/
 56         $json = json_decode($jsonMatches[0], true);
 57         /*
 58         if(isset($json['ret']) && $json['ret'] == 1){  
 59             //$json['ip'] = $ip;  
 60             unset($json['ret']);  
 61         }else{  
 62             return false;  
 63         }  
 64         */
 65         return $json;  
 66     }  
 67 
 68     $location = GetIpLookup($local_ip);
 69     //echo "<pre>";
 70     //print_r($location);
 71     $city = $location["city"];
 72     //echo "</pre>";
 73 
 74     /*初始化一个cURL会话*/
 75     /*根据地址获取天气api来源:http://apistore.baidu.com/apiworks/servicedetail/478.html*/
 76     $ch = curl_init();
 77     $url = "http://apis.baidu.com/heweather/weather/free?city=$city";
 78     $header = array(
 79         //需填写手机号获取
 80         'apikey: c4b3604b699cf6f8acab3f08ac769cb3',
 81     );
 82     
 83     // 添加apikey到header
 84     // CURLOPT_HTTPHEADER   应传入数组类型
 85     curl_setopt($ch, CURLOPT_HTTPHEADER  , $header);
 86 
 87     //CURLOPT_RETURNTRANSFER    将 curl_exec() 获取的信息以文件流的形式返回,而不是直接输出。
 88     //第三个参数应传入 bool类型
 89     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
 90 
 91     // 执行HTTP请求
 92     // CURLOPT_URL   需要获取的URL地址,也可以在 curl_init() 函数中设置。 
 93     // 第三个参数应传入字符串类型
 94     curl_setopt($ch , CURLOPT_URL , $url);
 95 
 96     //执行给定的cURL会话
 97     $res = curl_exec($ch);
 98 
 99     $arr = json_decode($res,true);
100     echo "<pre  style='font-size:12px;margin:13px 5px 5px 25px;font-family: Arial, Helvetica, sans-serif;'>";
101     echo $arr["HeWeather data service 3.0"][0]["basic"]["city"]."   ".$arr["HeWeather data service 3.0"][0]["basic"]["cnty"];
102     echo "<br>";
103     echo "白天:".$arr["HeWeather data service 3.0"][0]["daily_forecast"][0]["cond"]["txt_d"]."<br>";
104     echo "夜晚:".$arr["HeWeather data service 3.0"][0]["daily_forecast"][0]["cond"]["txt_n"]."<br>";
105     echo "气温:".$arr["HeWeather data service 3.0"][0]["daily_forecast"][0]["tmp"]["min"]."℃ ~ ".$arr["HeWeather data service 3.0"][0]["daily_forecast"][0]["tmp"]["max"]."℃<br>";
106     echo "更新时间:".$arr["HeWeather data service 3.0"][0]["basic"]["update"]["loc"]."<br>";
107     echo "</pre>";
108
109 ?>

总结:1.使用新浪的api,根据ip查询所在地的城市名称

   2.根据查询所得的城市名称,使用百度的api来查询对应城市的天气,需要用手机领一个apikey

     3.这儿只是简单的显示了几个天气数据,可以通过对应的键值获取其他数据

posted @ 2016-07-07 21:15  MatthewBlog  阅读(168)  评论(0)    收藏  举报

页脚