现在的位置: 首页 > 综合 > 正文

【微信易信公众平台开发】天气查询功能

2019年06月09日 ⁄ 综合 ⁄ 共 1996字 ⁄ 字号 评论关闭

本系列文章均为A2BGeek原创,转载务必在明显处注明:
转载自A2BGeek的【微信易信公众平台开发】系列,原文链接:http://blog.csdn.net/a2bgeek/article/details/23514167

我的个人博客站点已经开通,会有技术分享和其他一些有意思的东西,希望读者能去访问一下,网址是http://a2bgeek.me

好久不更新了,今天为大家带来天气查询功能的开发。大家可以关注一下我的易信公众账号——A2BGeek's XX

天气的查询我还真没找到神马好用的API,唯一找到的一个http://smart.weather.com.cn/wzfw/smart/weatherapi.shtml 还需要申请,所以我决定自己从网上抓取数据,站点就选择中国天气网,因为中国天气网的天气url是有规律可以找的,规律就是“http://www.weather.com.cn/weather/XXX.shtml”,XXX是某地的代码。关于如何抓取数据以及某地代码的获取可以先看我的这篇文章http://a2bgeek.me/blog/2014/04/09/beautifulsoupshi-zhan.html/#.U0iiLaau5ZI

下面我们来讲服务器代码的编写,分为两个部分,特定地点的天气查询和全国各地的天气查询。

特定地点的天气查询

作为兰大学子,我在我的公众账号里面有一个子菜单专门安排了兰州天气的查询,虽然兰州最近的生活用水污染了,虽然兰州的经济一直不发达,但是我依然爱着这个城市。

这部分的代码如下:

if msg["EventKey"] == "query_lzweather":
    articles = []
    i = 0
    for item in self.query_weather(u"兰州"):
        article = (" ".join([item["date"], item["weather"], item["high"], item["low"]]) if "high" in item else " ".join([item["date"], item["weather"], item["low"]]), 
item["imgurl"] if i != 0 else "http://a2bgeekyixin.qiniudn.com/image/weathercover.jpg")
        i = i + 1
        articles.append(article)
    rebody = TextWithPicForWeather(msg["FromUserName"], msg["ToUserName"], articles).return_xml()
    self.write(rebody)

熟悉python web开发的同学一看就知道我用的是tornado框架,这里返回的是图文消息,具体的效果可以去我的易信公众账号——A2BGeek's XX看一下。

全国各地的天气查询

这里的全国天气查询怎么做呢?由于公众账号这种IO交互方式的限制,我们只能在服务器端想想办法,我觉得为每个用户维护一个session是比较好的做法。当用户输入了特定的关键词后就认为用户进入了一个情景模式,在这个情景模式下的输入和普通的输入返回的结果是不一样的,当用户输入不符合该情景模式的内容或者session过期,那么就退出了这个情景模式。其实说的简单一点就是用户的输入是有上下文关系的。

我为什么一直用session这个名词?因为我上面描述的其实和session的确很像,类似于url重写的那种session,因为微信或者易信客户端不会像浏览器那样有一个cookie,但是它有userid,有这个userid我就能在服务器端区分用户了,从而为每个用户维护一个session。

那么如何维护这个session呢?这里就随意了,你可以用文件,可以用数据库,随意吧,下面我把代码的逻辑贴出来:

if msg["MsgType"] == "text":
    #首先要判断这个用户是否由一个session,如果没有,那么就是普通输入,如果有,那么就是带上下文关系的输入。
elif msg["MsgType"] == "event":
    if msg["EventKey"] == "query_weather":
        #这里设置session,session的结构基本上就是一个键值对,key是userid,value是一个表明session类型的一个值,因为可能还有全国空气质量查询这样的功能。
        rebody = Text(msg["FromUserName"], msg["ToUserName"], u"进入全国天气查询模式,请输入地名直接查询当地天气。").return_xml()
        self.write(rebody)

好了今天就到这里,欢迎拍砖,欢迎大家访问我的主页http://a2bgeek.me还有关注我的易信公众账号——A2BGeek's XX

抱歉!评论已关闭.