用GAE同步推特到人人网状态
![]()
事情是这样的。死狐狸@yegle做了个脚本,专门用来刷人人网上各位同学的屏幕。Shellex很赞赏这样的精神,但是Shellex不能整天开着Linux跑crontab吧。
而且Shellex也不是@yegle这样的土豪,买个VPS上面装了虚拟的私人网大发国难财,也不像@showfom那样的土豪,买个VPS在上面跑5个bash。唉唉,穷人。
为了达到去人人网恶心各位同学、增加Shellex的上镜率、提高Shellex的知名度的目的,Shellex在GAE的第一次就献给了这个脚本。
这个东西用到了webpy(居然用到了webpy!我坦白!Shellex当时想挖坑,但是考虑Shellex的人身安全还是不挖为妙…),其实没必要的哈,但是无所谓嘛,拿出来就好了。
写得有点乱七八糟的,见谅见谅,这是code.py:
#!/usr/bin/env python2.6
#coding=utf8
import web
import Cookie,urllib
import simplejson as json
from google.appengine.api import urlfetch
from setting import app
from google.appengine.ext import db
from google.appengine.api import users
renren_usr = '你的人人网用户名'
renren_passwd = '人人网密码'
twitter_usr = '推特用户名'
twitter_passwd = '推特密码'
cookie_buf = Cookie.SimpleCookie();
class LastTweetRecord(db.Model):
id = db.StringProperty(multiline=True);
def make_cookie_header(cookie):
ret = ''
for v in cookie.values():
ret += '%s=%s;' % (v.key, v.value)
return ret
def get_tweets (usr, passwd):
last_tweet_id = 0
last_tweet_record = None
last_tweet_records = db.GqlQuery('SELECT * FROM LastTweetRecord');
for record in last_tweet_records:
try:
last_tweet_id = int(record.id)
last_tweet_record = record
except Exception, e:
last_tweet_id = 1
if last_tweet_records.count() == 0:
last_tweet_id = 1
last_tweet_record = LastTweetRecord()
last_tweet_record.put()
new_timeline = []
timeline_uri = 'http://%s:%s@twitter.com/statuses/user_timeline.json?count=100&since_id=%d' % (usr, passwd, last_tweet_id)
timeline = urllib.urlopen(timeline_uri).read();
timeline = json.loads(timeline)
if len(timeline) == 0:
return []
new_id = timeline[0]['id']
if new_id == '' :
return []
last_tweet_record.id = str(new_id)
db.put(last_tweet_record)
for tweet in timeline:
if tweet['text'][0] != '@' :
new_timeline.append((tweet['text'].encode('utf8')+' via 唧唧'));
return new_timeline
def login2renren():
verify_url = 'http://passport.renren.com/PLogin.do'
verify_data= urllib.urlencode(
{
'domain':'renren.com',
'email': renren_usr,
'password': renren_passwd,
'origURL':'http://home.renren.com/Home.do',
})
result = urlfetch.fetch(
url=verify_url,
headers={'Cookie':make_cookie_header(cookie_buf),
'Content-Type': 'application/x-www-form-urlencoded',
'user-agent':'Mozilla/5.0 (Linux; U; Linux i686; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.4.2.80 Safari/525.13',},
method=urlfetch.POST,
payload=verify_data,
follow_redirects = False,
)
return result
def do_redirect(url, cookie):
result = urlfetch.fetch(
url=url,
headers={'Cookie':make_cookie_header(cookie),
'Content-Type': 'application/x-www-form-urlencoded',
'user-agent':'Mozilla/5.0 (Linux; U; Linux i686; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.4.2.80 Safari/525.13',},
method=urlfetch.GET,
follow_redirects = False,
)
return result
def send_status(status, cookie):
status_url = 'http://status.renren.com/doing/update.do'
status_data = urllib.urlencode({
'c': status,
'raw': status,
'isAtHome': 0,
})
result = urlfetch.fetch(
url=status_url,
headers={
'Cookie':make_cookie_header(cookie),
'Content-Type': 'application/x-www-form-urlencoded',
'user-agent':'Mozilla/5.0 (Linux; U; Linux i686; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.4.2.80 Safari/525.13',
'Referer': 'http://status.renren.com/ajaxproxy.htm'
},
method=urlfetch.POST,
payload=status_data,
)
return result
class sync:
def GET(s):
global cookie_buf
#get timeline
timeline = get_tweets(twitter_usr, twitter_passwd)
if len(timeline) == 0:
return 'no tweet to sync.'
#login to renren
result = login2renren()
cookie_buf = Cookie.SimpleCookie(result.headers.get('set-cookie', ''));
callback_url = result.headers.get('location','xx');
result = do_redirect(callback_url, cookie_buf)
cookie_buf = Cookie.SimpleCookie(result.headers.get('set-cookie', ''))
for tweet in timeline:
result = send_status(tweet, cookie_buf)
return 'ok'
if __name__ == "__main__":
app.cgirun();
#app.run();
然后是设置,为了防止被misuse,建议把url改得奇怪一些:
import web
urls = (
'/task/sync', 'code.sync',
)
app = web.application (urls, globals())
接下来是cron.yaml,每5分钟触发一次:
cron:
- description: every 5 minutes
url: /task/sync
schedule: every 5 minutes
接下来是app.yaml:
application: 你的app名字
version: 6
runtime: python
api_version: 1
handlers:
- url: /.*
script: code.py
对了,如果需要技术支持的话,直接找我就好,5金一人,童叟无欺。
搞了两天才出来,因为对gae不熟悉,urllib2的支持有限,所以只能fetchurl来提取cookies; 最囧的是版本…版本…今天捣鼓了一个下午才发现我一直在错误的version 2上纠结…而不是正确的version 6…