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官網檢視: