首页 > linux, web技术 > 同步你的微博

同步你的微博

  • 本文链接地址: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'] );

重新运行了几遍脚本,这下终于和谐了。

用高科技制造同步脚本,用脚本骚扰更多的人!现在就行动吧!

趣闻:

  1. 在调试的过程中,为了防止再次扰民,还特意申请了一个百度说吧的马甲来做实验。
  2. 在给新浪微博和百度说吧一次同步数条信息的时候,发现新浪微博系统处理请求数度稍逊,同步了,但是半天还没显示出来。

更新:

  • 刚才又看到twitter的返回json里面包含如下的字段,看来可以用更高明的方法了:
["retweeted"]=>
 bool(false)
 ["in_reply_to_user_id"]=>
 NULL
  • 发现用一些工具如echofon发的“retweet with comment”,其实不是retweet,也就是说retweeted=false.
分类: linux, web技术 标签:
  1. 2011年2月14日00:11 | #1

    能否選擇性同步呢, 如只同步帶某一特定關鍵字的 tweet, 其余的一律不同步?

  2. zhubaining
    2011年2月15日23:01 | #2

    @Moses
    你直接修改php代码吧,不复杂的。

  3. 2011年3月18日00:37 | #3

    你有国外的vps?

  4. zhubaining
    2011年3月18日18:27 | #4

    @wtommy
    必须得有啊。快要续费了,寻合租人。哈哈

  1. 本文目前尚无任何 trackbacks 和 pingbacks.