关于抢火车票的那些事儿(三)

关于抢火车票的那些事儿(三)

上一节 中我们顺利登陆了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

这时候我们会收到验证通过的数据:

恭喜你,这次是真正成功登陆了~

猜你喜欢

转载自blog.csdn.net/linlin003/article/details/79360003