基于Python的天气预报“微博机器人”

好吧,说是机器人太装逼了,其实就是一个通过微博定时发送天气的python脚本。嘻嘻~

先说微博地址@w4vv http://weibo.com/w4vv,取”weather for vivian”之意,欢迎围观。

开发原因

我们知道,先前已经有IFTTT为我们实现了定时的微博天气预报,为啥我还蛋疼地自己写一个呢?(当然不是为了装逼)很直接的原因就是IFTTT实现的是不可编程的静态微博天气推送,也就是,我无法根据天气的情况来发送对应的信息,比如,今天哈尔滨零下30度,IFTTT的微博脚本实现的只是单纯的报告温度,而没有对应的我对薇薇的关怀~

同时,IFTTT的微博接口没有开放到让我能够不在乎我需要@对象昵称的变化,也就是说,只要薇薇哪天一高兴换了一个昵称,我就得手动地去更改脚本,这尼玛对我来说一点都不酷,有木有!!

当然还有个原因是好久没写Python了,我来复习一把,为寒假玩树莓派做准备。

基本思路

  1. 通过微博开放平台获取微博API
  2. 引入天气预报API
  3. 编写Python脚本发送微博
  4. 在VPS上设定定时任务

详细代码在这里找到:
https://github.com/jas0ndyq/weibo_robot

获取微博API

首先,你需要安装微博的python集成开发工具,在这里,该SDK的授权说明和API调用方式可以在这里找到。
然后,你得通过微博账号登陆到微博开放平台,创建应用并获取App SecretApp Key。新手指引请参见这个链接
需要提醒的是,这个脚本是无法通过官方进行发布的,所以,你填写的应用信息无须完整。
然后将你获取的值和你的微博用户名还有密码一并填入这个位置以设置脚本的全局变量

1
2
3
4
5
6
7
#设置全局变量
global api_key, api_secret, callback_url, userid, password
api_key = '**********' # 请在微博开放平台获取
api_secret = '**********' #请在微博开放平台获取
callback_url = 'http://jas0n.me'
userid = 'xxx@xx.com' #微博登陆邮箱
password = '**********' #微博登陆密码

引入天气预报API

这里我使用的天气API是这个:
http://weather.51wnl.com/weatherinfo/GetMoreWeather?cityCode=城市代码&weatherType=0 ,城市代码可以在这里找到。
比如,重庆的天气数据就是
http://weather.51wnl.com/weatherinfo/GetMoreWeather?cityCode=101040100&weatherType=0
注意到这个天气API属于json格式,需要引入json模块进行处理,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
def checkweather(num):
site = ("http://weather.51wnl.com/weatherinfo/GetMoreWeather?cityCode=%s&weatherType=0") % num #引入天气信息API
#print site
web = urllib2.urlopen(site)
content = web.read()
data = json.loads(content)
result = data["weatherinfo"]
city = result["city"]
#print city
date_y = result["date_y"]
weather = result["weather1"]
temp = result["temp1"]
suggest = result["index_d"]
global final_temp
final_temp = city + "," + date_y + "。天气:" + weather + ",气温:" + temp + "。" + suggest
#print final_temp + "\n"

发送微博

通过引入code和授权,使用发送微博的API进行微博的发送。值得提出的是,我们使用users/show这个接口以及通过浏览器获得的我需要@对象的uid获取该对象的昵称screen_name

1
2
3
4
5
6
7
8
9
10
11
12
#调用查询用户API
def check_user(userid):
code = get_code()
token = client.request_access_token(code)
client.set_access_token(token.access_token, token.expires_in)
#r = client.users.show.get(screen_name="爱薇薇")
#print r
global r #设置全局变量以备调用
global her_screen_name
r = client.users.show.get(uid=userid) #自行获取用户唯一uid
her_screen_name = r['screen_name'] #通过uid获取用户昵称
#print her_screen_name

你可以通过这样的方式来获取用户的uid,用浏览器打开该对象微博的个人资料页面:

链接地址中100505之后的数字就是1372451215就是薇薇微博的uid了,这也是每个微博账户独一无二的(数字可能不一样,请自行判断)。

然后就可以编写发送微博的函数了:

1
2
3
4
5
6
7
8
9
10
11
#发文字微博
def weibo_text(text):
#post构造的数据获取code
code = get_code()
#获取授权令牌和期限
token = client.request_access_token(code)
client.set_access_token(token.access_token, token.expires_in)
#发微博
client.statuses.update.post(status=text)

最后,统一调用函数进行发布

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#调用城市代码和微博名并发送微博
checkweather(city_num["haerbing"])
if __name__ == '__main__':
#checkweather(city_num["chengdu"])
check_user(1372451215)
weibo_text(final_temp + " @" + her_screen_name)
# weibo_text("test")
# weibo_pic('发布图片微博', '/home/jasondyq/test/test.png')
checkweather(city_num["chengdu"])
if __name__ == '__main__':
#checkweather(city_num["chengdu"])
check_user(2693448851)
weibo_text(final_temp + " @" + her_screen_name)
# weibo_text("test")
# weibo_pic('发布图片微博', '/home/jasondyq/test/test.png')

保存退出,运行下这个py程序吧,你会发现这样的效果:

大功告成,ohyeah~

自动化运行

我们使用linux上的自动运行工具crontab进行脚本的自动执行。我选择在我的VPS上实现这一功能,当然,如果你能保证你的电脑在你需要执行脚本的时候开机,在自己的PC上运行也是可行的。

crontab命令的属于一个linux底层的自动化命令,格式类似这样0 */12 * * * 执行命令,一共五个值,你可以在这个站点进行编辑并查询执行时间。
crontab -l命令:查询当前调度的脚本
crontab -e命令:编辑时间调度。
这里,我们应该进行编辑调度,我需要每天早上8点自动执行该脚本,故我这样写:

1
2
3
4
5
6
7
8
9
10
11
12
13
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h dom mon dow command
0 8/24 * * * python /root/pyapp/weibo_robot/weibo_robot.py

需要注意的一点是,得注意你的系统时间。使用date命令查询VPS的时区和你需要的时区是否一致,这也是crontab命令会执行错误的一个点了。(调整时区请参见http://www.cnblogs.com/h2appy/archive/2008/11/27/1342029.html)

最后的一点感想

今年的最后一个程序,花了两个晚上搞了出来,确实Python好多东西生疏了,有空得多写写。此外的一个经验是多功能开发必须得分部测试各个功能,不能一次就写好,不然bug会让人无从下手。

最后,参考资料


Jas0ndyq敬上