同步你的微博
- 本文链接地址:http://zhubaining.com/blog/2010/11/20/archives/%e5%90%8c%e6%ad%a5%e4%bd%a0%e7%9a%84%e5%be%ae%e5%8d%9a
- 作者:zhubaining
想把twitter上说的话自动同步到其他微博账号,比如新浪微博、腾讯微博、百度说吧等?谢天谢地,有好心人已经做了个不错的同步脚本。
在这里下载脚本:http://www.54chen.com/tw2other-54chen-0916.tar.gz
具体使用方法参考:http://www.54chen.com/web-ral/twitter.html
在config.php里面设置目标微博账户信息,比如:
$services = array ("sina" => array ('username' => 'zhubaining', 'password' => 'secret' ),
"baidu" => array ('username' => 'zhubaining', 'password' => 'secret' ),
值得一提的是,可以通过修改配置,过滤掉retweet和reply之类,因为这些消息对于非twitter好友们没有意义,因为没有上下文:
打开config.php,修改$twitterSyncLevel变量:
/** * 0:不过滤 * 1:过滤回复别人的tweet * 2:过滤RT别人的推 * 3:只同步自己的tweet,推中不包含RT,@字样 * */ $twitterSyncLevel = 3;
其原理是如下的正则表达式:
switch ($this->syncLevel) {
//过滤回复别人的tweet
case 1 :
return '/^@.*/m';
break;
//过滤RT别人的推
case 2 :
return '/^RT\s@.*/m';
break;
//只同步自己的tweet,推中不包含RT,@字样
case 3 :
return '/RT\s|@/';
break;
default :
return NULL;
break;
}
设为3的话确实有点儿暴力,因为包含RT和@的都不会被同步,尤其是@太常见了,这个问题可以暂时用全角@来回避。
设置完了,就可以按照步骤,执行php index.php同步了。聪明的你一定想到了把它放进crontab里面定时执行,很好。
试了几次,发现一个严重的囧问题:每次执行,都会把之前的老tweet重复发了一遍,以至于百度说吧里面都被我刷屏了,有群众都抱怨了。
于是研究了一下那个脚本,发现它是通过在“statuses/user_timeline.json?start_id=N”里面指定N来实现“不重复同步”的目的,那么,它必然要把上次的id保存下来,果然,发现这个文件:
$ cat tweet.id 5.63894430991E+15
登陆twitter网站,查看俺的最后一条tweet的id是5638944309907456,于是猜到了问题所在:id太大!联想到我的是32bit环境,对,超过了int的范围。
root@yudi:~# uname -a Linux yudi 2.6.18.8-linode22 #1 SMP Tue Nov 10 16:12:12 UTC 2009 i686 GNU/Linux
在仔细看看脚本,发现使用了twitter返回的json结构中的””id”:5638944309907456“,然后json_decode,于是乎,就出现了浮点数。
怎么办呢?第一反应就是在decode前,把这个元素变成字符串型,这样就不”失真“了,正准备实现hack手段时,一不小心发现了json里面还有个””id_str”:”5638944309907456″“,太好了,就直接用它吧。
修改代码:
$ diff Twitter.php Twitter_new.php
120c120
< if (! isset ( $json [0] ['id'] )) {
---
> if (! isset ( $json [0] ['id_str'] )) {
124c124
< $this->writeTweetId ( $json [0] ['id'] );
---
> $this->writeTweetId ( $json [0] ['id_str'] );
重新运行了几遍脚本,这下终于和谐了。
用高科技制造同步脚本,用脚本骚扰更多的人!现在就行动吧!
趣闻:
- 在调试的过程中,为了防止再次扰民,还特意申请了一个百度说吧的马甲来做实验。
- 在给新浪微博和百度说吧一次同步数条信息的时候,发现新浪微博系统处理请求数度稍逊,同步了,但是半天还没显示出来。
更新:
- 刚才又看到twitter的返回json里面包含如下的字段,看来可以用更高明的方法了:
["retweeted"]=> bool(false) ["in_reply_to_user_id"]=> NULL
- 发现用一些工具如echofon发的“retweet with comment”,其实不是retweet,也就是说retweeted=false.
能否選擇性同步呢, 如只同步帶某一特定關鍵字的 tweet, 其余的一律不同步?
@Moses
你直接修改php代码吧,不复杂的。
你有国外的vps?
@wtommy
必须得有啊。快要续费了,寻合租人。哈哈