2009年8月6日星期四

利用GAE实现Twitter短信通知

简介

随着国内Twitter Clone集体被自杀,利用叽歪绑定飞信,通过手机短信获取Twitter更新的法子就失效了,于是我再一次开始折腾。

这次用到的东西包括cocobear写的PyFetion、Yahoo Pipes和Google App Engine。基本思路就是利用GAE的Cron功能定时检查Yahoo Pipes抓取的RSS,如果有新的东西就用PyFetion给自己的手机发短信。

除了Twitter,这个程序可以用来做的事情挺多,比如接收实时天气预报之类,各位可以自由发挥。

安装及使用说明

由于PyFetion、FeedParser等第三方库都采用GPL许可证发布,所以我的代码也使用GPL v2许可证,使用及再发布请留意相关限制。

代码放到Github上了,下载请走这里,点击download即可获得最新源文件的压缩包。

我并没有为本程序单独建立一个代码仓库,目前还整合了杜晓刚GAppProxy等其他程序。用得上的话就不用为本程序单独建立一个GAE了,不然的话放在那里也成,并不影响使用。

下载及解压后需要修改的文件有两个。app.yaml中第一行“application: ogaeo”,将ogaeo改为你的GAE项目名称。另外则是Conf.py中RSS2Fetion的相关配置信息。

默认的RSS只抓取Twitte的replies和direct messages,应该不至于太烦人。据说用飞信给自己发短信有每天600条、每月1000条的限制,如需要自定义抓取来源请留意。

我将Cron任务设置为每5分钟执行一次,实际延迟约在5到10分钟的样子。如需要更改,请查阅cron.yaml文件。

需要GAE申请及上传帮助,请查阅GAppProxy帮助文档。使用中出现问题,请在本页留言。

使用本程序会造成飞信PC及手机客户端掉线,如果你经常使用飞信聊天并且只有一个移动的号码,本程序并不适合你。

如果希望临时关闭本程序,可以采用短信修改飞信密码的办法来实现。编辑短信,内容为新密码,发送至12520050。详情请查阅飞信帮助说明

更新历史

Update 22:36 2009-8-11:

本想偷懒直接用memcache,可是发现memcache无法提供长时间的缓存,所以还是得用数据库。

另外还发现GAE一个问题,pickle反序列化似乎得这样用:pickle.loads(str(dbcache.txt))。

Update 23:56 2009-8-13:

用pickle序列化数据并保存至数据库仍然会有重复发送的问题,而且两次重复发送都在凌晨6点多。找不到问题出在哪里,于是再次修改缓存机制,将RSS永久保存在数据库中。

一定要记住两件事:一、TextProperty不可查询,只能用StringProperty;二、看文档需要仔细些,再仔细些……

Update 14:43 2009-8-17

经过上次修改后没有再出现重复发送短信的情况,问题应该是解决了吧,只是出错的原因还不太确定。

嫌疑集中在Model(Query、GqlQuery)类的get方法上。按照文档的说法,query.get()应该返回数据库中符合查询条件的第一条纪录,没有则返回None。可是用query.get() == None进行条件判断时就会出现重复发送的情况,改用query.count() == 0时则不会。初步判断,有可能是get方法在发生错误(如超时)时,并没有抛出异常所致。

Update 22:57 2009-8-20

上次将get()修改为count()后忘记上传代码了,汗。

Update 23:15 2009-8-30

有人说希望可以用父母的手机申请飞信并给自己的手机发短信,这样就不影响飞信使用。貌似的确会有这样的需求,所以加上。

Update 21:46 2009-9-17

某人提意见,去掉replay里[@自己的用户名]看起来会怪怪的。想想也是,反正省不了几个字符,于是小改一下默认的Pipe。

10 条评论 :

Cre∫endo 说...

短信会被爆掉@@

oCameLo 说...

用Pipes的原因就是可以对RSS进行整合以及过滤,Twitter上我只弄了replies。

yiliang 说...

看不懂……教程能详细一些吗?

oCameLo 说...

@yiliang:

不好意思,这并不是个教程。。

如果会一点点计算机语言,再写一个app.yaml和cron.yaml,这个程序就可以直接用了。

但我并不能保证这个程序可以安全稳定地长时间运行,而且交付普通用户使用的话,Python、GAE、Pipes都有相当的复杂度,想说清楚也不容易。

我并不打算把这个东西做到可以给普通用户使用的程度,不过你确实很有兴趣的话,我可以帮你配置和上传。只是搞这个东西需要飞信和GMail密码,所以我还是建议你找个朋友帮你弄的好。

小卒过河 说...

这两天本来在筹划做这个东西,竟然有人做了,太好了,哈哈。
问题:
1、广播至Ping.fm顺便用来同步,还是有什么用?
2、gae本来服务器就在国外,没必要代理啊。
3、是否能给我一个联系方式,想交流一下,呵呵。

oCameLo 说...

1、你说的是rss2ping.py?是为了实现短信更新Twitter而写的,短信=》做啥(叽歪、饭否、etc)=》RSS=》ping.fm。实现这个目的有其他不需要写代码的方法,所以我就没提,Twitter至短信只需要用rss2fetion.py就好。

2、代理是指Pipes?用Pipes可以不写代码做到很多事,比如合并多个RSS、过滤等等,能偷懒干嘛不呢……

yangbao 说...

Cron任务设置为每5分钟执行一次对我没用啊, 一直不能自动更新。 只能输入http://*******.appspot.com/cron/rss2fetion才行。望解答。

另外我改了个pipe,可以follow所有好友的消息了。
http://pipes.yahoo.com/pipes/pipe.info?_id=f1d609c98ace4ba56809c4bd1cd5f6a6

oCameLo 说...

飞信有限额,如果跟随的人比较多,推送timeline会爆掉,这个问题看着办吧。

代码我检查过了,没发现什么问题。appcfg.py上传源码要到最后才更新Cron任务,留意输出。另外登陆http://www.appspot.com,看看Cron Jobs里边有什么。

startime 说...

如果使用别人的飞信就没与数量限制,那也没有必要限定在dm和@了吧?我想修改成发送所有follow的更新到手机,但是不知道怎么改设置,老大可以指点一下么?非常感谢

Anonymous 说...

@startime:

这样做有没有限制我不知道,不过我猜仍然是有的。

登陆Twitter后页面右边栏最下面有两个RSS链接,“RSS Feed”那个就是你要找的东西,大概是长成这个样子:https://twitter.com/statuses/friends_timeline/NNNNNN.rss

不过这个接口需要登陆验证,你可以在Conf.py里写成这样试试:https://用户名:密码@twitter.com/statuses/friends_timeline/NNNNNN.rss

如果搞不定,也可以试试yangbao做的pipe:http://pipes.yahoo.com/pipes/pipe.info?_id=f1d609c98ace4ba56809c4bd1cd5f6a6