微信公众平台天气预报功能开发


  本文标签:微信公众平台,天气预报

本来是想自己直接从中国天气网获取信息并处理,后来发现处理起来太麻烦,而且要获取所有城市的城市编码,再有就是!不支持国外天气!!(我们学校有很多毕业生在国外上学,所以我考虑还是做出支持国外天气的版本)

因此考虑直接调用别人的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]."\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类型的数据包 。将数据包信息转成数组格式,对应的回复微信用户即可 。国外的天气没有当天天气的具体说明,所以最后做了一点小修改 。