文的文字及图片来源于网络,仅供学习、交流使用,不具备任何商业用途,版权归原做者全部,若有问题请及时联系咱们以做处理。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复制代码
最终运行结果
.