下單
進入下單界面了
https://kyfw.12306.cn/otn/confirmPassenger/initDc

還有一個請求https://kyfw.12306.cn/otn/confirmPassenger/getPassengerDTOs

仔細看一下返回值,是我們常用聯系人的信息,要下單肯定得選乘客信息嘛。這也是一個post請求,這個REPEAT_SUBMIT_TOKEN=8273d204078ad491f0face93d5c878b9很奇怪,記住,肯定是在它之上的請求中獲取的,

,很幸運我們看它上面的那個請求initDc中就出現了,沒錯值是一樣的,又搞定一個

選乘客票種提交
https://kyfw.12306.cn/otn/confirmPassenger/checkOrderInfo

看看參數,頭暈嗎?抹掉的是姓名身份證電話信息,除了REPEAT_SUBMIT_TOKEN和空參數,其他的一頭霧水,你發現REPEAT_SUBMIT_TOKEN和上面的不一樣了是吧,其實是一樣的,因為我是寫完一部分才進行下面的操作,時間長導致登錄失效,所以提交的時候要求重新登錄,這個REPEAT_SUBMIT_TOKEN參數就不一樣了,也說明這個參數是每次都變化的。
請求有發送的地方,這些參數也必然有填充的地方,向上找,不要放過任何一個請求,css和img請求就算了,然后我們找到了https://kyfw.12306.cn/otn/resources/merged/passengerInfo_js.js?scriptVersion=1.9053
格式化一下,最好是找在線格式化JavaScript代碼的,效果更好

前兩個參數搞定了,然后再看一下getpassengerTickets和getOldPassengers函數

passengerTicketStr:O,0,1,xxx,1,xxxxx,xxxxx,N
座位類型,0,票類型(成人/兒童),name,身份類型(身份證/軍官證....),身份證,電話號碼,保存狀態
跟上面這些一一對應一下,還有一個下划線,等你選擇兩個乘客的時候你就知道了
oldPassengerStr自己分析一下吧
再看下面的請求https://kyfw.12306.cn/otn/confirmPassenger/getQueueCount

train_date時間不用解釋了,train_no好像跟車次有關哦,對於未知的參數,我們一般先看前面請求的返回值,然后才是document和js請求,從查票請求的拆分結果來看2對應的就是這個,那么下面的車次信息也有了,seatType座位類型

我們前面已經知道了,起始站編號和目的地編號我們也知道,train_location可以在查票信息中找到第15個,這里主要看一下leftTicket參數,同樣的道理,在之前的請求中查找,我們發現initDc這個請求中搜到了這個值,key_check_isChange在下面用到(主要是看value值,這里為了截圖重新截的圖,所以value值不一樣,正常的情況是一樣的,不用擔心)

https://kyfw.12306.cn/otn/confirmPassenger/confirmSingleForQueue

看一下請求參數,所有參數在之前都找到了,包括key_check_isChange

請求參數非常明顯,random是隨機參數,其他的不用再說了
下一個請求
https://kyfw.12306.cn/otn/confirmPassenger/queryOrderWaitTime?random=1512295213365&tourFlag=dc&_json_att=&REPEAT_SUBMIT_TOKEN=56d3de8fe05b24a2daa92c0351df6cd2

EXM?跟上面的是同一個請求?請求確實一樣,但是返回值不一樣,看到了嗎?orderId有值了,在下一個請求中用到了
https://kyfw.12306.cn/otn/confirmPassenger/resultOrderForDcQueue

好了請求發完了,打開瀏覽器看一下訂單吧,如果出現未支付訂單,恭喜你搞定了


補充一下我的執行結果,昨天訂票次數用完了,最終執行結果忘了截圖,截圖重新運行一下,貼一下結果。
番外:
- 有一些參數我在做的時候並沒有詳細去追根究底,如果你有興趣可以看一看
https://kyfw.12306.cn/otn/resources/merged/queryLeftTicket_js.js?scriptVersion=1.9053
圖片.png
寫博客的時候翻到了這個js,又在里面找到了一些參數的根源 - 我在寫的時候碰到一個特別神奇的問題,給我搞蒙了參數問題可以看一看,千萬不要犯我的這個錯誤
- 我在文章中提到的幾個js請求,后面跟了scriptVersion參數,我發現這個更新等倒是挺頻繁的,所以每次還是關注一下
- 我這個並沒有做的特別詳細,代碼沒有整理,沒有異常處理,還有一個需求沒有寫就是判斷哪一趟車的哪種票是不是有,能不能預訂,畢竟我並不是要寫一個非常健壯的搶票軟件,就是練一練手,做做積累
- 高鐵票是需要選座的,我只是訂了普通的票。等以后再看吧,有需求再補上
總結
通過整篇文章想給大家提供一個思路,主要是對於請求的參數而言:
- 首先你應該知道這個參數肯定是在當前請求之前出現的,至於是在哪個請求之后出現的這個就看情況了
- 我們的參數無外乎就兩種情況,一種是服務器發個客戶端的,一種是客戶端動態生成的。
- 當我們在前面的請求中去查找參數的時候,我的查找順序一般是先看xhr請求的返回值,因為這個數據是最純凈的,幾乎沒有垃圾數據。然后再從document請求中查找,這個里面一般是內嵌js數據,或者html數據,最后才從js請求中去分析數據,這是最麻煩的,也是現在很多反爬都鍾情的一種方式。
我在文中很多地方都提到了這個過程,簡單一筆帶過,最后整體的把思路說一下,大家反過來再看一下文章,就會意會很多O(∩_∩)O~
如果你覺得我的文章還可以,可以關注我的微信公眾號:Python爬蟲實戰之路
也可以掃描下面二維碼,添加我的微信號

