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.这儿只是简单的显示了几个天气数据,可以通过对应的键值获取其他数据

浙公网安备 33010602011771号