研究网易微博API - 1

2010-04-26 00:24

有朋友要我帮他写一个偶们家微博的客户端, 今天晚上研究了下登录过程, 主要用到了urllib2和cookielib这两个库. 第一次在python里面用cookie, 之前都是用curl搞定的, 于是记录下~

背景

登录地址: http://t.163.com/session

相关工具: firefox + httpfox

账号校验

首先在Firefox里面登录, 拿到这个过程的HTTP通讯记录. 为了避免已有的cookie对登录过程的影响, 我们用Firefox提供的隐私浏览模式来模拟一个完全没有cookie的用户的登录过程. 根据通讯记录来看, 登录过程首先校验了用户账号, 往http://t.163.com/account/passport/check这个url POST了用户名, 服务器返回一个json, 里面只有一个字段, status. 如果用户账号存在则值为0, 否则为1.

import urllib2
from urllib import urlencode
url = "http://t.163.com/account/passport/check"
para = urlencode({'userName': 'xiaket@163.com'})
f = urllib2.urlopen(url, para)
print f.read()   # {"status": "0"}
para = urlencode({'userName': 'xiaket@163.cm'}) # no such account.
f = urllib2.urlopen(url, para)
print f.read()   # {"status": "1"}

根据返回的内容来看, 这个步骤没有设置任何cookie, 我们可以放心地继续了.

输入用户名和密码, 设置cookie

继续看通讯记录, 如果上一步没问题应该会往https://reg.163.com/logins.jsp这个url发送登录用户名, 密码和相关选项. 这个步骤会设置cookie, 所以我们需要用cookielib创建的opener来打开这个url.

url = 'https://reg.163.com/logins.jsp'
data = {'username': 'xiaket@163.com', 'password': 'notmypass', 'savelogin': '1', 'url': 'http://t.163.com/session/first', 'product': 't', 'type': '1'}
para = urlencode(data)
cj = cookielib.MozillaCookieJar()
cj.save('E:\t163.txt')
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
f = opener.open(url, para)
cj.save('E:\t163.txt')

此时, 我们应该能够在t163.txt这个文件中看到一些cookie的内容了~

第一次重定向

如果成功登录, 上一步返回的页面里面是一个重定向的网页. 这个页面里面的链接用HTML代码('&#开头的小于256的十进制数')转义了所有的字符. 一时没找到合适的库函数, 自己山寨了一段转换的代码:

from urllib import unquote
lines = f.read().split('rn')
for line in lines:
if line.find('<a href=') != -1:
linkline = line
start = linkline.index("ref='") + 5
end = linkline.index("'><", start)
reallink = ''
link = linkline[start:end]
for numstr in link.split('&#'):
if numstr == '':
continue
else:
hexstr = hex(int(numstr))
reallink += ('%' + hexstr.replace('0x', ''))
reallink = urllib.unquote(reallink)

此时就能拿到一个以http://reg.youdao.com/crossdomain.jsp?username=开头的url. 我们下一步就要用这个url了.

第二次重定向

我们继续访问上面给出的reallink这个url:

f = opener.open(reallink)
cj.save('E:\t163.txt')

此时, 我们会发现这个文件里有多了youdao.com写的cookie.

这次访问返回的页面是用js重定向到http://t.163.com/session/first?username=xiaket这个url. 我们于是拿已有的opener继续打开这个页面:

nurl = "http://t.163.com/session/first?username=xiaket"
f = opener.open(nurl)
lines = f.readlines()
for line in lines:
print line.decode('utf8')

此时已经能够正常给出微博首页的url了. 晚了, 下次继续...