简单实现自动天气推送
每天早上出门前(8点)与下午下班前(17:20)分别检查一次天气,
有雨雪就发消息到我手机告诉我带伞。
就是一个这样简单实用的功能。
首先说一下数据源,这里采用weahter.com.cn的数据,够官方了。
数据解析使用的是xml+re手工解析,代码比较简陋,但很实用
推送使用PushOver,对应API请自查。
只有雨雪天才需要给我推送,判断也只是使用了简单的正则。
101010300是北京朝阳的代码。
定时走cron,代码里看不出来,有疑问请留言。
#!/usr/bin/python
# -*- coding: utf8 -*-
# WeatherPush.py
# Author: Jiangmf
import httplib
import urllib
import re
import xml.dom.minidom
# http://www.weather.com.cn/weather1d/101010300.shtml
def catchWeather(code):
weather_url = 'http://www.weather.com.cn/weather1d/' + code + '.shtml'
weather_info = urllib.urlopen( weather_url ).read()
m = re.search(r"<li class='dn on' data-dn='todayT'>(.*?)</li>", weather_info, re.DOTALL)
if(m):
return re.sub(r'[\n\t]', '', m.group())
else:
return weather_info
def getText(e):
rc = []
for node in e.childNodes:
if node.nodeType == node.TEXT_NODE:
rc.append(node.data)
elif node.nodeType == node.ELEMENT_NODE:
if node.hasAttribute('title'):
rc.append(node.getAttribute('title'))
rc.append(getText(node))
return ''.join(rc)
def processWeather(document):
dom = xml.dom.minidom.parseString(document)
text = getText(dom.getElementsByTagName("h1")[0])
ps = dom.getElementsByTagName("p")
text += getText(ps[0])
text += getText(ps[1])
text += getText(ps[2])
return text
def sendWeather(title,message):
conn = httplib.HTTPSConnection("api.pushover.net:443")
coq = urllib.unquote(urllib.urlencode({
"token": "----My Pushover Token Code----",
"user": "-----My Pushover User Code----",
"title": title,
"message": message,
}))
# print coq
conn.request("POST", "/1/messages.json", coq
, {"Content-type": "application/x-www-form-urlencoded"})
conn.getresponse()
if __name__ == "__main__":
message = processWeather(catchWeather('101010300')).replace(u",", '')
if (re.search(u'雨|雪', message)):
sendWeather(u'带伞提醒'.encode('utf8'), message.encode('utf8'))
print 'True'
else:
print 'False'