12306霸榜了!這可能是全 GitHub 最德高望重的搶票神器!

想要十一出行的小伙伴們,想必前幾天剛經(jīng)歷了一波搶票大戰(zhàn)。順便把一個(gè) Python 搶票工具,送到了 GitHub 趨勢榜第一。
這個(gè)項(xiàng)目名很干脆,就是“12306”,目前標(biāo)星超過 12K。項(xiàng)目發(fā)起者是一名叫文賢平的程序員。

這很可能是全 GitHub 最德高望重的購票小助手了,現(xiàn)在功能一直在更新,且已支持 Python 3.6 以上版本。
一些后起之秀也是在它的基礎(chǔ)上開發(fā)出來,然后廣受歡迎:

標(biāo)星超 5K 的“py12306”便是其中之一,它支持分布式搶票。十一后面還有春運(yùn),如果需要搶票,可以試一下這些 Python 工具。已經(jīng)有許多人親測成功搶到票了。
兩個(gè)?GitHub?上高星搶票項(xiàng)目
12306 購票小助手
文賢平/文先森 (testerSunshine) 的搶票小助手“12306”,雖然誕生在 2018 年初,但最近一次提交代碼,是在今年 9 月 5 日,現(xiàn)在還十分新鮮。
這只得力的小助手,思路清晰又緊湊:

從查詢余票開始,到付款完成,最后獲取訂單號。一氣呵成,不怕人類手速太慢。
有了它,文先森去年就絲滑地?fù)尩搅嘶丶业钠?。而后,便努力幫助搶票助手繼續(xù)進(jìn)化。
到目前為止,文先森與一眾貢獻(xiàn)者,已經(jīng)在項(xiàng)目里提交了 361 次代碼,實(shí)現(xiàn)的功能有這些:

從更新日志看來,最近加入的重要功能是候補(bǔ)訂單。所謂候補(bǔ),就是在票賣完的情況下預(yù)先付款,等其他人退票之后自動(dòng)補(bǔ)上,是我國 2019 年春運(yùn)才出現(xiàn)的新機(jī)制。
但文先森也還不清楚,這項(xiàng)功能在搶票助手里的需求是怎樣的,所以正在密集地嘗試和調(diào)整:

