微信公众号+python+新浪SAE实现实时天气预报功能

本文主要谈谈如何做一个具有天气预报功能的公众号。

话不多说先上图,实现的功能如下图所示:

点击微信右下角的“+”号,分享任意一个位置信息,公众号后台自动回复当地的天气情况。这里的天气预报是用python从中国天气网抓取的雷达数据。有没有更精准的数据源呢,当然有啦,但这不是本文的重点,这里我就不详说了。

用到的工具:新浪SAE + 微信公众平台 + python2.7(新浪SAE目前仅支持2.7版本)

由于本文的重点不是使用python搭建微信公众平台,网上已经有很多不错的教程,为了避免重复造轮子,我在这里贴一个不错的教程,很适合新手入门:

使用python一步一步搭建微信公众平台

在开始之前我们有必要了解一下微信公众平台的开发者文档,查阅可知,微信的消息是以XML(可扩展标记语言)的形式传输的,其中地理位置信息的具体格式是:

相应的参数意义如下:

因此天气预报功能的实现流程为:

在读取经纬度时涉及到一个问题,由于百度地图与谷歌地图采用的是不同协议的坐标,腾讯、高德地图与谷歌地图采用的是同种协议。而微信的经纬度信息是腾讯地图给出的,在网站上查看中国天气网发送的url请求可知,中国天气网采用的是百度地图,因此在查询之前需要对经纬度信息做一次转换。具体的转换方式请查看:

百度经纬度和谷歌经纬度转换

如何根据经纬度查询当地天气信息?

1.用chrome浏览器进入中国天气网临近预报页面

2.按F12打开控制台,点击地图上任意一个点

3.查看Network,发现有一条萌萌哒url

4.点击url查看请求和响应信息,发现响应的是一段Json信息,猜想可能是天气信息;

5.打开该url,发现一段萌萌哒数据

红色部分就是我们想要的东西了

6.接下来要做的就是利用Python抓取这段数据了,由于这段数据并不是严格的Json数据(可能是为了防爬虫而采取的简单措施吧),所以需要先截取出Json部分。不过相对还是比较简单的。

