关于抢火车票的那些事儿(三)
上一节 中我们顺利登陆了12306,但是你以为这样就顺利登陆了?
那么你就错了。。
登陆之后你还需要进行两步的验证,不然在进行其他操作的时候就容易被要求重新登陆。
上一节我们收到了数据
{'result_message': '登录成功', 'result_code': 0, 'uamtk': 'g-lT6rQ5XVZsZUTOKyohI46jpJR38fma2_IBxdAfyX8-bS6ldq4140'}
'uamtk'看起来这么复杂,应该是有用的?
是的,这个在我们的第一次验证里要用到,这是一个环环相扣的过程、
Step1:
用
uamtk做Cookie去做第一次验证。
Fiddler捕捉登陆后的第一次验证过程:
self.session.cookies['uamtk'] = loginResult['uamtk']
#4 用户登录第一次验证+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
url = message.firstLoginVerifyUrl
data = {
'appid': 'otn'
}
response = self.session.post(url, data=data,)
userVerify = response.json()
print('第一次验证')
print(userVerify)
if userVerify['result_code'] != 0:
print('验证失败(uamtk) code:{}'.format(userVerify['result_code']))
这样我们会得到第一步验证的结果
这时我们会看到收到的回复数据表示我们第一次验证通过了,同时我们看到apptk这个字段好像还要用的样子。
没错,我们第二次验证的时候需要它。
Step2:
Fiddler捕捉登陆后的第二次验证过程:
向验证url Post 第一步验证返回给我们的数据,可以参考以下代码:
def secLoginVerify(self,newapptk):
print('第二次验证')
newAppTkErrorCount = 0
url = message.secLoginVerifyUrl
data = {
'tk': newapptk
}
while True:
if newAppTkErrorCount > 15:
print('newAppTk获取失败,退出程序')
sys.exit()
response = self.session.post(url, data = data)
try:
verifyResult = response.json()
print(verifyResult)
return verifyResult
except: #json.decoder.JSONDecodeError:
newAppTkErrorCount += 1
这时候我们会收到验证通过的数据: