1. 程式人生 > >12306自動刷票下單-下單

12306自動刷票下單-下單

下單

進入下單介面了
https://kyfw.12306.cn/otn/confirmPassenger/initDc
圖片.png
還有一個請求https://kyfw.12306.cn/otn/confirmPassenger/getPassengerDTOs
圖片.png
仔細看一下返回值,是我們常用聯絡人的資訊,要下單肯定得選乘客資訊嘛。這也是一個post請求,這個REPEAT_SUBMIT_TOKEN=8273d204078ad491f0face93d5c878b9很奇怪,記住,肯定是在它之上的請求中獲取的,
圖片.png
很幸運我們看它上面的那個請求initDc中就出現了,沒錯值是一樣的,又搞定一個圖片.png

選乘客票種提交

看看引數,頭暈嗎?抹掉的是姓名身份證電話資訊,除了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程式碼的,效果更好
圖片.png
前兩個引數搞定了,然後再看一下getpassengerTickets和getOldPassengers函式
圖片.png

passengerTicketStr:O,0,1,xxx,1,xxxxx,xxxxx,N
座位型別,0,票型別(成人/兒童),name,身份型別(身份證/軍官證….),身份證,電話號碼,儲存狀態
跟上面這些一一對應一下,還有一個下劃線,等你選擇兩個乘客的時候你就知道了
oldPassengerStr自己分析一下吧

再看下面的請求https://kyfw.12306.cn/otn/confirmPassenger/getQueueCount
圖片.png
train_date時間不用解釋了,train_no好像跟車次有關哦,對於未知的引數,我們一般先看前面請求的返回值,然後才是document和js請求,從查票請求的拆分結果來看2對應的就是這個,那麼下面的車次資訊也有了,seatType座位型別

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

EXM?跟上面的是同一個請求?請求確實一樣,但是返回值不一樣,看到了嗎?orderId有值了,在下一個請求中用到了

好了請求發完了,開啟瀏覽器看一下訂單吧,如果出現未支付訂單,恭喜你搞定了
圖片.png
圖片.png
補充一下我的執行結果,昨天訂票次數用完了,最終執行結果忘了截圖,今天重新執行一下,貼一下結果

番外:

  1. 我在寫的時候碰到一個特別神奇的問題,給我搞蒙了引數問題可以看一看,千萬不要犯我的這個錯誤
  2. 我在文章中提到的幾個js請求,後面跟了scriptVersion引數,我發現這個更新等倒是挺頻繁的,所以每次還是關注一下
  3. 我這個並沒有做的特別詳細,程式碼沒有整理,沒有異常處理,還有一個需求沒有寫就是判斷哪一趟車的哪種票是不是有,能不能預訂,畢竟我並不是要寫一個非常健壯的搶票軟體,就是練一練手,做做積累
  4. 高鐵票是需要選座的,我只是訂了普通的票。等以後再看吧,有需求再補上

總結

通過整篇文章想給大家提供一個思路,主要是對於請求的引數而言:
- 首先你應該知道這個引數肯定是在當前請求之前出現的,至於是在哪個請求之後出現的這個就看情況了
- 我們的引數無外乎就兩種情況,一種是伺服器發個客戶端的,一種是客戶端動態生成的。
- 當我們在前面的請求中去查詢引數的時候,我的查詢順序一般是先看xhr請求的返回值,因為這個資料是最純淨的,幾乎沒有垃圾資料。然後再從document請求中查詢,這個裡面一般是內嵌js資料,或者html資料,最後才從js請求中去分析資料,這是最麻煩的,也是現在很多反爬都鍾情的一種方式。

我在文中很多地方都提到了這個過程,簡單一筆帶過,最後整體的把思路說一下,大家反過來再看一下文章,就會意會很多O(∩_∩)O~