基於HTTPS協議的12306搶票軟體設計與實現--相關介面以及資料格式
http://blog.csdn.net/chaofanwei/article/details/18769159
直接步入正題吧,在這主要想說下現在的12306各個功能的介面以及資料格式。主要分為登入,獲取聯絡人,查票,預定,查詢未完成訂單五個模組,至於其他的一些介面不重要,可以直接忽略,比如檢測驗證碼是否正確,請求車票剩餘個數等等,本文併為寫出來,有需求的可以自行研究。
一、登入
登入主要是獲取session,保持與伺服器端通訊。登入主要有兩個步驟
第一 獲取登入驗證碼
方法:GET
介面:
引數:照抄,一樣的
返回:二進位制圖片流
第二 登入
方法:POST
介面:https://kyfw.12306.cn/otn/login/loginAysnSuggest
引數:1、loginUserDTO.user_name 使用者名稱
2、randCode 驗證碼
3、userDTO.password 密碼
返回:json字串,可判斷是否登入成功
二、獲取聯絡人
方法:GET
介面:https://kyfw.12306.cn/otn/passengers/init
引數:無
返回:html檔案,裡面能夠找到一個變數,是json格式的,能夠解析成user物件
三、查票
方法:GET
介面:https://kyfw.12306.cn/otn/leftTicket/query?
引數:leftTicketDTO.train_date:查票日期
leftTicketDTO.from_station:起始站(字母代號)
leftTicketDTO.to_station:目的站(字母代號)
purpose_codes:ADULT
返回:返回json格式,直接解析
四、預定
第一:預提交
方法:POST
介面:https://kyfw.12306.cn/otn/leftTicket/submitOrderRequest
引數:secretStr:從查票中獲得(每個車次對應一個,並且每次都不一樣,需要實時解析)
train_date:訂票日期
back_train_date:返程日期
tour_flag: dc
purpose_codes:ADULT
query_from_station_name:出發站
query_to_station_name:目的站
undefined:空字串
返回:返回json格式,判斷是否提交成功
第二:獲取相應引數
方法:POST
介面:https://kyfw.12306.cn/otn/confirmPassenger/initDc
引數:
_json_att:空字串
返回:html檔案,在前幾行解析globalRepeatSubmitToken 下面有用,以及從下面獲取ticketInfoForPassengerForm變數的值,是個json格式,從中獲取purpose_codes,key_check_isChange,leftTicketStr,train_location為下面提交做準備
第三:獲取提交驗證碼
方法:GET
介面:https://kyfw.12306.cn/otn/passcodeNew/getPassCodeNew.do?module=passenger&rand=randp&
引數:
無
返回:和登入驗證碼一樣,返回圖片二進位制流
第四:檢測是否可以確認提交
方法:POST
介面:https://kyfw.12306.cn/otn/confirmPassenger/checkOrderInfo
引數:
cancel_flag:2
bed_level_order_num:000000000000000000000000000000
passengerTicketStr:座位型別,0,車票型別,姓名,身份正號,電話,N(多個的話,以逗號分隔)
oldPassengerStr:姓名,證件類別,證件號碼,使用者型別
randCode:預定驗證碼
tour_flag:dc
_json_att:空字串
REPEAT_SUBMIT_TOKEN:從上一步獲取
返回:json格式,判斷是否可以提交
第五:確認提交
方法:POST
介面:https://kyfw.12306.cn/otn/confirmPassenger/confirmSingleForQueue
引數:
passengerTicketStr:座位型別,0,車票型別,姓名,身份正號,電話,N(多個的話,以逗號分隔)
oldPassengerStr:姓名,證件類別,證件號碼,使用者型別
randCode:預定驗證碼
purpose_codes:第3步獲取
key_check_isChange:同上
leftTicketStr;同上
train_location;同上
REPEAT_SUBMIT_TOKEN:同上
_json_att:空字串
返回:json格式,判斷是否提交成功,並返回等待時間,每隔一定時間段呼叫第六步返回處理結果
第六:輪詢獲取提交結果
方法:GET
介面:https://kyfw.12306.cn/otn/confirmPassenger/queryOrderWaitTime?
引數:
random:隨機數字
tourFlag:dc
REPEAT_SUBMIT_TOKEN:有第三部獲取
_json_att:空字串
返回:json格式,返回等待時間,如果waitTime小於0,則獲取訂單資訊orderId,如果大於0,則繼續輪詢
五、查詢未完成訂單
方法:POST
介面:https://kyfw.12306.cn/otn/queryOrder/queryMyOrderNoComplete
引數:
_json_att:空字串
返回:json格式,包含訂單資訊,直接解析
說到這,5個功能基本就介紹了,但現在貼出來只是為了學習使用,不會惡意攻擊,況且,12306網站介面更改很頻繁,現在貼出來的介面說不定明天就 被改了,所以重要的其實還是學會怎麼抓取相關介面和資料,以及從資料中進行分析獲取相應的引數,相應的結果。在這裡我主要用了firebug,chrom瀏覽器自帶 的網路分析工具,以及fiddler和wireshark工具,相關工具使用說明,就自己在網上找吧。
最後在吐槽一下吧,12306網站用到了cdn靜態快取技術,會導致在不同的區域,頻寬,負載下根據負載均衡選擇相應的伺服器,也就是說全國各地有很多的12306伺服器 每個使用者訪問的可能伺服器是不樣的,但只是靜態頁面和js、css和圖片等,但各個伺服器直接會保持session共享的,也就是在其中一臺伺服器登陸的話,在別的伺服器 上面也相當於已經登陸了。所以最好能夠動態選擇伺服器,使快取時間最新,壓力最小,資料更實時很重要。在我的實現中就是沒查詢一次,就會換一次伺服器ip。至於相關 技術我以後會揭曉。但本文的內容對於學習來說已經夠了。查詢具體ip在http://tool.chinaz.com/dns 裡面能夠看到。
以上介面和格式寫的有點模糊,有不到之處還請見諒。