GitHub標星超12K,搶票神器大更新,支持候補!
掐指一算,距離國慶黃金周還有半個月的時間!你出行的車票都搶到了嗎?
圖片來自 pexels
根據(jù)國務院辦公廳發(fā)布的關(guān)于 2019 年部分節(jié)假日安排的通知,國慶放假安排是:10 月 1 日至 7 日。
想要十一出行的小伙伴們,想必前幾天剛經(jīng)歷了一波搶票大戰(zhàn)。順便把一個 Python 搶票工具,送到了 GitHub 趨勢榜第一。
這個項目名很干脆,就是“12306”,目前標星超過 12K。項目發(fā)起者是一名叫文賢平的程序員。
這很可能是全 GitHub 最德高望重的購票小助手了,現(xiàn)在功能一直在更新,且已支持 Python 3.6 以上版本。
一些后起之秀也是在它的基礎(chǔ)上開發(fā)出來,然后廣受歡迎:
標星超 5K 的“py12306”便是其中之一,它支持分布式搶票。十一后面還有春運,如果需要搶票,可以試一下這些 Python 工具。已經(jīng)有許多人親測成功搶到票了。
兩個 GitHub 上高星搶票項目
12306 購票小助手
文賢平/文先森 (testerSunshine) 的搶票小助手“12306”,雖然誕生在 2018 年初,但最近一次提交代碼,是在今年 9 月 5 日,現(xiàn)在還十分新鮮。
這只得力的小助手,思路清晰又緊湊:
從查詢余票開始,到付款完成,最后獲取訂單號。一氣呵成,不怕人類手速太慢。
有了它,文先森去年就絲滑地搶到了回家的票。而后,便努力幫助搶票助手繼續(xù)進化。
到目前為止,文先森與一眾貢獻者,已經(jīng)在項目里提交了 361 次代碼,實現(xiàn)的功能有這些:
從更新日志看來,最近加入的重要功能是候補訂單。所謂候補,就是在票賣完的情況下預先付款,等其他人退票之后自動補上,是我國 2019 年春運才出現(xiàn)的新機制。
但文先森也還不清楚,這項功能在搶票助手里的需求是怎樣的,所以正在密集地嘗試和調(diào)整:
在實現(xiàn)新功能的同時,已有的功能也在不斷優(yōu)化。這個搶票工具越來越強大,已具備自動打碼、自動登陸、準點預售和撿漏、智能候補、郵件通知、 pushbear 通知等功能。GitHub 標星數(shù)量比起年初的 4K,也已經(jīng)翻了兩番。
隨著項目的成長,文先森在 8 月 31 日宣布了一件重要的事:放棄支持 Python 2.7,只支持 3.6 以上版本。
下面讓我們具體看看這個項目:
①依賴庫
驗證碼目前可以本地識別,需要下載模型,放于項目根目錄,全部代碼來源于此項目(https://github.com/zhaipro/easy12306),表示感謝:
- PS:
- 1. 模型下載鏈接:https://pan.baidu.com/s/1rS155VjweWVWIJogakechA 密碼:bmlm
- 群里面也可以下載
- 2. git倉庫下載:https://github.com/testerSunshine/12306model.git
項目依賴包查看 requirements.txt:
- https://github.com/testerSunshine/12306/blob/master/requirements.txt
安裝方法 x:
- root 用戶(避免多 Python 環(huán)境產(chǎn)生問題):pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt
- 非 root 用戶(避免安裝和運行時使用了不同環(huán)境):pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt
②項目使用說明
服務器啟動:
- 修改配置文件,可以配置郵箱,配置郵箱的格式在配置里面可以看到 ex,可以配置 Server 醬提醒(推薦)配置教程,配置配置文件的時候,需注意空格和遵循 Python 語法格式。
- 運行根目錄 sudo python run.py,即可開始。
如果你的服務器安裝了 Docker 與 Docker-Compose, 那么就可以通過 Docker-Compose 進行啟動。
docker.sh 腳本對此進行了封裝,可以通過如下命令進行啟動:
- sudo ./docker.sh run #創(chuàng)建一個鏡像并啟動容器,如果鏡像已經(jīng)創(chuàng)建過了會直接啟動容器。
- sudo ./docker.sh restart #修改配置文件后,通過此名命令可重新加載容器運行。
- sudo ./docker.sh rm #刪除容器。
- sudo ./docker.sh drun #后臺運行容器。
- sudo ./docker.sh logs #在后臺運行時,通過此命令查看運行的內(nèi)容。
- 注:針對沒有 Docker 環(huán)境的同學提供了 Docker 安裝腳本(Centos7)- sudo ./docker_install_centos.sh。
③目錄對應說明
目錄對應說明如下:
- agency-cdn 代理
- config-項目配置
- verify-自動打碼
- init-項目主運行目錄
- inter-接口
- myException-異常
- myUrllib request 網(wǎng)絡(luò)請求庫
④日志例子
成功 log,如果是購票失敗的,請帶上失敗的 log 給我,我盡力幫你調(diào),也可加群一起交流,程序只是加速買票的過程,并不一定能買到票:
- 正在第355次查詢 乘車日期: 2018-02-12 車次G4741,G2365,G1371,G1377,G1329 查詢無票 代理設(shè)置 無 總耗時429ms
- 車次: G4741 始發(fā)車站: 上海 終點站: 邵陽 二等座:有
- 正在嘗試提交訂票...
- 嘗試提交訂單...
- 出票成功
- 排隊成功, 當前余票還剩余: 359 張
- 正在使用自動識別驗證碼功能
- 驗證碼通過,正在提交訂單
- 提交訂單成功!
- 排隊等待時間預計還剩 -12 ms
- 排隊等待時間預計還剩 -6 ms
- 排隊等待時間預計還剩 -7 ms
- 排隊等待時間預計還剩 -4 ms
- 排隊等待時間預計還剩 -4 ms
- 恭喜您訂票成功,訂單號為:EB52743573, 請立即打開瀏覽器登錄12306,訪問‘未完成訂單’,在30分鐘內(nèi)完成支付!
推薦有動手能力的朋友使用,搶票事半功倍。所以,多試幾種工具也是好的,尤其是可以同時進行多個任務的那種。
py12306 購票助手
一位名叫 pjialin 的程序員,借鑒了文先森的部分代碼實現(xiàn),開發(fā)了一個分布式工具,名叫 py12306 購票助手。
就是說,一臺機器搶不到,可以讓許多硬件一起跑。它還支持多任務 (多班列車) 、多日期、多賬號一起查。另一個機智的功能是,同時觀察多個始發(fā)站和到達站的組合。
比如,北京出發(fā)的票沒有了,就跑去下一站上車;或者家門口買不到,就直接買到終點:愿意妥協(xié)但限于手速的小伙伴,也能交給工具自動查看了。
項目作者說,試過文先森的算法和 bypass12306 未果,這才做出了自己的搶票工具。
用上這個新工具,他一下子搶到了好幾張票:
同樣是支持 Python 3.6 以上版本,這個項目現(xiàn)在也有 5K 標星了。

下面我們來看看使用方法:PS:py12306 需要運行在 python 3.6 以上版本(其他版本暫未測試)。
①安裝依賴
- git clone https://github.com/pjialin/py12306
- pip install -r requirements.txt
②配置程序
- cp env.py.example env.py
自動打碼:驗證碼可以本地識別,所用的模型和算法均來自:
- https://github.com/zhaipro/easy12306
語音通知:語音驗證碼使用的是阿里云 API 市場上的一個服務商,需要購買后將 appcode 填寫到配置中:
- https://market.aliyun.com/products/56928004/cmapi026600.html
③啟動前測試
目前提供了一些簡單的測試,包括用戶賬號檢測,乘客信息檢測,車站檢測等。
開始測試 -t:
- python main.py -t
測試通知消息 (語音,郵件) -t -n:
- # 默認不會進行通知測試,要對通知進行測試需要加上 -n 參數(shù)
- python main.py -t -n
④運行程序
- python main.py
參數(shù)列表如下:
- -t:測試配置信息
- -t -n:測試配置信息以及通知消息
- -c:指定自定義配置文件位置
分布式集群依賴于 Redis,目前支持情況:
- 單臺主節(jié)點多個子節(jié)點同時運行。
- 主節(jié)點宕機后自動切換提升子節(jié)點為主節(jié)點。
- 主節(jié)點恢復后自動恢復為真實主節(jié)點。
- 配置通過主節(jié)點同步到所有子節(jié)點。
- 主節(jié)點配置修改后無需重啟子節(jié)點,支持自動更新。
- 子節(jié)點消息實時同步到主節(jié)點。
使用:將配置文件的中 CLUSTER_ENABLED 打開即開啟分布式。
目前提供了一個單獨的子節(jié)點配置文件 env.slave.py.example 將文件修改為 env.slave.py,通過 python main.py -c env.slave.py 即可快速啟動。
Docker 使用
①將配置文件下載到本地
- docker run --rm pjialin/py12306 cat /config/env.py > env.py
- # 或
- curl https://raw.githubusercontent.com/pjialin/py12306/master/env.docker.py.example -o env.py
②修改好配置后運行
- docker run --rm --name py12306 -p 8008:8008 -d -v $(pwd):/config -v py12306:/data pjialin/py12306
當前目錄會多一個 12306.log 的日志文件,tail -f 12306.log。
Docker-Compose 中使用如下:
①復制配置文件
- cp docker-compose.yml.example docker-compose.yml
②從 Docker-Compose 運行
在 docker-compose.yml 所在的目錄使用命令:
- docker-compose up -d
Web 管理頁面
目前支持用戶和任務以及實時日志查看,更多功能后續(xù)會不斷加入。
打開 Web 功能需要將配置中的 WEB_ENABLE 打開,啟動程序后訪問當前主機地址 + 端口號 (默認 8008) 即可,如 http://127.0.0.1:8008。
關(guān)于防封:目前查詢和登錄操作是分開的,查詢是不依賴用戶是否登錄,放在 A 云 T 云容易被限制 IP,建議在其他網(wǎng)絡(luò)環(huán)境下運行。
最后,祝小伙伴們十一都能順利回家!
12306項目傳送門:
- https://github.com/testerSunshine/12306
py12306 項目傳送門:
- https://github.com/pjialin/py12306/