1. 程式人生 > >關於搶火車票的那些事兒(三)

關於搶火車票的那些事兒(三)

關於搶火車票的那些事兒(三)

上一節 中我們順利登陸了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

這時候我們會收到驗證通過的資料:

恭喜你,這次是真正成功登陸了~