1. 程式人生 > >國慶馬上就來了!很多地方都沒票了!嚇的我馬上用Python搶了幾張

國慶馬上就來了!很多地方都沒票了!嚇的我馬上用Python搶了幾張

變化 哪些 strong db4 python clas 通過 簡單 開發者

技術分享圖片

項目結構

寫完整個項目後覺得其實也很簡單,無非是使用 Session 進行多次 Get 和 Post 請求,難點在於Post請求時使用的 Data 從何而來?我們先使用抓包工具(瀏覽器F12)完成一次12306平臺訂票之完整過程,對需要進行哪些網絡請求心裏有個大概印象。使用 Session 的主要原因是為了避免每次請求數據時都去考慮 Cookies ,如此可能會方便很多。

進群:548377875 即可獲取數十套PDF哦!記得是分開私信哦!

我們將整個訂票過程中使用到的API 放在一個文件裏,原因很簡單:一旦某個接口地址改變了,我們只需在此文件裏進行修改,無法在代碼裏到處查找修改,省時省力。我自己之前在寫 iOS應用時候也是采用這樣的方式。

12306 API

技術分享圖片

常量

將項目裏使用到的常量都集中在一個文件裏,方便管理。特別需要註意的是座位類型不是固定的,我在寫整個項目時發現有幾個座位類型是變化的,比如硬座在我寫本文的時候是 1 ,但是之前都是 A1 ,其他座位類型變化情況參見具體代碼內容。

技術分享圖片

Utility 工具類

通常項目中都會有很多共用方法,我們將這些方法抽離出來放在一個工具類文件裏,如此可以減少冗余代碼。

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

驗證碼圖片

我們可以分別采用手動和打碼平臺自動方式對驗證碼進行驗證,手動驗證即把驗證碼圖片分割成8個小圖片,依次編號1-8,每個小圖片上取固定的一個位置坐標,平臺返回驗證碼圖片後,用戶手動輸入正確驗證碼所在位置:

技術分享圖片

驗證碼圖片分割

所謂的打碼平臺自動驗證是指用戶給打碼平臺傳入一張驗證碼圖片,平臺通過碼工去人工識別驗證碼 (碼工有出錯可能) ,平臺再將其結果返回給用戶,這個過程一般也就2-3秒時間。12306驗證碼是多個坐標拼接成的字符串,因此我們需要平臺返回多個坐標字符串。

技術分享圖片

技術分享圖片

Login類

技術分享圖片

技術分享圖片

在開發者模式打開的情況下刷新查詢頁面,發現多了很多請求。仔細查看每個請求都在做些什麽操作?服務器又返回了什麽?Oh my gosh,竟然在剛打開查詢頁面的時候就請求到了。

技術分享圖片

電報碼接口

我們把數據請求下來並加以保存,保存的原因是這些數據一般情況下都不會改變,請求一次,下次直接使用。

技術分享圖片

獲取到車站電報碼,接下來我們就可以查詢余票了。細節部分將在代碼裏進行講解。

技術分享圖片

技術分享圖片

查詢結果

訂票

這個過程也有很多請求,具體在代碼裏說明。

技術分享圖片

我們現在來訂購一張28號上海到成都的二等座車票,在項目裏是無法完成支付的,必須到12306官網進行支付!

技術分享圖片

訂單信息.png

我們可以將訂票成功的結果以短信或者郵件的方式發送出去,提醒用戶。

短信部分我已經寫好了,在代碼裏就不展示了。

國慶馬上就來了!很多地方都沒票了!嚇的我馬上用Python搶了幾張