第一步就是要登錄網站,而目前主流網站的登陸過程大同小異。於是乎,我就拿了人人網(www.renren.com)來試手。至於爲什麼用它,因爲很多網站的登陸過程太複雜了,它稍微簡單點。
主要用python實現了對網站的模擬登錄。需要自己構造數據接口,這就需要抓包看登陸的時候到底發了什麼數據。
firefox有一個很好用的工具HTTPfox來抓取http數據包,主要看url,postdata,header,cookie,user-agent等數據。
我們要構造自己的HTTP數據包,併發送給指定url。我們通過urllib2等幾個模塊提供的API來實現request請求的發送和相應的接收。
大部分網站登錄時需要攜帶cookie,所以我們還必須設置cookie處理器來保證cookie。
#!/usr/bin/python
# -*- coding:utf-8 -*-
import urllib
import urllib2
import cookielib
#登錄的主頁面
hosturl = 'http://www.renren.com/'
#post數據接收和處理的頁面,點登陸的時候http POST的鏈接
posturl = 'http://www.renren.com/ajaxLogin/login?1=1&uniqueTimestamp=20151021027896'
#設置一個cookie處理器,它負責從服務器下載cookie到本地,並且在發送請求時帶上本地的cookie
cj = cookielib.LWPCookieJar()
cookie_support = urllib2.HTTPCookieProcessor(cj)
opener = urllib2.build_opener(cookie_support, urllib2.HTTPHandler)
urllib2.install_opener(opener)
#打開登錄主頁面(他的目的是從頁面下載cookie,這樣我們在再送post數據時就有cookie了,否則發送不成功)
h = urllib2.urlopen(hosturl)
#構造header,一般header至少要包含一下兩項。這兩項是從抓到的包裏分析得出的。
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:42.0) Gecko/20100101 Firefox/42.0',
'Referer' : 'http://www.renren.com/'
}
#抓包獲取參數,password一般會通過某種方式加密。
postData = {
'email':'xxxxxx',
'icode':'',
'origURL':'http://www.renren.com/home',
'domain':'renren.com',
'key_id':1,
'captcha_type':'web_login',
'password':'xxxxxx',
'rkey':'70153f87e588d34f588cccecdd878d66',
'f':''
}
postData = urllib.urlencode(postData)
#通過urllib2提供的request方法來向指定Url發送我們構造的數據,並完成登錄過程
request = urllib2.Request(posturl, postData, headers)
print request
response = urllib2.urlopen(request)
text = response.read()
text = text.replace("true","1").replace("false","0")
text = eval(text)
url = text.get('homeUrl') # 這個纔是你人人主頁的真實url
if not url:
print "error"
response = urllib2.urlopen(url)
result = response.read().decode("utf-8").encode("gbk")
print result
注:
2.http POST登陸的鏈接有可能是動態的,從GET返回的信息中獲取。
3.PASSWORD有些是明文發送,有些是加密後發送,騰訊的更牛逼,動態加密的,裏面有很多其他數據的加密信息,不只是密碼。不過好像能通過查看JS源碼獲得加密算法。
4.大多數網站的登陸整體流程類似,可能有些細節不一樣。所以不能保證其他網站登陸成功,還有待研究。