決戰春運之巔,我們用這個項目搶到了火車票
春節臨近,又雙叕到了搶票的關鍵時刻。你在朋友圈跪求朋友加速了嗎?乖乖聽話買加速包了嗎?但對于「難點地區」的同學們來說,即使買了加速包,APP 顯示極速搶票,也未必能買到票。

對于程序員來說,搶票可不止這兩種「常規操作」。最近幾天在 GitHub 全球趨勢榜上,幾個火車搶票項目一直名列前茅。

國人占領 GitHub 趨勢榜:在 12306 上自動搶票的 Python 項目最近幾天 star 量飛漲。
目前在 GitHub 上最火的兩個 12306 搶票項目是:
- 12306 購票小助手(約 23200 Star):https://github.com/testerSunshine/12306
- py12306 購票助手(約 9000 Star):https://github.com/pjialin/py12306
此外還有兩個 12306 網站驗證碼識別工具:
- https://github.com/YinAoXiong/12306_code_server
- https://github.com/zhaipro/easy12306
這些項目其實并不是剛剛出現的,它們已經經過了去年春節搶票,以及五一、十一搶票的考驗。就其中 star 量最高的那兩個來說——自去年春節之后,「12306 購票小助手」更新了圖形界面,加入了購票成功信息推送,增加了候補訂單/撿漏功能等等。
為什么用工具搶票幾率更高?因為這種方法可以免去輸入驗證碼、并略過網頁刷新等待的時間。
由于 Python 官方對于 2.X 版本支持的結束,目前項目僅支持 Python 3.6 以上版本。機器之心選擇了「py12306 購票助手」項目進行了測(qiang)試(piao)。
搶票效果很驚人
這一工具能否搶到票?其實,機器之心小編也正飽受春節回老家搶不到票的困擾,所以編輯部用了這個神奇的項目,結果成功搶到了車票。
不要被 GitHub 上的代碼嚇到了,這些工具使用起來非常簡單。
你看,小編剛開始刷票就搶到了一張從北京到長沙的高鐵票,我們再登陸 12306 的官方網站就可以直接付款了。

總體而言,py12306 購票助手使用非常便捷,體驗也是非常好的。畢竟有什么報錯,大家都可以在 Issue 中找到解答。這樣的流行項目,很多開發者已經幫我們試過水了。
使用流程如下:
- 下載項目并安裝相關依賴庫;
- 打開參數文檔,輸入自己的用戶名、密碼、起止城市(支持多個車站)、發車時間段、座位信息;
- 啟動程序,搜索車次;
- 如果發現了合適的車票,會自動下單,并通過郵件、微信等工具提醒。
- 最后,登錄 12306 付款~
值得注意的是,每次重新啟動,程序都會從歷史進程中獲取信息,并嘗試直接恢復用戶的登錄等狀態。如下是啟動搶票功能后的初始化界面:

當然,如果當前車次或車站沒有多余的火車票,那么程序會一直刷票,并且當存在余票時能立即占用票務資源。

比較有意思的是,Py12306 還提供了一個可視化網頁端,這能讓不了解開發的同學直觀看到程序的運行結果。

使用指南
首先,你需要將項目克隆到自己的電腦上(需要 Python 3.6):
- git clone https://github.com/pjialin/py12306
- cd py12306
- pip install -r requirements.txt
然后配置程序:
- cp env.py.example env.py
配置之后,你需要輸入相關信息,如用戶名和密碼、查詢條件等。這時候,你需要打開安裝目錄里面的 env.py 文件,不論是用 Vim、SubLime 這些純文本編輯器,還是電腦自帶的「記事本」、「文本編輯」,只要能打開純文本并編輯就 OK 了。
出現在你眼前的文檔看上去非常復雜,但每一行代碼都有很多中文注釋,相信小白也能看懂所有配置選項。首先是參數 USER_ACCOUNTS,這里可以將示例改成自己的用戶名和密碼,如:

如果你對心跳查詢、免費大碼之類的參數不感興趣,請盡管跳過,這是一個初學者教程。
接下來是查詢任務參數 QUERY_JOBS,這里可以輸入出發和到達的城市。此處只需要修改 left_dates 和 stations 兩個參數。注意,如果一行代碼前面有井號,表示修改這行文字只是一個注釋。
如下圖所示,我們只需要修改第一個 left_dates 和第一個 stations 即可。left_dates 可以輸入多個,每個都需要按照圖中的格式,使用引號括住日期,每個日期用英文逗號隔開。

在這里還有一個重要參數:旅客姓名,參數名稱為 members。這里注意,如果以前是學生,現在是成人或者是需要購買成人票,寫姓名的時候前面需要一個「*」號。

最后是出發日的時間段和座位類型,這里會按照輸入的順序優先購買有票的:

當修改完這些信息后,保存并退出編輯界面。
然后你就可以搶票了,只需要運行 main.py 文件即可。
- pythonmain.py
準備妥當,好了,是時候搶票了!