有朋友要我帮他写一个偶们家微博的客户端, 今天晚上研究了下登录过程, 主要用到了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.
输入用户名和密码, 设置cookie
继续看通讯记录, 如果上一步没问题应该会往https://reg.163.com/logins.jsp这个url发送登录用户名, 密码和相关选项. 这个步骤会设置cookie, 所以我们需要用cookielib创建的opener来打开这个url.
第一次重定向
如果成功登录, 上一步返回的页面里面是一个重定向的网页. 这个页面里面的链接用HTML代码(’&#开头的小于256的十进制数’)转义了所有的字符. 一时没找到合适的库函数, 自己山寨了一段转换的代码:
第二次重定向
我们继续访问上面给出的reallink这个url:
这次访问返回的页面是用js重定向到http://t.163.com/session/first?username=xiaket这个url. 我们于是拿已有的opener继续打开这个页面:
背景
登录地址: 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.
01.
import
urllib2
02.
from
urllib
import
urlencode
03.
url
=
"http://t.163.com/account/passport/check"
04.
para
=
urlencode({
'userName'
:
'xiaket@163.com'
})
05.
f
=
urllib2.urlopen(url, para)
06.
print
f.read()
# {"status": "0"}
07.
para
=
urlencode({
'userName'
:
'xiaket@163.cm'
})
# no such account.
08.
f
=
urllib2.urlopen(url, para)
09.
print
f.read()
# {"status": "1"}
根据返回的内容来看, 这个步骤没有设置任何cookie, 我们可以放心地继续了.输入用户名和密码, 设置cookie
继续看通讯记录, 如果上一步没问题应该会往https://reg.163.com/logins.jsp这个url发送登录用户名, 密码和相关选项. 这个步骤会设置cookie, 所以我们需要用cookielib创建的opener来打开这个url.
1.
url
=
'https://reg.163.com/logins.jsp'
2.
data
=
{
'username'
:
'xiaket@163.com'
,
'password'
:
'notmypass'
,
'savelogin'
:
'1'
,
'url'
:
'http://t.163.com/session/first'
,
'product'
:
't'
,
'type'
:
'1'
}
3.
para
=
urlencode(data)
4.
cj
=
cookielib.MozillaCookieJar()
5.
cj.save(
'E:\\t163.txt'
)
6.
opener
=
urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
7.
f
=
opener.open(url, para)
8.
cj.save(
'E:\\t163.txt'
)
此时, 我们应该能够在t163.txt这个文件中看到一些cookie的内容了~第一次重定向
如果成功登录, 上一步返回的页面里面是一个重定向的网页. 这个页面里面的链接用HTML代码(’&#开头的小于256的十进制数’)转义了所有的字符. 一时没找到合适的库函数, 自己山寨了一段转换的代码:
01.
from
urllib
import
unquote
02.
lines
=
f.read().split(
'\r\n'
)
03.
for
line
in
lines:
04.
if
line.find(
'<a href='
) !
=
-
1
:
05.
linkline
=
line
06.
start
=
linkline.index(
"ref='"
)
+
5
07.
end
=
linkline.index(
"'><"
, start)
08.
reallink
=
''
09.
link
=
linkline[start:end]
10.
for
numstr
in
link.split(
'&#'
):
11.
if
numstr
=
=
'':
12.
continue
13.
else
:
14.
hexstr
=
hex(int(numstr))
15.
reallink
+
=
(
'%'
+
hexstr.replace(
'0x'
, ''))
16.
reallink
=
urllib.unquote(reallink)
此时就能拿到一个以http://reg.youdao.com/crossdomain.jsp?username=开头的url. 我们下一步就要用这个url了.第二次重定向
我们继续访问上面给出的reallink这个url:
1.
f
=
opener.open(reallink)
2.
cj.save(
'E:\\t163.txt'
)
此时, 我们会发现这个文件里有多了youdao.com写的cookie.这次访问返回的页面是用js重定向到http://t.163.com/session/first?username=xiaket这个url. 我们于是拿已有的opener继续打开这个页面:
2.
f
=
opener.open(nurl)
3.
lines
=
f.readlines()
4.
for
line
in
lines:
5.
print
line.decode(
'utf8'
)
此时已经能够正常给出微博首页的url了. 晚了, 下次继续…
转自:http://www.tech-q.cn/viewthread.php?tid=7398&extra=page%3D1%26amp;orderby%3Ddateline