1. 程式人生 > >python3 requests 12306下單環節

python3 requests 12306下單環節

完成之前的登入,查票(城市編號轉換之後),重頭戲也是最複雜的環節來了,要完成下單,需要經過下列一系列驗證,且均要通過驗證,由此可見12306的反爬機制做的還是相當出色的。

需要做的依次post伺服器需要的引數後,根據response返回的內容進行判斷是否成功。

1、checkuser

post引數_json_att為空,注意返回的json,flag:true 為保持登入成功

2、點選預定

post引數 secretStr 根據檢視返回的預定號urldecode轉碼而來,python3 可使用urllib.parse.unquote來進行轉碼,train_date 出發時間,back_train_date 返程時間 , tour_flag 固定值。

3、獲取聯絡人

post的引數_json_att為空,REPEAT_SUBMIT_TOKEN在上一次請求頁面的原始碼中。由於下面截圖是後續截的,所以與上一次不同,由此可見每一次的REPEAT_SUBMIT_TOKEN都會改變,所以只要將https://kyfw.12306.cn/otn/confirmPassenger/initDc

get下來,使用正則便可以分析出來。方便後續使用。獲取的聯絡人可以將有用的資訊,買票人資訊提取出來,為後面選票人下單提供引數。

4、檢查選票人資訊

            'cancel_flag':'2', #固定值
             'bed_level_order_num':'000000000000000000000000000000', #固定值
             'passengerTicketStr':'3,0,1,xxx,1,xxxxxxxxxxxxxx,,N',   #座位型別,0,票型別(成人/兒童),name,身份型別(身份證/軍官證….),身份證,電話號碼,儲存狀態
            'oldPassengerStr':'xxx,1,xxxxxxxxxxxxxxxx,1',  #姓名  1  身份證號碼  1
            'tour_flag':'dc',   #固定值
            'randCode':'',       #隨機數
            'whatsSelect':'1',      
            '_json_att':'',    #空
            'REPEAT_SUBMIT_TOKEN': xxxxxxxxx  #上面獲取過

5、提交訂單

data={
        'train_date': 'Wed Apr 22 2018 00:00: 00 GMT + 0800',   #出發時間,注意格式
        "REPEAT_SUBMIT_TOKEN": xxxxxxxx,    #上面獲取過
        "_json_att": "",    #空
        "fromStationTelecode": fromStationTelecode,     #出發站的英文編號
        "leftTicket": leftTicket,     #和REPEAT_SUBMIT_TOKEN一樣在相同網頁獲取
        "purpose_codes": purpose_codes,    #和REPEAT_SUBMIT_TOKEN一樣在相同網頁獲取
        "seatType": '3',          #3為硬臥,具體可以檢視https://kyfw.12306.cn/otn/confirmPassenger/initDc 檢視元素可檢視
        "stationTrainCode": station_train_code,   #車次
        "toStationTelecode": to_station_telecode, #目的站的也穩編號
        "train_no": train_no,      #和REPEAT_SUBMIT_TOKEN一樣在相同網頁獲取
        'train_location':trainl_lst[2]       #車次序列號,和REPEAT_SUBMIT_TOKEN一樣在相同網頁獲取
    }

6、確認訂單

data={
        'passengerTicketStr': '3,0,1,xxx,1,xxxxxxxxxx,,N',  #選票人資訊,獲取過
        'oldPassengerStr': 'xxx,1,xxxxxxxxxxxxxxx,1_',  #獲取過
        'randCode': '',     #隨機值,空
        "purpose_codes": purpose_codes,    #獲取過
        "key_check_isChange": key_check_isChange,   #和REPEAT_SUBMIT_TOKEN一樣在相同網頁獲取
        "leftTicketStr": leftTicket,    #獲取過
        'train_location': trainl_lst[2],     #獲取過
        'choose_seats':'',       #座位型別,一般是高鐵用
        'roomType': '00',     #固定值
        'dwAll': 'N',       #固定值
        "_json_att": "",  #空
        'seatDetailType':'000',       #固定值
        'whatsSelect': '1',      #固定值
        "REPEAT_SUBMIT_TOKEN": ticketToken,     #獲取過
    }

7、排隊等待

第一次post:

第二次post:

第一次和第二次post引數相同,但是第二次返回json中多了一個orderid,在訂單結果中使用。

data={"REPEAT_SUBMIT_TOKEN": ticketToken,    #獲取過
                                           "_json_att": "",   #空
                                           "random": str(time.time()),   #隨機值
                                           "tourFlag": "dc"  #固定值
                                           }

8、訂單結果

data={
        "REPEAT_SUBMIT_TOKEN": ticketToken,   #獲取過
        "_json_att": "", #空
        "orderSequence_no": orderId    #獲取到排隊等待response中的orderid
    }

執行效果:由於要到五一節了,應該很多人買票,我設定的排隊等待一個死迴圈,當獲取orderid後跳出,所以一直在排隊等待獲得orderid,所以我沒等訂單提交成功了,去12306官網登入檢視剛才下的訂單也是在排隊中。只要等到orderid,便可以到訂單結果,之後呢,可以通過阿里大於的API來電話或簡訊通知下單的使用者去支付訂單即可完成購票。(二維碼的話,可以去打碼平臺完成自動識別)

好了,關於12306的購票的學習到此告一段落,就單純自己玩玩,之前都是做筆記,以後可以多寫點部落格啦。

5月6號試驗補充:

登入12306官網檢視: