大家好,欢迎来到IT知识分享网。
一、淘宝登录流程
二、模拟登录实现
上面我们只讲了大概的登录流程,这里猪哥会先详细讲解下每一步的操作,然后再贴出实现代码!
1.判断是否需要验证码
图中我们可以看到这次post请求上传了两个参数:username、ua!
ua为浏览器、ip、设备信息等多信息加密参数,所以猜想淘宝的验证码是否出现不仅仅从账号角度,还有ip、设备等角度!
3.申请st码
上面我们已经申请到了淘宝(taobao.com)的token,这一步就是用token来换取st码。
到这里很多人可能会有疑问:为什么淘宝登录需要这么麻烦呢?直接在 taobao.com 登录不就可以吗?为什么要先在taobao验证用户名密码,通过之后再去 alibaba.com 换取st码登录呢?
任何公司的框架都是慢慢演变的结果,我想最开始的淘宝登录肯定没这么复杂。但是随着阿里巴巴的慢慢壮大,很多事业线都划分开来,但是这些事业线之间又有关联性,比如用户登录了淘宝账号之后天猫就不需要再登录了呢?(注意淘宝和天猫的顶级域名不同,所以不能共享cookis)为了解决这个问题,单点登录就出现了。
我们再回来分析淘宝登录为何要如此复杂就很好理解了:用户数据在淘宝这里,所以需要现在淘宝(taobao.com)验证用户名和密码,验证通过生成一个token,浏览器拿着token去和阿里巴巴(alibaba.com)申请单点登录码(st码),阿里巴巴收到请求验证token通过则返回st码,所以用token换st码的原因就在于单点登录!
5.获取淘宝昵称
三、总结
整体讲完之后我们来稍微总结一下吧,主要从代码结构和存在的问题两个方面说下:
1.代码结构
完整代码
import re
import os
import json
import requests
'''
遇到不懂的问题?Python学习交流群:1136201545满足你的需求,资料都已经上传群文件,可以自行下载!
'''
s = requests.Session()
# cookies序列化文件
COOKIES_FILE_PATH = 'taobao_login_cookies.txt'
class UsernameLogin:
def __init__(self, username, ua, TPL_password2):
"""
账号登录对象
:param username: 用户名
:param ua: 淘宝的ua参数
:param TPL_password2: 加密后的密码
"""
# 检测是否需要验证码的URL
self.user_check_url = 'https://login.taobao.com/member/request_nick_check.do?_input_charset=utf-8'
# 验证淘宝用户名密码URL
self.verify_password_url = "https://login.taobao.com/member/login.jhtml"
# 访问st码URL
self.vst_url = 'https://login.taobao.com/member/vst.htm?st={}'
# 淘宝个人 主页
self.my_taobao_url = 'http://i.taobao.com/my_taobao.htm'
# 淘宝用户名
self.username = username
# 淘宝关键参数,包含用户浏览器等一些信息,很多地方会使用,从浏览器或抓包工具中复制,可重复使用
self.ua = ua
# 加密后的密码,从浏览器或抓包工具中复制,可重复使用
self.TPL_password2 = TPL_password2
# 请求超时时间
self.timeout = 3
def _user_check(self):
"""
检测账号是否需要验证码
:return:
"""
data = {
'username': self.username,
'ua': self.ua
}
try:
response = s.post(self.user_check_url, data=data, timeout=self.timeout)
response.raise_for_status()
except Exception as e:
print('检测是否需要验证码请求失败,原因:')
raise e
needcode = response.json()['needcode']
print('是否需要滑块验证:{}'.format(needcode))
return needcode
def _verify_password(self):
"""
验证用户名密码,并获取st码申请URL
:return: 验证成功返回st码申请地址
"""
verify_password_headers = {
'Connection': 'keep-alive',
'Cache-Control': 'max-age=0',
'Origin': 'https://login.taobao.com',
'Upgrade-Insecure-Requests': '1',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36',
'Content-Type': 'application/x-www-form-urlencoded',
'Referer': 'https://login.taobao.com/member/login.jhtml?from=taobaoindex&f=top&style=&sub=true&redirect_url=https%3A%2F%2Fi.taobao.com%2Fmy_taobao.htm',
}
# 登录toabao.com提交的数据,如果登录失败,可以从浏览器复制你的form data
verify_password_data = {
'TPL_username': self.username,
'ncoToken': 'cdf05a89ad5104403ebb12ebc9b7626af277b066',
'slideCodeShow': 'false',
'useMobile': 'false',
'lang': 'zh_CN',
'loginsite': 0,
'newlogin': 0,
'TPL_redirect_url': 'https://s.taobao.com/search?q=%E9%80%9F%E5%BA%A6%E9%80%9F%E5%BA%A6&imgfile=&commend=all&ssid=s5-e&search_type=item&sourceId=tb.index&spm=a21bo.2017.201856-taobao-item.1&ie=utf8&initiative_id=tbindexz_20170306',
'from': 'tb',
'fc': 'default',
'style': 'default',
'keyLogin': 'false',
'qrLogin': 'true',
'newMini': 'false',
'newMini2': 'false',
'loginType': '3',
'gvfdcname': '10',
'gvfdcre': '68747470733A2F2F6C6F67696E2E74616F62616F2E636F6D2F6D656D6265722F6C6F676F75742E6A68746D6C3F73706D3D61323330722E312E3735343839343433372E372E33353836363032633279704A767526663D746F70266F75743D7472756526726564697265637455524C3D6874747073253341253246253246732E74616F62616F2E636F6D25324673656172636825334671253344253235453925323538302532353946253235453525323542412532354136253235453925323538302532353946253235453525323542412532354136253236696D6766696C65253344253236636F6D6D656E64253344616C6C2532367373696425334473352D652532367365617263685F747970652533446974656D253236736F75726365496425334474622E696E64657825323673706D253344613231626F2E323031372E3230313835362D74616F62616F2D6974656D2E31253236696525334475746638253236696E69746961746976655F69642533447462696E6465787A5F3230313730333036',
'TPL_password_2': self.TPL_password2,
'loginASR': '1',
'loginASRSuc': '1',
'oslanguage': 'zh-CN',
'sr': '1440*900',
'osVer': 'macos|10.145',
'naviVer': 'chrome|76.038091',
'osACN': 'Mozilla',
'osAV': '5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36',
'osPF': 'MacIntel',
'appkey': '00000000',
'mobileLoginLink': 'https://login.taobao.com/member/login.jhtml?redirectURL=https://s.taobao.com/search?q=%E9%80%9F%E5%BA%A6%E9%80%9F%E5%BA%A6&imgfile=&commend=all&ssid=s5-e&search_type=item&sourceId=tb.index&spm=a21bo.2017.201856-taobao-item.1&ie=utf8&initiative_id=tbindexz_20170306&useMobile=true',
'showAssistantLink': '',
'um_token': 'T898C0FDF1A3CEE5389D682340C5F299FFE590F51543C8E3DDA8341C869',
'ua': self.ua
}
try:
response = s.post(self.verify_password_url, headers=verify_password_headers, data=verify_password_data,
timeout=self.timeout)
response.raise_for_status()
# 从返回的页面中提取申请st码地址
except Exception as e:
print('验证用户名和密码请求失败,原因:')
raise e
# 提取申请st码url
apply_st_url_match = re.search(r'<script src="(.*?)"></script>', response.text)
# 存在则返回
if apply_st_url_match:
print('验证用户名密码成功,st码申请地址:{}'.format(apply_st_url_match.group(1)))
return apply_st_url_match.group(1)
else:
raise RuntimeError('用户名密码验证失败!response:{}'.format(response.text))
def _apply_st(self):
"""
申请st码
:return: st码
"""
apply_st_url = self._verify_password()
try:
response = s.get(apply_st_url)
response.raise_for_status()
except Exception as e:
print('申请st码请求失败,原因:')
raise e
st_match = re.search(r'"data":{"st":"(.*?)"}', response.text)
if st_match:
print('获取st码成功,st码:{}'.format(st_match.group(1)))
return st_match.group(1)
else:
raise RuntimeError('获取st码失败!response:{}'.format(response.text))
def login(self):
"""
使用st码登录
:return:
"""
# 加载cookies文件
if self._load_cookies():
return True
# 判断是否需要滑块验证
self._user_check()
st = self._apply_st()
headers = {
'Host': 'login.taobao.com',
'Connection': 'Keep-Alive',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
}
try:
response = s.get(self.vst_url.format(st), headers=headers)
response.raise_for_status()
except Exception as e:
print('st码登录请求,原因:')
raise e
# 登录成功,提取跳转淘宝用户主页url
my_taobao_match = re.search(r'top.location.href = "(.*?)"', response.text)
if my_taobao_match:
print('登录淘宝成功,跳转链接:{}'.format(my_taobao_match.group(1)))
self._serialization_cookies()
return True
else:
raise RuntimeError('登录失败!response:{}'.format(response.text))
def _load_cookies(self):
# 1、判断cookies序列化文件是否存在
if not os.path.exists(COOKIES_FILE_PATH):
return False
# 2、加载cookies
s.cookies = self._deserialization_cookies()
# 3、判断cookies是否过期
try:
self.get_taobao_nick_name()
except Exception as e:
os.remove(COOKIES_FILE_PATH)
print('cookies过期,删除cookies文件!')
return False
print('加载淘宝登录cookies成功!!!')
return True
def _serialization_cookies(self):
"""
序列化cookies
:return:
"""
cookies_dict = requests.utils.dict_from_cookiejar(s.cookies)
with open(COOKIES_FILE_PATH, 'w+', encoding='utf-8') as file:
json.dump(cookies_dict, file)
print('保存cookies文件成功!')
def _deserialization_cookies(self):
"""
反序列化cookies
:return:
"""
with open(COOKIES_FILE_PATH, 'r+', encoding='utf-8') as file:
cookies_dict = json.load(file)
cookies = requests.utils.cookiejar_from_dict(cookies_dict)
return cookies
def get_taobao_nick_name(self):
"""
获取淘宝昵称
:return: 淘宝昵称
"""
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
}
try:
response = s.get(self.my_taobao_url, headers=headers)
response.raise_for_status()
except Exception as e:
print('获取淘宝主页请求失败!原因:')
raise e
# 提取淘宝昵称
nick_name_match = re.search(r'<input id="mtb-nickname" type="hidden" value="(.*?)"/>', response.text)
if nick_name_match:
print('登录淘宝成功,你的用户名是:{}'.format(nick_name_match.group(1)))
return nick_name_match.group(1)
else:
raise RuntimeError('获取淘宝昵称失败!response:{}'.format(response.text))
if __name__ == '__main__':
# 淘宝用户名
username = '你的用户名'
# 淘宝重要参数,从浏览器或抓包工具中复制,可重复使用
ua = ua = '119#MlKma56msEckrMMzpwSCmgNzxbdQaRlcBPmaXIoz1usOCPPTlaAYXAvkIAl6Tg2dmQPTrKdo29CxyU/mLlGMarUsz9bGztA8RJBONt7J9CiLfBMKME3fx2Nqk/xMdGLWRU6O8t7M5x2omSgOwtNLfU+S4lkGdoHsRIVXNEFL9eAzMSTozSo8uJOqBtmOyaHCRSVJcF8L8xqzRBsUdA3q9U+SLgR+deF7yJShN8lL9dXzRPqLo+Y8q2vp499wde3lR2KVt9kLEhEzR/sU3AFh9UNltxhLSHr8y2SVNEH093ASRPSM2IRe9/sdLUq7+MMOqC9gSCqOfoerT6smYcVg5JqMfCr70SmjkQVwgE7l+3grCrjB6Sc4xGvCtyLxy197yTuyzTUCQL3ItdRejyQq8hPbRuvwxi68oUWwdilfcUAQc0yTRhWEcwDbcFvDFG+nYdPvylWaIOAGUlsrTKWdppT7iLVsNH/Fnh088EtTbL+pBSbjWj5Pa8/fnARp/MZ6BEmHE+mDR7RDvhJfdhNaxHrGadtaGmbVvHYo0oR6wWqiOkSfH2vD9TqEpp4amiEByxXMG+JMFNin+TFzA/FxLpIqGUzIO/vKtVv6jhy0GWosbEz1YHSkXkPM8m455opHcnWeKNtKQSUGtljeUW4da8T7SeEE1DZjeQBqZagX2CVkZqSMeTE5slss8IYeC0FL14tBih8cLP+zuAEikLq35Fv9e75A/p+Yp2Qb8PZoacMTxyhxOMvJZ64+RxSTQskuJx4GIbifdptOpIUdiwe+BSh3k9nq6WEEaP0eX6u9ZXoSLs7BoZtHJ74Mu2Au+q+zAHG4fUBGKdOvLb/7iwy3yXofRIUsKNFnADN/sezd4l0/aZfcFL9LicBF3SMKBJkgagHgzLkjZfOiWs68UtO0MAIHMSyI3zrG+QdZRehgbbjGYLlwzbfEzToF1aKi+2t8wdUORclDXthMsTTzb5bhCcJjwY/Ms8+0STdOUsC6paC9svXcF7pPxuTtGY/7IWM260DuzGDYe8Q9GU2zFrFVyiYXBjY3ZGmfgsuMP/iDswoO23eucC9dYHRoK0IMHHHDOFDMAA016r400YX6eg47FIVexIF1pNCzhZvXTnBCbDgTT6nvcokIWAyd0kVwH33Sgap4Z3rj5rQyaAVwsUpH2hjve0lBNasoMfOr/hUuyIS5DHodjsZCO+nKqRKEPUryHf7Ma9v5g5J46kF5lL0aJMf6kxJhcSvaNMa4dWVhsk3UyDPG5xdRZBO6e2OlimMoN7f8AbVfZF9LJrBiVSgDWgq1zBC/tNhg7Wm+aLf+VxbtAxr1CjtSt89mGdDCUr9LWftfHyncXh1ub6A2HRBcfah9M/Rru13An1WGWqOf8Xh7QSRdDn3fOEVl/SesmxJyDKkE61/Ri3h7h+W2n87nmgIaAIVg8ovsFIN0OZm6J2CyxgCjis2GuCLurnSCAFgiRsm9IP6PQLk5/3llWSrFmVoDDtfJD9P5apjuae5IqWfJWiMfvyEfTevqmufTTTS+w74lFv6OSHMK3yI5P0Z1/CYipvytIx+l8X6SHj19NizLJPWkMimJXAp4Fy3hebN85g5N7oYrjdDYonYrIo0eN1Ps6iCIz5dOCRPd0GIWpMSsFDx9IzVcwUzdU0Wfa+zmMpBsPHquxm/pJTkSV/KVEQf4cw7Q'
# 加密后的密码,从浏览器或抓包工具中复制,可重复使用
TPL_password2 = '8a65e84dbd099e3eb728bfbbbf6ecb2b759b50745120e186ad94b171e369dac0d877d0c816d49898ea166d2842469dcec0435e88d4f534ee502967eafd30976ca0424f9c4a65bfb8b27c1cd8cf68a3c94be4fb7bd4102095f34cfbfca2649eee9ac3ee3d2785789fc4de15279cfab6d6984c90ab557bb1ee83c187a4fd25698d'
ul = UsernameLogin(username, ua, TPL_password2)
ul.login()
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/127312.html