Skip to content
kickassina
Python
Find file
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.
static
.gitignore
README
TODO
app.yaml
cron.yaml
index.yaml
main.py

README

THIS PROJECT IS *DEAD* DUE TO THE VULNERABILITY FIXED BY WEIBO.
Details: http://www.wooyun.org/bugs/wooyun-2010-013146

====
What
====
同步twitter到新浪微博,基于Google App Engine。

====
Why
====
类似同步程序不少,但他们需要twitter密码、新浪密码、新浪api key。
这也没什么,关键新浪会封api key导致无法使用。因此折腾了下找到了个
不需要上述任何条件的方法来实现同步。

===
HOW
===
1. 访问新浪微博手机版 http://weibo.cn/ ,并登录成功回到首页;

   如果浏览器会提示将页面保存为php文件,将无法顺利登录,请尝试别的浏览器,
   比如Opera、Google Chrome。

2. 查看首页源码,找到"gsid="开头的字符串,以及"st=",记录下他们的值。
   gsid通常比较长,40位左右,st则4位左右。

   或者使用浏览器的开发者工具在登陆 http://weibo.cn/ 后发一条测试微博,抓取数据得知。
   下面链接中的红色划线部分的st和gsid两个值是下一步所需要的:
   https://raw.github.com/vvoody/kickassina/master/static/kickassina-howto.png

3. 下载kickassina源码

   3.1 https://github.com/vvoody/kickassina/archives/master

   3.2 编辑main.py,修改源码顶部3个变量"USER_ID"、"WEIBO_GSID"和"WEIBO_ST"

       USER_ID可以在下面的地址获得,最前面的<id>就是:

         http://api.twitter.com/1/users/show.xml?screen_name=YOURNAME

       WEIBO_GSID和WEIBO_ST由第二步中的两个字符串组成,将值分别填入相应位置:

       ** 务必填写并且正确,否则同步无法成功;
       ** 这两个字符串自己用没问题,泄露给别人会有安全隐患;

       填完应该像这样:
       USER_ID=1234567            # 整型
       WEIBO_GSID='AABBBCCDD'     # 字符串
       WEIBO_ST='XXYY'            # 字符串

4. 部署kickassina到GAE

   请参考同类教程。
   * 上传部署完毕务必到后台更改Version为app.yaml中定义的最新版本,否则服务器上
     的代码依然是旧的。

====
MORE
====
同步策略:

  * 每10分钟从你的用户timeline抓取tweets,滤除你回复别人的tweets,并保存到数据库;

  * 每1分钟从数据库中取出还没有被同步的tweet同步到新浪;

    每次至多同步一条,并且是未同步tweets中时间最早的一条。

Tips:

部署完了kickassina,理论要至少10分钟后才开始抓取tweets并同步,但你可以手工触发:

   1. 访问 http://xxxxx.appspot.com/fetchtweets

      一次从twitter抓取0~20条tweet,具体数量取决于回复别人的推有多少;
      不要过于频繁访问该页面,twitter有请求限制;
      需要admin登录后才能访问;

   2. 访问 http://xxxxx.appspot.com/kickass

      同步一条tweet;

上述两个页面是给cron来调用,用户一般不需要通过web页面访问,所以提示信息较少。
详细debug信息请访问appengine后台管理界面。

GAE的fetchurl最大请求超时时间是10秒(直接web访问是如此,后台cron、taskqueue则最大600),
因此你很有可能经常在后台看到下面的提示:

    urlfetch: ApplicationError: 5

kickassina对于这种情况会继续不断请求上次未成功的请求直到成功。鉴于urlfetch
超时时间太短,可以在其他web空间用curl命令配合cron来替代,但抓取tweets部分
依然基于GAE。方法如下:

    1. 编写shell脚本,内容如下:

       #!/bin/sh
       content=$(curl http://xxxxxx.appspot.com/lasttweet)
       if [ ! "$content" = "" ]; then
           curl -L -d "content=$content" "http://weibo.cn/mblog/sendmblog?st=XXXX&vt=4&gsid=AABBBCCDD"
       fi

    2. 添加上述shell脚本到cron

OK.

另外,有些使用urlfetch请求成功了,但是没有见到你的tweet,那么很有可能是
新浪对微博的审查,触发某些敏感词了。尝试多次依然如此时kickassina会标记这些
tweets为failed,进入下一次同步会忽略它们。目前还没有接口给这些failed的
tweets再一次同步的机会[TODO 1]。

=========
API PROXY
=========
在获取用户的推时使用的是api.twitter.com/1/,并且未使用twitter api key,
由于本应用基于GAE而Twitter对于GAE过多的请求限制比较多,经常会超过限额。因此,
理论上本应用可以支持所有第三方twitter api proxy。

* nginx

  /etc/nginx/nginx.conf:

    server {
        listen 80;
        server_name api.ooo.xxx;

        location = /tw/get_tl/ {
            if ($arg_user_id !~ [0-9]+) {
                return 400;
            }
            if ($arg_since_id !~ [0-9]+) {
                return 400;
            }
            proxy_pass http://api.twitter.com/1/statuses/user_timeline.json?user_id=$arg_user_id&trim_user=true&include_rts=true&include_entities=true&since_id=$arg_since_id?;
        }
    }

  nginx在如上配置后,可以替换main.py中FetchtweetsHandler的req一行为:

    "req = 'http://api.ooo.xxx/tw/get_tl/?user_id=%d&since_id=%d' % (USER_ID, sid)"

* 其他

  请根据所使用的api proxy地址作相应调整。如果希望能多人使用请保留user_id和since_id接口。



ChangeLog:
Sat Dec 29 21:03:18 UTC 2012
 - 增加配图说明如果获取gsid和st的值;
+--------------------------+
Tue Dec 20 13:56:27 CST 2011
 - 隐去tweet中的用户名,为了不打扰和Twitter用户名同名的新浪微博用户,以及安全性;
+--------------------------+
Fri Sep  2 20:44:54 CST 2011
 - 解决t.co背后是goo.gl/bit.ly等短网址不能发布到新浪微博的问题;
+--------------------------+
Thu Aug 18 14:03:07 CST 2011
 - 增加第三方api搭建使用说明,详见README;
+--------------------------+
Thu Aug 18 11:49:57 CST 2011
 - 还原t.co链接为原始链接,因为新浪微博把t.co列入恶意网址;
+--------------------------+
Fri May 20 15:33:00 CST 2011
 - 增加部署说明,务必更新后台version;
+--------------------------+
Fri Apr 29 14:28:12 CST 2011
 - 增加全局变量UA;
 - get_weibo_count()使用mobile的ua;
 - 修正'Useg-Agent' -> 'User-Agent';
+--------------------------+
Fri Apr 29 11:40:29 CST 2011
 - 更精确的debug信息;
 - 调整tried_times增加策略;
+--------------------------+
Fri Apr 29 00:30:50 CST 2011
 - 取消/setfailed,直接在kick的时候判断;
 - 改进判断是否发布微博成功的方法;
 - 改进配置,增加一些全局变量;
+--------------------------+
Something went wrong with that request. Please try again.