社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Git

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

中国统计网 • 5 年前 • 617 次点击  
 - 点击上方“中国统计网”订阅我吧!-



想要十一出行的小伙伴们,想必前几天刚经历了一波抢票大战。顺便把一个 Python 抢票工具,送到了 GitHub 趋势榜第一。



这个项目名很干脆,就是“12306”,目前标星超过 12K。


这很可能是全 GitHub 最德高望重的购票小助手了,现在功能一直在更新,且已支持 Python 3.6 以上版本。


一些后起之秀也是在它的基础上开发出来,然后广受欢迎:



标星超 5K 的“py12306”便是其中之一,它支持分布式抢票。十一后面还有春运,如果需要抢票,可以试一下这些 Python 工具。已经有许多人亲测成功抢到票了。


两个 GitHub 上高星抢票项目


12306 购票小助手


文贤平/文先森 (testerSunshine) 的抢票小助手“12306”,虽然诞生在 2018 年初,但最近一次提交代码,是在今年 9 月 5 日,现在还十分新鲜。


这只得力的小助手,思路清晰又紧凑:



从查询余票开始,到付款完成,最后获取订单号。一气呵成,不怕人类手速太慢。


有了它,文先森去年就丝滑地抢到了回家的票。而后,便努力帮助抢票助手继续进化。


到目前为止,文先森与一众贡献者,已经在项目里提交了 361 次代码,实现的功能有这些:



从更新日志看来,最近加入的重要功能是候补订单。所谓候补,就是在票卖完的情况下预先付款,等其他人退票之后自动补上,是我国 2019 年春运才出现的新机制。


但文先森也还不清楚,这项功能在抢票助手里的需求是怎样的,所以正在密集地尝试和调整:



在实现新功能的同时,已有的功能也在不断优化。这个抢票工具越来越强大,已具备自动打码、自动登陆、准点预售和捡漏、智能候补、邮件通知、 pushbear 通知等功能。GitHub 标星数量比起年初的 4K,也已经翻了两番。


随着项目的成长,文先森在 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 环境产生问题):pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt

  • 非 root 用户(避免安装和运行时使用了不同环境):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 #创建一个镜像并启动容器,如果镜像已经创建过了会直接启动容器。

  • sudo ./docker.sh restart #修改配置文件后,通过此名命令可重新加载容器运行。

  • sudo ./docker.sh rm #删除容器。

  • sudo ./docker.sh drun #后台运行容器。

  • sudo ./docker.sh logs #在后台运行时,通过此命令查看运行的内容。

  • 注:针对没有 Docker 环境的同学提供了 Docker 安装脚本(Centos7)- sudo ./docker_install_centos.sh。


③目录对应说明

目录对应说明如下:

  • agency-cdn 代理

  • config-项目配置

  • verify-自动打码

  • init-项目主运行目录

  • inter-接口

  • myException-异常

  • myUrllib request 网络请求库


④日志例子

成功 log,如果是购票失败的,请带上失败的 log 给我,我尽力帮你调,也可加群一起交流,程序只是加速买票的过程,并不一定能买到票:


正在第355次查询  乘车日期: 2018-02-12  车次G4741,G2365,G1371,G1377,G1329 查询无票  代理设置 无  总耗时429ms车次: G4741 始发车站: 上海 终点站: 邵阳 二等座:有正在尝试提交订票...尝试提交订单...出票成功排队成功, 当前余票还剩余: 359 张正在使用自动识别验证码功能验证码通过,正在提交订单提交订单成功!排队等待时间预计还剩 -12 ms排队等待时间预计还剩 -6 ms排队等待时间预计还剩 -7 ms排队等待时间预计还剩 -4 ms
排队等待时间预计还剩 -4 ms恭喜您订票成功,订单号为:EB52743573, 请立即打开浏览器登录12306,访问‘未完成订单’,在30分钟内完成支付!


推荐有动手能力的朋友使用,抢票事半功倍。所以,多试几种工具也是好的,尤其是可以同时进行多个任务的那种。


py12306 购票助手


一位名叫 pjialin 的程序员,借鉴了文先森的部分代码实现,开发了一个分布式工具,名叫 py12306 购票助手。


就是说,一台机器抢不到,可以让许多硬件一起跑。它还支持多任务 (多班列车) 、多日期、多账号一起查。另一个机智的功能是,同时观察多个始发站和到达站的组合。


比如,北京出发的票没有了,就跑去下一站上车;或者家门口买不到,就直接买到终点:愿意妥协但限于手速的小伙伴,也能交给工具自动查看了。


项目作者说,试过文先森的算法和 bypass12306 未果,这才做出了自己的抢票工具。



同样是支持 Python 3.6 以上版本,这个项目现在也有 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 参数 python main.py -t -n

④运行程序
python main.py

参数列表如下:

  • -t:测试配置信息

  • -t -n:测试配置信息以及通知消息

  • -c:指定自定义配置文件位置


分布式集群依赖于 Redis,目前支持情况:

  • 单台主节点多个子节点同时运行。

  • 主节点宕机后自动切换提升子节点为主节点。

  • 主节点恢复后自动恢复为真实主节点。

  • 配置通过主节点同步到所有子节点。

  • 主节点配置修改后无需重启子节点,支持自动更新。

  • 子节点消息实时同步到主节点。


使用将配置文件的中 CLUSTER_ENABLED 打开即开启分布式。


目前提供了一个单独的子节点配置文件 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 管理页面

目前支持用户和任务以及实时日志查看,更多功能后续会不断加入。



打开 Web 功能需要将配置中的 WEB_ENABLE 打开,启动程序后访问当前主机地址 + 端口号 (默认 8008) 即可,如 http://127.0.0.1:8008。


关于防封:目前查询和登录操作是分开的,查询是不依赖用户是否登录,放在 A 云 T 云容易被限制 IP,建议在其他网络环境下运行。


最后,祝小伙伴们十一都能顺利回家顺利出游!


零基础入职数据分析·就业班

正在招生中...

课程强调真实的业务分析实战

零售企业2年的真实数据

10万+数据实操练习,还原数据分析场景

掌握数据分析技能

扫描下方二维码,学习数据分析



我就知道你“在看”
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/45364
 
617 次点击