2009年11月8日星期日

实时同步Twitter信息到新浪微博

  如何自动将的Twitter信息同步到国内的新浪微博、开心网、人人网等国内SNS网站,我先前曾经介绍过一个同步方法,该方法虽能实现同步功能,但是同步不是实时的,有大约一小时左右的时差,这个时差是由TwitterFeed引起的,同时该方法的设置较为繁琐,需要多次翻墙。

  因此,我开始尝试一种新的同步方法,开发了一个定时自动读取并同步Twitter信息的Python程序,以简化同步的流程,并缩短同步时间,做到基本实时同步功能。原先的同步的流程图是: twitter -> appspot -> twitterfeed -> ping.fm -> customurl -> huotu -> 新浪微博,新的同步流程变成了: twitter -> appspot -> huotu -> 新浪微博,步骤大为简化,只需在GAE上设置一个定时执行的计划任务即可。

  由于GAE支持Cron Job计划任务,因此,我们的Python程序可以实现每分钟自动调用一次,调用的时候,先从Twitter上抓取用户最新的消息,抓取成功后,将消息同步到嘀咕火兔,然后分发到新浪微博、开心网等,如果设置为每分钟执行的话,同步时差只有一分钟左右的时间,基本实现了实时同步Twitter信息到新浪微博等SNS网站的功能。

  该程序Python程序我在GAE上调试并不太顺利,按照官方的说明配置好了cron.yaml文件,但是更新twitter.py之后,Cron Job计划任务还是不起作用,后台也看不到相关的Cron Job任务。

  后来经过一番研究,终于解决了GAE中Python的Cron Job计划任务问题,原因很简单,因为我的“Google App Engine SDK for Python”是很久以前安装的,那时候GAE还不支持计划任务,因此无法更新cron.yaml文件,重新下载了一个最新版本的“Google App Engine SDK for Python”安装后,Cron Job计划任务更新就成功了。

  不过,新的问题又来了,我发现该应用调用Twitter API的时候,失败率非常高,几乎有一半的情况,调用的时候会提示“Rate limit exceeded. Clients may not make more than 150 requests per hour.”,这让我怀疑GAE的外部IP是不是非常少,还有很多第三方程序在GAE上调用Twitter API,才导致每小时的调用超过150次,否则的话,光我自己的调用绝对不会有这么高的频率,大概是因为Twitter没有将GAE的IP设置为白名单,如果有一天Twitter不限制GAE的IP,那应该就没什么问题了。

  安装使用说明:

  下载方法,使用TortoiseSVN检出这个SVN地址,然后,编辑app.yaml,修改为自己的appspot应用名,接着,修改twitter.py文件的最后一行,将自己的Twitter用户名,嘀咕火兔用户名和密码分别填入,cron.yaml文件里是计划任务设置,然后就可以按照此文的方法进行发布,执行 appcfg.py update 目录名,使用Gmail帐号和密码,就可以发布了。

  发布之后,GAE就可以定时执行twitter.py程序,由于定时执行可以设置最短为1分钟,因此同步速度很快,基本可以实现即时自动同步的效果。