本来是想自己直接从中国天气网获取信息并处理,后来发现处理起来太麻烦,而且要获取所有城市的城市编码,再有就是!不支持国外天气!!(我们学校有很多毕业生在国外上学,所以我考虑还是做出支持国外天气的版本)
因此考虑直接调用别人的API,一开始选用了方倍工作室已经做好的接口(无奈也没有国外)。直到有一天返回北京天气温度是零下的时候(当时天热到不敢出门)。。。换!换!换!
后来终于发现最靠谱的接口----百度的天气API。
废话少说,首先大家要上 百度地图API申请一个专用key(大概一分钟就搞定了,很方便)
代码如下:
//图文信息2 for 天气【这是微信的图文信息模板】$tqTpl = "<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[%s]]></MsgType><ArticleCount>5</ArticleCount><Articles><item><Title><![CDATA[%s]]></Title><Description><![CDATA[%s]]></Description><PicUrl><![CDATA[%s]]></PicUrl><Url><![CDATA[%s]]></Url></item><item><Title><![CDATA[%s]]></Title><Description><![CDATA[%s]]></Description><PicUrl><![CDATA[%s]]></PicUrl><Url><![CDATA[%s]]></Url></item><item><Title><![CDATA[%s]]></Title><Description><![CDATA[%s]]></Description><PicUrl><![CDATA[%s]]></PicUrl><Url><![CDATA[%s]]></Url></item><item><Title><![CDATA[%s]]></Title><Description><![CDATA[%s]]></Description><PicUrl><![CDATA[%s]]></PicUrl><Url><![CDATA[%s]]></Url></item><item><Title><![CDATA[%s]]></Title><Description><![CDATA[%s]]></Description><PicUrl><![CDATA[%s]]></PicUrl><Url><![CDATA[%s]]></Url></item><item><Title><![CDATA[%s]]></Title><Description><![CDATA[%s]]></Description><PicUrl><![CDATA[%s]]></PicUrl><Url><![CDATA[%s]]></Url></item></Articles></xml> ";//最后发现最多只能看到五个item= =无语。。。
PHP代码
if(substr_count($keyword,"天气")!=0 && $keyword!="天气"){$geshu = substr_count($keyword,"天气"); $t = explode("天气",$keyword);for($i=0;$i<=$geshu;$i++) {if($t[$i]!=""){$city = $t[$i];break;} } $mykey = "【这里换成你的API key】"; $url = "http://api.map.baidu.com/telematics/v3/weather?location=".$city."&output=json&ak=".$mykey; $output = file_get_contents($url); $contentStr = json_decode($output, true);if($contentStr["status"]=="success") {$T[0]["Title"]=$contentStr["date"]." ".$contentStr["results"][0]["currentCity"]."天气";//$T[0]["PicUrl"]="http://zhengwairen-try2.stor.sinaapp.com/xytq.jpg";//$T[0]["Url"]="http://zhengwairen-try2.stor.sinaapp.com/xytq.jpg";//上面两行可以设成你想要的顶部图片if(is_array($contentStr["results"][0]["index"])){$T[2]["Title"]="【pm2.5】".$contentStr["results"][0]["pm25"]."
"."【".$contentStr["results"][0]["index"][0]["title"]."】"."(".$contentStr["results"][0]["index"][0]["zs"].") ".$contentStr["results"][0]["index"][0]["des"];//下一行是洗车指数,感觉不对主题还是不要的好。。//$T[2]["Title"]=$T[2]["Title"]."
"."【".$contentStr["results"][0]["index"][1]["title"]."】(".$contentStr["results"][0]["index"][1]["zs"].") ".$contentStr["results"][0]["index"][1]["des"];$T[2]["Title"]=$T[2]["Title"]."
"."【".$contentStr["results"][0]["index"][2]["title"]."】(".$contentStr["results"][0]["index"][2]["zs"].") ".$contentStr["results"][0]["index"][2]["des"];}else$guowai=1;for($i=1,$aaa=0;$i<=5;$i++){if($i==2 && $guowai!=1) continue;if($guowai==1 && $i==5) continue;$T[$i]["Title"]=$contentStr["results"][0]["weather_data"][$aaa]["date"]." ".$contentStr["results"][0]["weather_data"][$aaa]["temperature"]." ".$contentStr["results"][0]["weather_data"][$aaa]["weather"]." ".$contentStr["results"][0]["weather_data"][$aaa]["wind"];$T[$i]["PicUrl"]=$contentStr["results"][0]["weather_data"][$aaa]["dayPictureUrl"];$T[$i]["Url"]=$contentStr["results"][0]["weather_data"][$aaa]["dayPictureUrl"];$aaa++;}$tianqi = sprintf($tqTpl,$fromUsername,$toUsername,time(),"news",$T[0]["Title"],$T[0]["Description"],$T[0]["PicUrl"],$T[0]["Url"], $T[1]["Title"],$T[1]["Description"],$T[1]["PicUrl"],$T[1]["Url"], $T[2]["Title"],$T[2]["Description"],$T[2]["PicUrl"],$T[2]["Url"], $T[3]["Title"],$T[3]["Description"],$T[3]["PicUrl"],$T[3]["Url"], $T[4]["Title"],$T[4]["Description"],$T[4]["PicUrl"],$T[4]["Url"],$T[5]["Title"],$T[5]["Description"],$T[5]["PicUrl"],$T[5]["Url"]);echo $tianqi; } }效果图如下:

将其中的$mykey变量改成自己的APIkey就行了。另外有一点让我不解的是,我微信用的图文模板明明是6个item,为什么回复实际效果只有5个呢= = 求广大网友帮忙解释
最后附代码说明。用户发送“北京天气”和“天气北京”都是可以的,所以首先做了字符串处理,得到正确的城市名。利用百度地图API给的网址,发出GET请求(其实就是直接访问),获取一个json类型的数据包。将数据包信息转成数组格式,对应的回复微信用户即可。国外的天气没有当天天气的具体说明,所以最后做了一点小修改。