受发芽网上的一段“校内网发帖机”的启发,最近想修改那段代码,让它可以部分的实现Twitter状态和校内网同步。之所以说“部分的”是因为我不知道怎么样让它像Facebook的Twitter插件那样Twitter的消息发送完毕后几乎同时(相差不到10秒钟)把Facebook的状态一并更新。另外一点很惭愧,就是我对HTTP编程不熟悉,目前还找不初修改校内的状态要提交的代码,只能修改一下原来的代码,在写日志上面做文章。
就算这样,也还是遇到了不少问题。我目前的打算是像过去WordPress上用过的一个插件,名字大概叫twitter-post那样,总结一天的Twitter消息,成为一篇文章,发送到校内上去。我开始用的是python-twitter这个包,很方便的就能弄到Twitter的消息。不过在它的GetUserTimeline()方法的说明中说到里面有一个since参数,提交一个“HTTP-formatted time”,就可以获得从那个时间点以后的消息。我觉得它应该能让我获得前一整天的所有消息,虽然需要做点处理,删除今天的消息。但这个“HTTP-formatted time”我实在是不知道是什么东西。昨天下午几乎找遍了我能从网上找到的所有表示时间的格式,怎么测试,它都只给我默认的最近20条的消息。可笑的是,python-twitter的代码里有test可以运行,而里面测试since参数的用例里用得Twitter帐号居然总共才不到10条tweets,这样GetUserTime()返回了所有的tweets,当然都是他要的时间段的啦。没办法,我只好去它的Google Groups里发问,结果今天居然找不到我提交的帖子了,难道是开发者觉得我是捣乱的?!!
既然这样不行,只好退一步先把能获得的最近20条tweets一并发上去,先看看效果再花功夫自己来解析前一天的所有tweets。结果很快写出了代码,但测试的时候却不行了。那段代码,我在程序里输入什么样的文字都可以正常发送,但自己从Twitter那里获得的文字就无法发送。Python一点提示都没有。我不光试验了python-twitter API给出的结果,还自己抓取了Twitter给出的XML文件自己parse,得到的结果也无法发送。我让两个程序在提交前输出提交的字符自己来比对,基本上都是一种格式的。简直快疯掉了。
接下来该怎么办?我目前只想到:
继续骚扰python-twitter,谁让他给出的测试用例中有问题呢?
像那段发布“校内网发帖机”的半瓶墨水虚心请教。
昨天晚上yegle在Twitter上对那段代码表示了兴趣,如果我没猜错的话,他应该就是某个BBS的Linux版版主之一,大概Python功力比我这种菜鸟强很多,说不定他能“一语惊醒梦中人”……
我目前的代码如下,它还不能工作。这个是我自己parse Twitter的XML版本,用python-twitter的版本前半部分简洁一些,不过差别不大,两者都有同样的问题。
02 # -*- coding: utf-8 -*-
03
04 from xml.dom import minidom
05
06 # 需要先运行wget http://twitter.com/statuses/user_timeline/liufeng.xml
07 tw_url = 'http://twitter.com/statuses/user_timeline/liufeng.xml'
08 xmldoc = minidom.parse('liufeng.xml')
09
10 status = xmldoc.firstChild
11 tweet = status.childNodes[1]
12
13 output = ""
14 count = 1
15 flag = 0
16 for tweet in status.childNodes:
17 if flag == 1:
18 created_at = tweet.childNodes[1].firstChild.toxml()
19 text = tweet.childNodes[5].firstChild.toxml()
20 output += str(count) + " " + text + " " + created_at + "\n"
21 count += 1
22 flag = 0
23 else:
24 flag = 1
25
26
27 import cookielib
28 import urllib2
29 import urllib
30 import time
31
32 cj = cookielib.CookieJar()
33 opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
34 exheaders = [("User-Agent", "Mozilla/4.0 (compatible; MSIE 7.1; Windows NT 5.1; SV1)"),]
35 opener.addheaders = exheaders
36 url_login = 'http://xiaonei.com/Login.do'
37 body = (('email', '*******@gmail.com'), ('password', '*******'))
38 req1 = opener.open(url_login, urllib.urlencode(body))
39 print "Login should be successful.\n"
40
41 body = {'relative_optype':'publisher', 'blogControl':'1'}
42 url_post = 'http://blog.xiaonei.com/NewEntry.do'
43 title = '最近我(说了/做了/想了)什么 %s' % time.asctime()
44 #xt = text.encode('utf-8')
45 print output
46 output = output.encode('utf-8')
47 print " fucked\n\n" + output
48 body['title'] = title
49 body['body'] = output
50 req2 = opener.open(url_post, urllib.urlencode(body))
51
52 #print urllib.urlencode(body)

http://twitter.com/statuses/user_timeline/liufeng.xml?count=20 ,就可以拿到最近20条记录。API里写得很清楚
我第二段说的问题是希望获取一整天的tweets,twitter-post的since参数无效。
第四段说的是获取了tweets往校内上上传的时候出问题。
都和获取20条tweets无关。