利用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中的Fetion.id(手机号)、Fetion.pwd(飞信密码)、 TWITTER_ID(Twitter用户名)、TWITTER_PWD(Twitter密码)。

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

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

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

更新历史

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方法在发生错误(如超时)时,并没有抛出异常所致。

1 条评论:

Unknown 说...

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