下面就直接上代码啦,此处默认读者已经会使用web.py搭建微信公众号了。代码里面有彩蛋请自行查阅~这里不方便宣传,因为偷偷用了人家的url…

  1 # -*- coding: utf-8 -*-
  2 import hashlib
  3 import web
  4 import lxml
  5 import time
  6 import os
  7 import urllib2,json
  8 import urllib
  9 import re
 10 import random
 11 import hashlib
 12 import cookielib
 13 import requests
 14 import math
 15 import re
 16 import sys
 17 reload(sys)
 18 sys.setdefaultencoding(‘utf8‘)
 19 from bs4 import BeautifulSoup
 20 from urllib import urlencode
 21 from lxml import etree
 22 from smtplib import SMTP_SSL
 23 from email.header import Header
 24 from email.mime.text import MIMEText
 25
 26 #session = requests.Session()
 27 #s.config[‘keep_alivesession = requests.Session()
 28 class WeixinInterface:
 29
 30     def __init__(self):
 31         self.app_root = os.path.dirname(__file__)
 32         self.templates_root = os.path.join(self.app_root, ‘templates‘)
 33         self.render = web.template.render(self.templates_root)
 34
 35     def GET(self):
 36         #获取输入参数
 37         data = web.input()
 38         signature=data.signature
 39         timestamp=data.timestamp
 40         nonce=data.nonce
 41         echostr = data.echostr
 42         #自己的token
 43         token="" #这里改写你在微信公众平台里输入的token
 44         #字典序排序
 45         list=[token,timestamp,nonce]
 46         list.sort()
 47         sha1=hashlib.sha1()
 48         map(sha1.update,list)
 49         hashcode=sha1.hexdigest()
 50         #sha1加密算法
 51
 52         #如果是来自微信的请求,则回复echostr
 53         if hashcode == signature:
 54             return echostr
 55
 56     def POST(self):
 57         str_xml = web.data() #获得post来的数据
 58         xml = etree.fromstring(str_xml)#进行XML解析
 59         msgType=xml.find("MsgType").text
 60         fromUser=xml.find("FromUserName").text
 61         toUser=xml.find("ToUserName").text
 62         if msgType == ‘location‘:
 63             wdu = xml.find("Location_X").text
 64             wdu = float(wdu)
 65
 66             jdu = xml.find("Location_Y").text
 67             jdu = float(jdu)
 68             #转换为百度标准
 69             x_pi = 3.14159265358979324 * 3000.0 / 180.0
 70             x = jdu
 71             y = wdu
 72             z = math.sqrt(x * x + y * y) + 0.00002 * math.sin(y * x_pi)
 73             theta = math.atan2(y, x) + 0.000003 * math.cos(x * x_pi)
 74             jdu = z * math.cos(theta) + 0.0065
 75             wdu = z * math.sin(theta) + 0.006
 76             wdu = str(wdu)
 77             jdu = str(jdu)
 78             Lmesag = u"您的位置:"
 79             Lmesag += xml.find("Label").text
 80             myres = requests.get(‘http://d3.weather.com.cn/webgis_rain_new/webgis/ele?lat=‘+ wdu + ‘&lon=‘+ jdu + ‘&callback=fc5m&_=1470809429568‘)
 81             if myres.status_code != 200:
 82                 if myres.status_code == 500:
 83                     status_error = u"服务器未响应,请稍后再试~"
 84                     return self.render.reply_text(fromUser,toUser,int(time.time()), status_error)
 85             myres.encoding = ‘utf-8‘
 86             text = myres.text
 87             text = text[9:-2]
 88             data = json.loads(text)
 89             pretime = data[‘time‘]
 90             msg = data[‘msg‘]
 91             pretime1 = u"查询时间:"
 92             pretime1 += pretime
 93             msg1 = "天气预报:\n中国天气网雷达数据(雷达外推数据,仅供参考):"
 94             msg1 += msg
 95             Lmesag += ‘\n‘
 96             Lmesag += pretime1
 97             Lmesag += ‘\n‘
 98             Lmesag += msg1
 99             cyres = requests.get(‘http://www.caiyunapp.com/fcgi-bin/v1/api.py?lonlat=‘ + jdu + ‘,‘ + wdu + ‘&format=json&product=minutes_prec&token=96Ly7wgKGq6FhllM&random=0.8600497214532319‘)
100             cyres.encoding = "utf-8"
101             cyData = json.loads(cyres.text)
102             cymsg = u"\n\n彩云天气数据(准确率较高):"
103             #cymsg += cyData[‘summary‘]
104             cytemp = u"\n温度:"
105             cytemp += str(cyData[‘temp‘])
106             cymsg += cytemp
107             cymsg +=u"\n未来1小时天气预报:"
108             cymsg += cyData[‘summary‘]
109             Lmesag += cymsg
110             return self.render.reply_text(fromUser,toUser,int(time.time()), Lmesag)
111         else:
112             pass
时间: 2024-10-13 17:30:39

微信公众号+python+新浪SAE实现实时天气预报功能的相关文章

[python]通过微信公众号“Python程序员”,编写python代码

今天发现微信公众号中,居然可以编写python代码,很是惊喜,觉得蛮有趣的. 步骤如下: 1.关注微信公众号“Python程序员” 2.关注成功后,点击右下角的“潘多拉”->"Python终端“->"阅读原文”. 3.Python开发页面被打开,在下面的输入框内,输入python代码,点击确认即可. 可以用来练习python,是不是很有趣呢?

微信公众号如何挖掘新粉丝

微信公众号如何挖掘新粉丝 安阳师范学院互联网+应用技术学院网络营销方向讲师 王明珠 如何挖掘到新的粉丝,吸引更多粉丝关注你,基本思路,不管你在做什么工作,都需要有一个基本的思路去贯穿全程.首先你要明确你的用户群体是什么年龄段,什么阶层,以及在什么样的社区论坛能够挖掘到他们的踪迹:第二,运营过程中的实际工作,这个我们下面讲:第三,用户资料的收集整理分类:最后,日常的用户维护工作.(1)提供干货.有价值的资源.好处你的平台能够给用户提供的某种便利.有价值的资源或者好处.比如提供行业内相关的新闻或者干

微信开发01-申请新浪SAE

为什么开发微信要选择新浪SAE呢,其实新浪SAE有很多的局限性,完全没有自己配置服务器环境来的灵活.那为什么还要用,因为便宜,是的很便宜,虽然现在创建应用不在免费了,每天收取10个豆,1元钱是100豆,也就是说一个月只花3块钱. 但是使用memcache缓存好像是要收费的.使用mysql共享版是免费的. 使用SAE做开发首先需要到SAE上创建一个应用.没有sae的童鞋请戳这里.开通新浪SAE 使用微博登录SAE之会进入到个人主界面.未完成实名认证的请完成实名认证.不然创建的应用在访问时会加上SA

开发微信公众平台--新建新浪云sae部署服务器

创建新浪云计算应用 申请账号 我们使用SAE新浪云计算平台作为服务器资源,并且申请PHP环境+MySQL数据库作为程序运行环境. 申请地址:百度搜sae ,使用新浪微博账号可以直接登录SAE,登录后SAE将赠送500个免费云豆.认证开发者送2000豆 够用很久的了 创建新应用 http://www.cnblogs.com/txw1958/p/wechat-tutorial.html 登录后点击顶部[我的首页] 点击下侧的创建新应用,这时会弹出提示, 禁止放置违法违规内容,点击继续创建,弹出如下窗

开发微信公众平台--新建新浪云sae部署server

创建新浪云计算应用 申请账号 我们使用SAE新浪云计算平台作为server资源.而且申请PHP环境+MySQL数据库作为程序执行环境. 申请地址:百度搜sae ,使用新浪微博账号能够直接登录SAE,登录后SAE将赠送500个免费云豆.认证开发人员送2000豆 够用非常久的了 创建新应用 http://www.cnblogs.com/txw1958/p/wechat-tutorial.html 登录后点击顶部[我的首页] 点击下側的创建新应用,这时会弹出提示. 禁止放置违法违规内容.点击继续创建.

Python爬虫实现的微信公众号文章下载器

平时爱逛知乎,收藏了不少别人推荐的数据分析.机器学习相关的微信公众号(这里就不列举了,以免硬广嫌疑).但是在手机微信上一页页的翻阅历史文章浏览,很不方便,电脑端微信也不方便. 所以我就想有什么方法能否将这些公众号文章下载下来.这样的话,看起来也方便.但是网上的方法要么太复杂(对于我这个爬虫入门新手来说),要么付费. 但我的需求其实却很简单--"方便的查找 / 检索 / 浏览相关公众号的任意文章",所以,一番学习检索后,上手做了一个小工具(打包成可执行文件了),虽然方法和代码相当简单,但

微信公众号问题:{"errcode":40125,"errmsg":"invalid appsecret, view more at http:\/\/t.cn\/LOEdzVq, hints: [ req_id: kL8J90219sg58 ]"}

在调试微信公众号授权登录时遇到了这个错误,着实是心烦了半天,公众号相关开发以前是经常做的,很久没有接触了,而且遇到了这么个以前没遇到的问题. {"errcode":40125,"errmsg":"invalid appsecret, view more at http:\/\/t.cn\/LOEdzVq, hints: [ req_id: kL8J90219sg58 ]"} 代码是直接拷贝的以前的代码,按道理说应该不会有任何错误的,根据公众号的不

利用微信公众号快速推广APP应用

在APP推广工作中,新媒体起到了至关重要的作用.新媒体对于信息传播的快速.高效.多元化,可以很好地将APP平台的功能.服务.资讯.活动等内容传递给用户群体,并且在用户中汇聚成完整的品牌内涵. 新媒体也即用数字化表现的媒体形式,不但包括我们熟知的移动端媒体.网络媒体等,还包括所有数字化的传统媒体,如数字电视,数字报刊杂志等.新媒体倡导"万事万物皆媒体",只要是运用数字化方式表现的所有媒介,都可以成为新媒体.在新媒体当中,目前应用最广泛,用户基数最大的产品就是微信公众号. 微信公众平台最大

微信公众号客服系统(助手)怎么样?

微信公众号作为企业品牌宣传的窗口,一直扮演着一个非常重要的角色,尤其是当下全民使用微信的时代,公众号扎根于微信这个巨大客户流量池内拥有数之不尽的客户资源.如何利用好成为了关键. 很多商家也是看重这一点,纷纷开通了自己的企业公众号,但是在运营公众号的过程中才发现麻烦不断,比如某一时段用户咨询量很大,客服人员就不能第一时间回复,从而出现延迟,漏接的现象,假如这些用户都是通过精准渠道进来的,这样其实会损失很多潜在客户.但是如果增加客服人员数量,平时咨询量又没那么大,很容易造成人员的浪费.那这个问题该如