本来是想自己直接从中国天气网获取信息并处理,后来发现处理起来太麻烦,而且要获取所有城市的城市编码,再有就是!不支持国外天气!!(我们学校有很多毕业生在国外上学,所以我考虑还是做出支持国外天气的版本)
因此考虑直接调用别人的API,一开始选用了方倍工作室已经做好的接口(无奈也没有国外)。直到有一天返回北京天气温度是零下的时候(当时天热到不敢出门)。。。换!换!换!
后来终于发现最靠谱的接口----百度的天气API。
废话少说,首先大家要上 百度地图API申请一个专用key(大概一分钟就搞定了,很方便)
代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
//图文信息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代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
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' ]. "\n" . "【" . $contentStr [ 'results' ][0][ 'index' ][0][ 'title' ]. "】" . "(" . $contentStr [ 'results' ][0][ 'index' ][0][ 'zs' ]. ") " . $contentStr [ 'results' ][0][ 'index' ][0][ 'des' ]; //下一行是洗车指数,感觉不对主题还是不要的好。。 //$T[2]['Title']=$T[2]['Title']."\n"."【".$contentStr['results'][0]['index'][1]['title']."】(".$contentStr['results'][0]['index'][1]['zs'].") ".$contentStr['results'][0]['index'][1]['des']; $T [2][ 'Title' ]= $T [2][ 'Title' ]. "\n" . "【" . $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类型的数据包。将数据包信息转成数组格式,对应的回复微信用户即可。国外的天气没有当天天气的具体说明,所以最后做了一点小修改。