Giter Site home page Giter Site logo

kickassina's Introduction

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的时候判断;
 - 改进判断是否发布微博成功的方法;
 - 改进配置,增加一些全局变量;
+--------------------------+

kickassina's People

Contributors

ydoovv avatar vvoody avatar

Stargazers

 avatar  avatar

Watchers

 avatar

Forkers

gotomypc

kickassina's Issues

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.