下單
進(jìn)入下單界面了
https://kyfw.12306.cn/otn/confirmPassenger/initDc
還有一個(gè)請(qǐng)求https://kyfw.12306.cn/otn/confirmPassenger/getPassengerDTOs
仔細(xì)看一下返回值,是我們常用聯(lián)系人的信息,要下單肯定得選乘客信息嘛慢洋。這也是一個(gè)post請(qǐng)求抵蚊,這個(gè)REPEAT_SUBMIT_TOKEN=8273d204078ad491f0face93d5c878b9很奇怪张足,記住愿险,肯定是在它之上的請(qǐng)求中獲取的旺拉,
選乘客票種提交
https://kyfw.12306.cn/otn/confirmPassenger/checkOrderInfo
看看參數(shù)充坑,頭暈嗎减江?抹掉的是姓名身份證電話信息,除了REPEAT_SUBMIT_TOKEN和空參數(shù)捻爷,其他的一頭霧水辈灼,你發(fā)現(xiàn)REPEAT_SUBMIT_TOKEN和上面的不一樣了是吧,其實(shí)是一樣的也榄,因?yàn)槲沂菍懲暌徊糠植胚M(jìn)行下面的操作巡莹,時(shí)間長導(dǎo)致登錄失效,所以提交的時(shí)候要求重新登錄甜紫,這個(gè)REPEAT_SUBMIT_TOKEN參數(shù)就不一樣了降宅,也說明這個(gè)參數(shù)是每次都變化的。
請(qǐng)求有發(fā)送的地方囚霸,這些參數(shù)也必然有填充的地方腰根,向上找,不要放過任何一個(gè)請(qǐng)求拓型,css和img請(qǐng)求就算了额嘿,然后我們找到了https://kyfw.12306.cn/otn/resources/merged/passengerInfo_js.js?scriptVersion=1.9053
格式化一下,最好是找在線格式化JavaScript代碼的劣挫,效果更好
前兩個(gè)參數(shù)搞定了册养,然后再看一下getpassengerTickets和getOldPassengers函數(shù)
passengerTicketStr:O,0,1,xxx,1,xxxxx,xxxxx,N
座位類型,0,票類型(成人/兒童),name,身份類型(身份證/軍官證....),身份證,電話號(hào)碼,保存狀態(tài)
跟上面這些一一對(duì)應(yīng)一下,還有一個(gè)下劃線压固,等你選擇兩個(gè)乘客的時(shí)候你就知道了
oldPassengerStr自己分析一下吧
再看下面的請(qǐng)求https://kyfw.12306.cn/otn/confirmPassenger/getQueueCount
train_date時(shí)間不用解釋了球拦,train_no好像跟車次有關(guān)哦,對(duì)于未知的參數(shù),我們一般先看前面請(qǐng)求的返回值坎炼,然后才是document和js請(qǐng)求愧膀,從查票請(qǐng)求的拆分結(jié)果來看2對(duì)應(yīng)的就是這個(gè),那么下面的車次信息也有了点弯,seatType座位類型
起始站編號(hào)和目的地編號(hào)我們也知道扇调,train_location可以在查票信息中找到第15個(gè),這里主要看一下leftTicket參數(shù)抢肛,同樣的道理狼钮,在之前的請(qǐng)求中查找,我們發(fā)現(xiàn)initDc這個(gè)請(qǐng)求中搜到了這個(gè)值捡絮,key_check_isChange在下面用到(主要是看value值熬芜,這里為了截圖重新截的圖,所以value值不一樣福稳,正常的情況是一樣的涎拉,不用擔(dān)心)
https://kyfw.12306.cn/otn/confirmPassenger/confirmSingleForQueue
看一下請(qǐng)求參數(shù),所有參數(shù)在之前都找到了的圆,包括key_check_isChange
請(qǐng)求參數(shù)非常明顯鼓拧,random是隨機(jī)參數(shù),其他的不用再說了
下一個(gè)請(qǐng)求
https://kyfw.12306.cn/otn/confirmPassenger/queryOrderWaitTime?random=1512295213365&tourFlag=dc&_json_att=&REPEAT_SUBMIT_TOKEN=56d3de8fe05b24a2daa92c0351df6cd2
EXM越妈?跟上面的是同一個(gè)請(qǐng)求季俩?請(qǐng)求確實(shí)一樣,但是返回值不一樣梅掠,看到了嗎酌住?orderId有值了,在下一個(gè)請(qǐng)求中用到了
https://kyfw.12306.cn/otn/confirmPassenger/resultOrderForDcQueue
好了請(qǐng)求發(fā)完了阎抒,打開瀏覽器看一下訂單吧酪我,如果出現(xiàn)未支付訂單,恭喜你搞定了
補(bǔ)充一下我的執(zhí)行結(jié)果且叁,昨天訂票次數(shù)用完了都哭,最終執(zhí)行結(jié)果忘了截圖,截圖重新運(yùn)行一下逞带,貼一下結(jié)果
番外:
- 有一些參數(shù)我在做的時(shí)候并沒有詳細(xì)去追根究底质涛,如果你有興趣可以看一看
https://kyfw.12306.cn/otn/resources/merged/queryLeftTicket_js.js?scriptVersion=1.9053
寫博客的時(shí)候翻到了這個(gè)js,又在里面找到了一些參數(shù)的根源 - 我在寫的時(shí)候碰到一個(gè)特別神奇的問題掰担,給我搞蒙了參數(shù)問題可以看一看,千萬不要犯我的這個(gè)錯(cuò)誤
- 我在文章中提到的幾個(gè)js請(qǐng)求怒炸,后面跟了scriptVersion參數(shù)带饱,我發(fā)現(xiàn)這個(gè)更新等倒是挺頻繁的,所以每次還是關(guān)注一下
- 我這個(gè)并沒有做的特別詳細(xì),代碼沒有整理勺疼,沒有異常處理教寂,還有一個(gè)需求沒有寫就是判斷哪一趟車的哪種票是不是有,能不能預(yù)訂执庐,畢竟我并不是要寫一個(gè)非常健壯的搶票軟件酪耕,就是練一練手,做做積累
- 高鐵票是需要選座的轨淌,我只是訂了普通的票迂烁。等以后再看吧,有需求再補(bǔ)上
總結(jié)
通過整篇文章想給大家提供一個(gè)思路递鹉,主要是對(duì)于請(qǐng)求的參數(shù)而言:
- 首先你應(yīng)該知道這個(gè)參數(shù)肯定是在當(dāng)前請(qǐng)求之前出現(xiàn)的盟步,至于是在哪個(gè)請(qǐng)求之后出現(xiàn)的這個(gè)就看情況了
- 我們的參數(shù)無外乎就兩種情況,一種是服務(wù)器發(fā)個(gè)客戶端的躏结,一種是客戶端動(dòng)態(tài)生成的却盘。
- 當(dāng)我們?cè)谇懊娴恼?qǐng)求中去查找參數(shù)的時(shí)候,我的查找順序一般是先看xhr請(qǐng)求的返回值媳拴,因?yàn)檫@個(gè)數(shù)據(jù)是最純凈的黄橘,幾乎沒有垃圾數(shù)據(jù)。然后再從document請(qǐng)求中查找屈溉,這個(gè)里面一般是內(nèi)嵌js數(shù)據(jù)塞关,或者h(yuǎn)tml數(shù)據(jù),最后才從js請(qǐng)求中去分析數(shù)據(jù)语婴,這是最麻煩的描孟,也是現(xiàn)在很多反爬都鐘情的一種方式。
我在文中很多地方都提到了這個(gè)過程砰左,簡單一筆帶過匿醒,最后整體的把思路說一下,大家反過來再看一下文章缠导,就會(huì)意會(huì)很多O(∩_∩)O~
已經(jīng)轉(zhuǎn)戰(zhàn)頭條了廉羔,不在這個(gè)平臺(tái)寫了,TT號(hào):Python集結(jié)號(hào)