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

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