文的文字及圖片來源於網絡,僅供學習、交流使用,不具備任何商業用途,版權歸原做者全部,若有問題請及時聯繫咱們以做處理。css
做者: python社區html
PS:若有須要Python學習資料的小夥伴能夠加點擊下方連接自行獲取python
http://note.youdao.com/noteshare?id=3054cce4add8a909e784ad934f956cef複製代碼
通過屢次嘗試,模擬登陸淘寶終於成功了,實在是不容易,淘寶的登陸加密和驗證太複雜了,煞費苦心,在此寫出來和你們一塊兒分享,但願你們支持。web
如今淘寶換成了滑塊驗證了,比較難解決這個問題,如下的代碼無法用了,僅做學習參考研究之用吧。正則表達式
python模擬登陸淘寶網頁算法
獲取登陸用戶的全部訂單詳情windows
學會應對出現驗證碼的狀況瀏覽器
體會一下複雜的模擬登陸機制安全
淘寶的密碼用了AES加密算法,最終將密碼轉化爲256位,在POST時,傳輸的是256位長度的密碼。bash
淘寶在登陸時必需要輸入驗證碼,在通過幾回嘗試失敗後最終獲取了驗證碼圖片讓用戶手動輸入來驗證。
淘寶另外有複雜且天天在變的 ua 加密算法,在程序中咱們須要提早獲取某一 ua 碼纔可進行模擬登陸。
在獲取最後的登陸 st 碼時,歷經了屢次請求和正則表達式提取,且 st 碼只可以使用一次。
手動到瀏覽器獲取 ua 碼以及 加密後的密碼,只獲取一次便可,一勞永逸。
向登陸界面發送登陸請求,POST 一系列參數,包括 ua 碼以及密碼等等,得到響應,提取驗證碼圖像。
用戶輸入手動驗證碼,從新加入驗證碼數據再次用 POST 方式發出請求,得到響應,提取 J_Htoken。
利用 J_Htoken 向 alipay 發出請求,得到響應,提取 st 碼。
利用 st 碼和用戶名,從新發出登陸請求,得到響應,提取重定向網址,存儲 cookie。
利用 cookie 向其餘我的頁面如訂單頁面發出請求,得到響應,提取訂單詳情。
是否是沒看懂?沒事,下面我將一點點說明本身模擬登陸的過程,但願你們能夠理解。
因爲淘寶的 ua 算法和 aes 密碼加密算法太複雜了,ua 算法在淘寶天天都是在變化的,不過,這個內容你獲取以後一直用便可,通過測試以後沒有問題,一勞永逸。
那麼 ua 和 aes 密碼怎樣獲取呢?
咱們就從瀏覽器裏面直接獲取吧,打開瀏覽器,找到淘寶的登陸界面,按 F12 或者瀏覽器右鍵審查元素。
在這裏我用的是火狐瀏覽器,首先記得在瀏覽器中設置一下顯示持續日誌,要否則頁面跳轉了你就看不到以前抓取的信息了。在這裏截圖以下 好,那麼接下來咱們就從瀏覽器中獲取 ua 和 aes 密碼
點擊網絡選項卡,這時都是空的,什麼數據也沒有截取。這時你就在網頁上登陸一下試試吧,輸入用戶名啊,密碼啊,有必要時須要輸入驗證碼,點擊登陸。 等跳轉成功後,你就能夠看到好多日誌記錄了,點擊圖中的那一行 login.taobo.com,而後查看參數,你就會發現表單數據了,其中就包括 ua 還有下面的 password2,把這倆複製下來,咱們以後要用到的。這就是咱們須要的 ua 還有 aes 加密後的密碼。
代碼以下:
import urllib
import urllib2
import cookielib
import re
import webbrowser
#模擬登陸淘寶類
class Taobao:
#初始化方法
def __init__(self):
#登陸的URL
self.loginURL = "https://login.taobao.com/member/login.jhtml"
#代理IP地址,防止本身的IP被封禁
self.proxyURL = 'http://120.193.146.97:843'
#登陸POST數據時發送的頭部信息
self.loginHeaders = {
'Host':'login.taobao.com',
'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0',
'Referer' : 'https://login.taobao.com/member/login.jhtml',
'Content-Type': 'application/x-www-form-urlencoded',
'Connection' : 'Keep-Alive'
}
#用戶名
self.username = 'cqcre'
#ua字符串,通過淘寶ua算法計算得出,包含了時間戳,瀏覽器,屏幕分辨率,隨機數,鼠標移動,鼠標點擊,其實還有鍵盤輸入記錄,鼠標移動的記錄、點擊的記錄等等的信息
self.ua = '191UW5TcyMNYQwiAiwTR3tCf0J/QnhEcUpkMmQ=|Um5Ockt0TXdPc011TXVKdyE=|U2xMHDJ+H2QJZwBxX39Rb1d5WXcrSixAJ1kjDVsN|VGhXd1llXGNaYFhkWmJaYl1gV2pIdUtyTXRKfkN4Qn1FeEF6R31TBQ==|VWldfS0TMw8xDjYWKhAwHiUdOA9wCDEVaxgkATdcNU8iDFoM|VmNDbUMV|V2NDbUMV|WGRYeCgGZhtmH2VScVI2UT5fORtmD2gCawwuRSJHZAFsCWMOdVYyVTpbPR99HWAFYVMpUDUFORshHiQdJR0jAT0JPQc/BDoFPgooFDZtVBR5Fn9VOwt2EWhCOVQ4WSJPJFkHXhgoSDVIMRgnHyFqQ3xEezceIRkmahRqFDZLIkUvRiEDaA9qQ3xEezcZORc5bzk=|WWdHFy0TMw8vEy0UIQE0ADgYJBohGjoAOw4uEiwXLAw2DThu9a==|WmBAED5+KnIbdRh1GXgFQSZbGFdrUm1UblZqVGxQa1ZiTGxQcEp1I3U=|W2NDEz19KXENZwJjHkY7Ui9OJQsre09zSWlXY1oMLBExHzERLxsuE0UT|XGZGFjh4LHQdcx5zH34DRyBdHlFtVGtSaFBsUmpWbVBkSmpXd05zTnMlcw==|XWdHFzl5LXUJYwZnGkI/VitKIQ8vEzMKNws3YTc=|XmdaZ0d6WmVFeUB8XGJaYEB4TGxWbk5yTndXa0tyT29Ta0t1QGBeZDI='
#密碼,在這裏不能輸入真實密碼,淘寶對此密碼進行了加密處理,256位,此處爲加密後的密碼
self.password2 = '7511aa68sx629e45de220d29174f1066537a73420ef6dbb5b46f202396703a2d56b0312df8769d886e6ca63d587fdbb99ee73927e8c07d9c88cd02182e1a21edc13fb8e140a4a2a4b5c253bf38484bd0e08199e03eb9bf7b365a5c673c03407d812b91394f0d3c7564042e3f2b11d156aeea37ad6460118914125ab8f8ac466f'
self.post = post = {
'ua':self.ua,
'TPL_checkcode':'',
'CtrlVersion': '1,0,0,7',
'TPL_password':'',
'TPL_redirect_url':'http://i.taobao.com/my_taobao.htm?nekot=udm8087E1424147022443',
'TPL_username':self.username,
'loginsite':'0',
'newlogin':'0',
'from':'tb',
'fc':'default',
'style':'default',
'css_style':'',
'tid':'XOR_1_000000000000000000000000000000_625C4720470A0A050976770A',
'support':'000001',
'loginType':'4',
'minititle':'',
'minipara':'',
'umto':'NaN',
'pstrong':'3',
'llnick':'',
'sign':'',
'need_sign':'',
'isIgnore':'',
'full_redirect':'',
'popid':'',
'callback':'',
'guf':'',
'not_duplite_str':'',
'need_user_id':'',
'poy':'',
'gvfdcname':'10',
'gvfdcre':'',
'from_encoding ':'',
'sub':'',
'TPL_password_2':self.password2,
'loginASR':'1',
'loginASRSuc':'1',
'allp':'',
'oslanguage':'zh-CN',
'sr':'1366*768',
'osVer':'windows|6.1',
'naviVer':'firefox|35'
}
#將POST的數據進行編碼轉換
self.postData = urllib.urlencode(self.post)
#設置代理
self.proxy = urllib2.ProxyHandler({'http':self.proxyURL})
#設置cookie
self.cookie = cookielib.LWPCookieJar()
#設置cookie處理器
self.cookieHandler = urllib2.HTTPCookieProcessor(self.cookie)
#設置登陸時用到的opener,它的open方法至關於urllib2.urlopen
self.opener = urllib2.build_opener(self.cookieHandler,self.proxy,urllib2.HTTPHandler)
#獲得是否須要輸入驗證碼,此次請求的相應有時會不一樣,有時須要驗證有時不須要
def needIdenCode(self):
#第一次登陸獲取驗證碼嘗試,構建request
request = urllib2.Request(self.loginURL,self.postData,self.loginHeaders)
#獲得第一次登陸嘗試的相應
response = self.opener.open(request)
#獲取其中的內容
content = response.read().decode('gbk')
#獲取狀態嗎
status = response.getcode()
#狀態碼爲200,獲取成功
if status == 200:
print u"獲取請求成功"
#\u8bf7\u8f93\u5165\u9a8c\u8bc1\u7801這六個字是請輸入驗證碼的utf-8編碼
pattern = re.compile(u'\u8bf7\u8f93\u5165\u9a8c\u8bc1\u7801',re.S)
result = re.search(pattern,content)
#若是找到該字符,表明須要輸入驗證碼
if result:
print u"這次安全驗證異常,您須要輸入驗證碼"
return content
#不然不須要
else:
print u"這次安全驗證經過,您此次不須要輸入驗證碼"
return False
else:
print u"獲取請求失敗"
#獲得驗證碼圖片
def getIdenCode(self,page):
#獲得驗證碼的圖片
pattern = re.compile('<img id="J_StandardCode_m.*?src="(.*?)"',re.S)
#匹配的結果
matchResult = re.search(pattern,page)
#已經匹配獲得內容,而且驗證碼圖片連接不爲空
if matchResult and matchResult.group(1):
print matchResult.group(1)
return matchResult.group(1)
else:
print u"沒有找到驗證碼內容"
return False
#程序運行主幹
def main(self):
#是否須要驗證碼,是則獲得頁面內容,不是則返回False
needResult = self.needIdenCode()
if not needResult == False:
print u"您須要手動輸入驗證碼"
idenCode = self.getIdenCode(needResult)
#獲得了驗證碼的連接
if not idenCode == False:
print u"驗證碼獲取成功"
print u"請在瀏覽器中輸入您看到的驗證碼"
webbrowser.open_new_tab(idenCode)
#驗證碼連接爲空,無效驗證碼
else:
print u"驗證碼獲取失敗,請重試"
else:
print u"不須要輸入驗證碼"
taobao = Taobao()
taobao.main()複製代碼
#經過token得到st
def getSTbyToken(self,token):
tokenURL = 'https://passport.alipay.com/mini_apply_st.js?site=0&token=%s&callback=stCallback6' % token
request = urllib2.Request(tokenURL)
response = urllib2.urlopen(request)
#處理st,得到用戶淘寶主頁的登陸地址
pattern = re.compile('{"st":"(.*?)"}',re.S)
result = re.search(pattern,response.read())
#若是成功匹配
if result:
print u"成功獲取st碼"
#獲取st的值
st = result.group(1)
return st
else:
print u"未匹配到st"
return False複製代碼
最終運行結果
.