想把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.
Recent Comments