在實(shí)現(xiàn)新功能的同時(shí),已有的功能也在不斷優(yōu)化。這個(gè)搶票工具越來越強(qiáng)大,已具備自動(dòng)打碼、自動(dòng)登陸、準(zhǔn)點(diǎn)預(yù)售和撿漏、智能候補(bǔ)、郵件通知、 pushbear 通知等功能。GitHub 標(biāo)星數(shù)量比起年初的 4K,也已經(jīng)翻了兩番。
隨著項(xiàng)目的成長,文先森在 8 月 31 日宣布了一件重要的事:放棄支持 Python 2.7,只支持 3.6 以上版本。
下面讓我們具體看看這個(gè)項(xiàng)目:
①依賴庫
驗(yàn)證碼目前可以本地識別,需要下載模型,放于項(xiàng)目根目錄,全部代碼來源于此項(xiàng)目(https://github.com/zhaipro/easy12306),表示感謝:
??PS:?
??1.?模型下載鏈接:https://pan.baidu.com/s/1rS155VjweWVWIJogakechA??密碼:bmlm
?????群里面也可以下載
? 2. git倉庫下載: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)生問題):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)目使用說明
服務(wù)器啟動(dòng):
修改配置文件,可以配置郵箱,配置郵箱的格式在配置里面可以看到 ex,可以配置 Server 醬提醒(推薦)配置教程,配置配置文件的時(shí)候,需注意空格和遵循 Python 語法格式。
運(yùn)行根目錄 sudo python run.py,即可開始。
如果你的服務(wù)器安裝了 Docker 與 Docker-Compose, 那么就可以通過 Docker-Compose 進(jìn)行啟動(dòng)。
docker.sh?腳本對此進(jìn)行了封裝,可以通過如下命令進(jìn)行啟動(dòng):
sudo ./docker.sh run #創(chuàng)建一個(gè)鏡像并啟動(dòng)容器,如果鏡像已經(jīng)創(chuàng)建過了會直接啟動(dòng)容器。
sudo ./docker.sh restart #修改配置文件后,通過此名命令可重新加載容器運(yùn)行。
sudo ./docker.sh rm #刪除容器。
sudo ./docker.sh drun #后臺運(yùn)行容器。
sudo ./docker.sh logs #在后臺運(yùn)行時(shí),通過此命令查看運(yùn)行的內(nèi)容。
注:針對沒有 Docker 環(huán)境的同學(xué)提供了 Docker 安裝腳本(Centos7)- sudo ./docker_install_centos.sh。
③目錄對應(yīng)說明
目錄對應(yīng)說明如下:
agency-cdn?代理
config-項(xiàng)目配置
verify-自動(dòng)打碼
init-項(xiàng)目主運(yùn)行目錄
inter-接口
myException-異常
myUrllib request?網(wǎng)絡(luò)請求庫
④日志例子
成功 log,如果是購票失敗的,請帶上失敗的 log 給我,我盡力幫你調(diào),也可加群一起交流,程序只是加速買票的過程,并不一定能買到票:正在第355次查詢??乘車日期:?2018-02-12??車次G4741,G2365,G1371,G1377,G1329?查詢無票??代理設(shè)置?無??總耗時(shí)429ms
車次:?G4741?始發(fā)車站:?上海?終點(diǎn)站:?邵陽?二等座:有
正在嘗試提交訂票...
嘗試提交訂單...
出票成功
排隊(duì)成功,?當(dāng)前余票還剩余:?359?張
正在使用自動(dòng)識別驗(yàn)證碼功能
驗(yàn)證碼通過,正在提交訂單
提交訂單成功!
排隊(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
恭喜您訂票成功,訂單號為:EB52743573, 請立即打開瀏覽器登錄12306,訪問‘未完成訂單’,在30分鐘內(nèi)完成支付!
推薦有動(dòng)手能力的朋友使用,搶票事半功倍。所以,多試幾種工具也是好的,尤其是可以同時(shí)進(jìn)行多個(gè)任務(wù)的那種。
py12306 購票助手
一位名叫 pjialin 的程序員,借鑒了文先森的部分代碼實(shí)現(xiàn),開發(fā)了一個(gè)分布式工具,名叫 py12306 購票助手。
就是說,一臺機(jī)器搶不到,可以讓許多硬件一起跑。它還支持多任務(wù)?(多班列車) 、多日期、多賬號一起查。另一個(gè)機(jī)智的功能是,同時(shí)觀察多個(gè)始發(fā)站和到達(dá)站的組合。
比如,北京出發(fā)的票沒有了,就跑去下一站上車;或者家門口買不到,就直接買到終點(diǎn):愿意妥協(xié)但限于手速的小伙伴,也能交給工具自動(dòng)查看了。
項(xiàng)目作者說,試過文先森的算法和 bypass12306 未果,這才做出了自己的搶票工具。
用上這個(gè)新工具,他一下子搶到了好幾張票:
同樣是支持 Python 3.6 以上版本,這個(gè)項(xiàng)目現(xiàn)在也有 5K 標(biāo)星了。
下面我們來看看使用方法:PS:py12306 需要運(yùn)行在 python 3.6 以上版本(其他版本暫未測試)。
①安裝依賴git?clone?https://github.com/pjialin/py12306
pip?install?-r?requirements.txt
②配置程序cp?env.py.example?env.py
自動(dòng)打碼:驗(yàn)證碼可以本地識別,所用的模型和算法均來自:https://github.com/zhaipro/easy12306
語音通知:語音驗(yàn)證碼使用的是阿里云 API 市場上的一個(gè)服務(wù)商,需要購買后將 appcode 填寫到配置中:https://market.aliyun.com/products/56928004/cmapi026600.html?
③啟動(dòng)前測試
目前提供了一些簡單的測試,包括用戶賬號檢測,乘客信息檢測,車站檢測等。
開始測試 -t:python?main.py?-t
測試通知消息 (語音,郵件) -t -n:#?默認(rèn)不會進(jìn)行通知測試,要對通知進(jìn)行測試需要加上?-n?參數(shù)?
python?main.py?-t?-n
④運(yùn)行程序python?main.py
參數(shù)列表如下:
-t:測試配置信息
-t -n:測試配置信息以及通知消息
-c:指定自定義配置文件位置
分布式集群依賴于 Redis,目前支持情況:
單臺主節(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)。
配置通過主節(jié)點(diǎn)同步到所有子節(jié)點(diǎn)。
主節(jié)點(diǎn)配置修改后無需重啟子節(jié)點(diǎn),支持自動(dòng)更新。
子節(jié)點(diǎn)消息實(shí)時(shí)同步到主節(jié)點(diǎn)。
使用:將配置文件的中 CLUSTER_ENABLED 打開即開啟分布式。
目前提供了一個(gè)單獨(dú)的子節(jié)點(diǎn)配置文件 env.slave.py.example 將文件修改為 env.slave.py,通過 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)前目錄會多一個(gè) 12306.log 的日志文件,tail -f 12306.log。
Docker-Compose 中使用如下:
①復(fù)制配置文件cp?docker-compose.yml.example?docker-compose.yml
②從 Docker-Compose 運(yùn)行
在 docker-compose.yml 所在的目錄使用命令:
docker-compose?up?-d
Web 管理頁面
目前支持用戶和任務(wù)以及實(shí)時(shí)日志查看,更多功能后續(xù)會不斷加入。

打開 Web 功能需要將配置中的 WEB_ENABLE 打開,啟動(dòng)程序后訪問當(dāng)前主機(jī)地址 + 端口號 (默認(rèn) 8008) 即可,如 http://127.0.0.1:8008。

關(guān)于防封:目前查詢和登錄操作是分開的,查詢是不依賴用戶是否登錄,放在 A 云 T 云容易被限制 IP,建議在其他網(wǎng)絡(luò)環(huán)境下運(yùn)行。

最后,祝小伙伴們十一都能順利回家!

作者:菜鳥要飛
end
小伙伴課程咨詢 添加微信:lovedata19 備注「B站」即可
