简单实现自动天气推送

每天早上出门前(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'