打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
微信公众平台开发(五) 天气预报功能开发

 [导读] 一、简介前面几篇文章对微信公众平台的开通及简单使用做了简单的介绍,但都没有涉及到实际使用中的问题,例如天气查询,公交查询,快递查询等。接下来的几篇文章将对实际生活中会经常使用到的一些功能进行开发讲

一、简介

前面几篇文章对微信公众平台的开通及简单使用做了简单的介绍,但都没有涉及到实际使用中的问题,例如天气查询,公交查询,快递查询等。接下来的几篇文章将对实际生活中会经常使用到的一些功能进行开发讲解,以供读者参考。

这一篇文章将对大家每天都会关心的天气查询进行开发,例如,用户发送消息“苏州天气”,则会返回苏州实时天气状况,以及未来两天甚至未来五天的天气状况。

二、思路分析

首先要对用户发送过来的消息进行判断,判断消息里是否含有“天气”关键字,如果含有,则需要继续提取地区信息,然后再通过中国天气网(http://www.sm136.com.cn)提供的开放API进行相关地区天气查询。

三、关键字判断与地区读取

用户发送过来查询天气的消息的格式是固定好的,即 “地区+天气”,所以首先截取后两个字,判断是否为“天气” 关键字。

使用php函数 mb_substr() 截取,关于该函数的用法:

view sourceprint?

01.

mb_substr 获取字符串的部分

02.

 

03.

  stringmb_substr ( string $str , int $start [, int $length [, string $encoding ]] )

04.

 

05.

说明:根据字符数执行一个多字节安全的 substr() 操作。 位置是从 str 的开始位置进行计数。 第一个字符的位置是 0。第二个字符的位置是 1,以此类推。

06.

 

07.

参数:

08.

str

09.

从该 string 中提取子字符串。

10.

 

11.

start

12.

str 中要使用的第一个字符的位置。

13.

正数 -> 从字符串开头指定位置开始;

14.

负数 -> 从字符串结尾指定位置开始;

15.

 

16.

length

17.

str 中要使用的最大字符数。

18.

正数 -> start 处开始最多包括 length 个字符;

19.

负数 ->string 末尾处的 length 个字符将会被漏掉(若 start 是负数则从字符串开头算起)。

20.

 

21.

encoding

22.

encoding 参数为字符编码。如果省略,则使用内部字符编码。

23.

 

24.

返回值:

25.

mb_substr() 函数根据 start length 参数返回 str 中指定的部分。

$str = mb_substr($keyword,-2,2,"UTF-8");

从消息的结尾数第二个字符开始截取,截取两个字符,然后加以判断是否为“天气” 关键字。

下面进行地区提取,还是使用mb_substr() 函数。

$str_key =mb_substr($keyword,0,-2,"UTF-8");

从消息的开头开始,截掉末尾的两个字符(天气),既得地区关键字。

然后进行判断,继而调用函数查询天气数据。

if($str == '天气' && !empty($str_key))

{

    //调用函数查询天气数据

}

四、调用 weather()函数查询

我们这里调用的是中国国家气象局提供的天气预报API接口,接口地址:http://m.weather.com.cn/data/101190401.html

URL中的数字指代城市的编号101190401(苏州),其他城市对应关系将在下面提供。

该接口返回信息比较全面,也是以json格式提供,格式如下:

view sourceprint?

01.

{"weatherinfo":{

02.

//基本信息;

03.

"city":"苏州","city_en":"suzhou",

04.

"date_y":"201379","date":"","week":"星期二","fchh":"18","cityid":"101190401",

05.

//摄氏温度

06.

"temp1":"30~37",

07.

"temp2":"30~37",

08.

"temp3":"29~35",

09.

"temp4":"27~33",

10.

"temp5":"27~31",

11.

"temp6":"27~35",

12.

//华氏温度;

13.

"tempF1":"86~98.6",

14.

"tempF2":"86~98.6",

15.

"tempF3":"84.2~95",

16.

"tempF4":"80.6~91.4",

17.

"tempF5":"80.6~87.8",

18.

"tempF6":"80.6~95",

19.

//天气描述;

20.

"weather1":"晴转多云",

21.

"weather2":"晴转多云",

22.

"weather3":"晴转多云",

23.

"weather4":"多云",

24.

"weather5":"雷阵雨转中雨",

25.

"weather6":"雷阵雨转多云",

26.

//天气描述图片序号

27.

"img1":"0",

28.

"img2":"1",

29.

"img3":"0",

30.

"img4":"1",

31.

"img5":"0",

32.

"img6":"1",

33.

"img7":"1",

34.

"img8":"99",

35.

"img9":"4",

36.

"img10":"8",

37.

"img11":"4",

38.

"img12":"1",

39.

//图片名称;

40.

"img_single":"1",

41.

"img_title1":"",

42.

"img_title2":"多云",

43.

"img_title3":"",

44.

"img_title4":"多云",

45.

"img_title5":"",

46.

"img_title6":"多云",

47.

"img_title7":"多云",

48.

"img_title8":"多云",

49.

"img_title9":"雷阵雨",

50.

"img_title10":"中雨",

51.

"img_title11":"雷阵雨",

52.

"img_title12":"多云",

53.

"img_title_single":"多云",

54.

//风速描述

55.

"wind1":"西南风3-4",

56.

"wind2":"西南风3-4",

57.

"wind3":"东南风3-4",

58.

"wind4":"东南风3-4级转4-5",

59.

"wind5":"东南风4-5级转西南风3-4",

60.

"wind6":"西南风3-4级转4-5",

61.

//风速级别描述

62.

"fx1":"西南风",

63.

"fx2":"西南风",

64.

"fl1":"3-4",

65.

"fl2":"3-4",

66.

"fl3":"3-4",

67.

"fl4":"3-4级转4-5",

68.

"fl5":"4-5级转3-4",

69.

"fl6":"3-4级转4-5",

70.

//今日穿衣指数;

71.

"index":"炎热",

72.

"index_d":"天气炎热,建议着短衫、短裙、短裤、薄型T恤衫等清凉夏季服装。",

73.

//48小时穿衣指数

74.

"index48":"炎热",

75.

"index48_d":"天气炎热,建议着短衫、短裙、短裤、薄型T恤衫等清凉夏季服装。",

76.

//紫外线及48小时紫外线

77.

"index_uv":"中等",

78.

"index48_uv":"中等",

79.

//洗车指数

80.

"index_xc":"适宜",

81.

//旅游指数

82.

"index_tr":"较不宜",

83.

//舒适指数

84.

"index_co":"很不舒适",

85.

"st1":"36",

86.

"st2":"28",

87.

"st3":"36",

88.

"st4":"28",

89.

"st5":"34",

90.

"st6":"27",

91.

//晨练指数

92.

"index_cl":"较适宜",

93.

//晾晒指数

94.

"index_ls":"适宜",

95.

//过敏指数

96.

"index_ag":"不易发"}}

我们可以通过解析JSON,获取相应城市的天气数据。

weather() 函数如下:

view sourceprint?

01.

private function weather($n){

02.

include("weather_cityId.php");

03.

$c_name=$weather_cityId[$n];

04.

if(!empty($c_name)){

05.

$json=file_get_contents("http://m.weather.com.cn/data/".$c_name.".html");

06.

return json_decode($json);

07.

} else {

08.

return null;

09.

}

10.

}

这里include 了一个城市对应关系文件 weather_cityId.php,格式如下:

view sourceprint?

1.

<?php

2.

$weather_cityId = array("北京"=>"101010100","上海"=>"101020100","苏州"=>"101190401");

3.

?>

根据传入的城市名,得到城市代码,如果不为空,则调用中国天气网的API进行查询,返回json格式的数据,然后进行解析并返回数据,如果为空,则返回null值。

五、组织回复消息形式

判断返回数据是否为空,若为空,则 $contentStr = "抱歉,没有查到\"".$str_key."\"的天气信息!";

若返回数据不为空,则:

说明:$contentStr = "".$data->weatherinfo->city."天气预报】\n".$data->weatherinfo->date_y."".$data->weatherinfo->fchh."时发布"."\n\n实时天气\n".$data->weatherinfo->weather1."".$data->weatherinfo->temp1."".$data->weatherinfo->wind1."\n\n温馨提示:".$data->weatherinfo->index_d."\n\n明天\n".$data->weatherinfo->weather2."".$data->weatherinfo->temp2."".$data->weatherinfo->wind2."\n\n后天\n".$data->weatherinfo->weather3."".$data->weatherinfo->temp3."".$data->weatherinfo->wind3;

$data->weatherinfo->city  //获取城市名,这里为苏州

$data->weatherinfo->date_y  //获取日期,这里为201379

$data->weatherinfo->fchh  //数据发布时间

$data->weatherinfo->weather1  //实时天气

$data->weatherinfo->temp1  //实时温度

$data->weatherinfo->wind1  //实时风向和风速

$data->weatherinfo->index_d  //穿衣指数

weather2, temp2, wind2 分别代表了明天的天气,温度和风向风速,其他的以此类推。

\n  //表示换行

六、测试

\

七、完整代码

view sourceprint?

001.

<?php

002.

/**

003.

* wechat php test

004.

*/

005.

 

006.

//define your token

007.

define("TOKEN","zhuojin");

008.

$wechatObj = new wechatCallbackapiTest();

009.

$wechatObj->responseMsg();

010.

//$wechatObj->valid();

011.

 

012.

class wechatCallbackapiTest

013.

{

014.

/*public function valid()

015.

{

016.

$echoStr = $_GET["echostr"];

017.

 

018.

//valid signature , option

019.

if($this->checkSignature()){

020.

echo $echoStr;

021.

exit;

022.

}

023.

}*/

024.

 

025.

public function responseMsg()

026.

{

027.

//get post data, May be due to thedifferent environments

028.

$postStr =$GLOBALS["HTTP_RAW_POST_DATA"];

029.

 

030.

//extract post data

031.

if (!emptyempty($postStr)){

032.

 

033.

$postObj = simplexml_load_string($postStr,'SimpleXMLElement', LIBXML_NOCDATA);

034.

$RX_TYPE = trim($postObj->MsgType);

035.

 

036.

switch($RX_TYPE)

037.

{

038.

case "text":

039.

$resultStr =$this->handleText($postObj);

040.

break;

041.

case "event":

042.

$resultStr =$this->handleEvent($postObj);

043.

break;

044.

default:

045.

$resultStr = "Unknow msg type:".$RX_TYPE;

046.

break;

047.

}

048.

echo $resultStr;

049.

}else {

050.

echo "";

051.

exit;

052.

}

053.

}

054.

 

055.

public function handleText($postObj)

056.

{

057.

$fromUsername = $postObj->FromUserName;

058.

$toUsername = $postObj->ToUserName;

059.

$keyword = trim($postObj->Content);

060.

$time = time();

061.

$textTpl = "<xml>

062.

<ToUserName><![CDATA[%s]]></ToUserName>

063.

<FromUserName><![CDATA[%s]]></FromUserName>

064.

<CreateTime>%s</CreateTime>

065.

<MsgType><![CDATA[%s]]></MsgType>

066.

<Content><![CDATA[%s]]></Content>

067.

<FuncFlag>0</FuncFlag>

068.

</xml>";           

069.

if(!emptyempty( $keyword ))

070.

{

071.

$msgType = "text";

072.

 

073.

//天气

074.

$str =mb_substr($keyword,-2,2,"UTF-8");

075.

$str_key =mb_substr($keyword,0,-2,"UTF-8");

076.

if($str == '天气' && !emptyempty($str_key)){

077.

$data = $this->weather($str_key);

078.

if(emptyempty($data->weatherinfo)){

079.

$contentStr = "抱歉,没有查到\"".$str_key."\"的天气信息!";

080.

} else {

081.

$contentStr = "".$data->weatherinfo->city."天气预报】\n".$data->weatherinfo->date_y."".$data->weatherinfo->fchh."时发布"."\n\n实时天气\n".$data->weatherinfo->weather1."".$data->weatherinfo->temp1."".$data->weatherinfo->wind1."\n\n温馨提示:".$data->weatherinfo->index_d."\n\n明天\n".$data->weatherinfo->weather2."".$data->weatherinfo->temp2."".$data->weatherinfo->wind2."\n\n后天\n".$data->weatherinfo->weather3."".$data->weatherinfo->temp3."".$data->weatherinfo->wind3;

082.

}

083.

} else {

084.

$contentStr = "感谢您关注【卓锦苏州】"."\n"."微信号:zhuojinsz"."\n"."卓越锦绣,名城苏州,我们为您提供苏州本地生活指南,苏州相关信息查询,做最好的苏州微信平台。"."\n"."目前平台功能如下:"."\n"."1 查天气,如输入:苏州天气"."\n"."2 查公交,如输入:苏州公交178"."\n"."3 翻译,如输入:翻译I love you"."\n"."4 苏州信息查询,如输入:苏州观前街"."\n"."更多内容,敬请期待...";

085.

}

086.

$resultStr = sprintf($textTpl,$fromUsername, $toUsername, $time, $msgType, $contentStr);

087.

echo $resultStr;

088.

}else{

089.

echo "Input something...";

090.

}

091.

}

092.

 

093.

public function handleEvent($object)

094.

{

095.

$contentStr = "";

096.

switch ($object->Event)

097.

{

098.

case "subscribe":

099.

$contentStr = "感谢您关注【卓锦苏州】"."\n"."微信号:zhuojinsz"."\n"."卓越锦绣,名城苏州,我们为您提供苏州本地生活指南,苏州相关信息查询,做最好的苏州微信平台。"."\n"."目前平台功能如下:"."\n"."1 查天气,如输入:苏州天气"."\n"."2 查公交,如输入:苏州公交178"."\n"."3 翻译,如输入:翻译I love you"."\n"."4 苏州信息查询,如输入:苏州观前街"."\n"."更多内容,敬请期待...";

100.

break;

101.

default :

102.

$contentStr = "Unknow Event:".$object->Event;

103.

break;

104.

}

105.

$resultStr =$this->responseText($object, $contentStr);

106.

return $resultStr;

107.

}

108.

 

109.

public function responseText($object,$content, $flag=0)

110.

{

111.

$textTpl = "<xml>

112.

<ToUserName><![CDATA[%s]]></ToUserName>

113.

<FromUserName><![CDATA[%s]]></FromUserName>

114.

<CreateTime>%s</CreateTime>

115.

<MsgType><![CDATA[text]]></MsgType>

116.

<Content><![CDATA[%s]]></Content>

117.

<FuncFlag>%d</FuncFlag>

118.

</xml>";

119.

$resultStr = sprintf($textTpl,$object->FromUserName, $object->ToUserName, time(), $content, $flag);

120.

return $resultStr;

121.

}

122.

 

123.

private function weather($n){

124.

include("weather_cityId.php");

125.

$c_name=$weather_cityId[$n];

126.

if(!emptyempty($c_name)){

127.

$json=file_get_contents("http://m.weather.com.cn/data/".$c_name.".html");

128.

return json_decode($json);

129.

} else {

130.

return null;

131.

}

132.

}

133.

 

134.

private function checkSignature()

135.

{

136.

$signature = $_GET["signature"];

137.

$timestamp = $_GET["timestamp"];

138.

$nonce = $_GET["nonce"];  

139.

 

140.

$token = TOKEN;

141.

$tmpArr = array($token, $timestamp,$nonce);

142.

sort($tmpArr);

143.

$tmpStr = implode( $tmpArr );

144.

$tmpStr = sha1( $tmpStr );

145.

 

146.

if( $tmpStr == $signature ){

147.

return true;

148.

}else{

149.

return false;

150.

}

151.

}

152.

}

153.

 

154.

?>


本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
【Python 第45课】 查天气(3)20150120045
使用SAE分词,实现微信智能语音查询
微信公众平台开发(四) 简单回复功能开发
微信公众平台开发(十一) 功能整合
Javascript面试笔试题(考试时间90分钟)前端开发的可以试一下!
IOS中UILabel文字顶部对齐,通过分类实现,最新的没有过期的!
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服