大数据文摘出品
作者: 曹培信, 池俊辉
盼望着, 盼望着,
春节的脚步近了,
然而, 每年到这个时候,
最难的,
莫过于一张回家的火车票.
据悉,
今年春运期间,
全国铁路发送旅客人次同比将增长 8.0%.
达到 4.4 亿人次,
2020 年铁路春运自 1 月 10 日开始,
2 月 18 日结束, 共 40 天,
节前 15 天, 节后 25 天,
今年的 12 月 12 日起日 1 月 10 日火车票正式发售.
即使再难, 家还是要回的, 票还是要抢的, 所以这一周, GitHub 上用 python 抢票的项目又重回 top 榜单.
这个抢票小助手诞生于 2017 年, 作者是文贤平 / 文先森 (testerSunshine) , 目前这个项目标星已经将近 20000, 可想而知程序员们回家的愿望是多么的迫切!
史上最强抢票助手, 紧随 12306 更新
从项目的更新日志可以看到, 这个项目的第一次更新是在 2017.5.13, 之后一共进行了 32 次更新, 其中大部分是作者本人, 也有一些开发者提供了支持.
这个项目基本上是紧随着 12306 网站的功能更新而更新的, 比如去年春运增加的候补功能, 在票卖完的情况下预先付款, 等其他人退票之后自动补上. 该项目也在今年加入了这个功能.
目前这个抢票小助手基本支持 12306 的所有主要功能, 包括相当邮件通知, 智能候补等.
这个抢票小助手堪称史上最强的抢票小助手了, 作者在项目后面提供了交流群, 9 个群如今已经有 7 个满了, 可想而知这是多么强大的力量.
句句代码, 只为抢一张回家的票
作者为了这个项目还是费了不少心血的, 首先我们来看一下作者的思路.
思路并不复杂而且相当紧凑.
首先需要下载一个机器学习模型完成对 12306 验证码的自动识别, 该模型需放于项目根目录中.
1. 模型下载链接:
https://pan.baidu.com/s/1rS155VjweWVWIJogakechA
密码: bmlm
2. Git 仓库下载:
- https://github.com/testerSunshine/12306model.git
- (1)cd 12306/
- (2)Git clone
- https://github.com/testerSunshine/12306model.git
模型的安装需要一些依赖, 具体如下:
满足了依赖之后可以进行安装:
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
许多 Windows 的用户装不了 tensorflow 的话, 可以适当降低版本或者升高版本都是可以的.
注意, 在过程中如果报错为缺少上面列表中的依赖, 只需单独使用 pip3 安装相应依赖包即可.
而后就可以启动项目了.
第一步: 修改配置文件
- # 测试邮箱和 server 酱是否可用, server 酱测试的前提是 server 酱开关开启
- # 可以配置 server 酱提醒 (推荐)[配置教程](https://www.jianshu.com/p/8d10b5b9c4e3)
- # 用 python3 还是 python 完全取决于安装的时候配置的环境变量是否为 python3, 以下启动默认环境变量为 python3
- python3 run.py t
配置文件说明 (仔细阅读说明!):
- # -*- coding=utf-8 -*-
- # 关于软件使用配置说明, 一定要看!!!
- # ps: 如果是候补车票, 需要通过人证一致性核验的用户及激活的 "铁路畅行" 会员可以提交候补需求, 请您按照操作说明在铁路 12306app. 上完成人证核验
- # 关于候补了之后是否还能继续捡漏的问题在此说明: 软件为全自动候补加捡漏, 如果软件候补成功则会停止抢票, 发出邮件通知, 但是不会影响你继续捡漏,
- # 如果这个时候捡漏捡到的话, 也是可以付款成功的, 也就是说, 捡漏 + 候补, 可以最大程度提升抢票成功率
- # 刷票模式: 1 = 刷票 2 = 候补 + 刷票
- TICKET_TYPE = 1
- # 出发日期 (list) "2018-01-06", "2018-01-07"
- STATION_DATES = [
- "2020-01-17"
- ]
- # 填入需要购买的车次 (list),"G1353"
- # 修改车次填入规则, 注:(以前设置的车次逻辑不变), 如果车次填入为空, 那么就是当日乘车所有车次都纳入筛选返回
- # 不填车次是整个 list 为空才算, 如果不是为空, 依然会判断车次的, 这种是错误的写法 [""], 正确的写法 []
- STATION_TRAINS = ["G1120"]
- # 出发城市, 比如深圳北, 就填深圳就搜得到
- FROM_STATION = "广州"
- # 到达城市 比如深圳北, 就填深圳就搜得到
- TO_STATION = "武汉"
- # 座位 (list) 多个座位 ex:
- # "商务座",
- # "一等座",
- # "二等座",
- # "特等座",
- # "软卧",
- # "硬卧",
- # "硬座",
- # "无座",
- # "动卧",
- SET_TYPE = ["二等座"]
- # 当余票小于乘车人, 如果选择优先提交, 则删减联系人和余票数一致在提交
- # bool
- IS_MORE_TICKET = True
- # 乘车人 (list) 多个乘车人 ex:
- # "张三",
- #"李四"
- TICKET_PEOPLES = [""]
- # 12306 登录账号
- USER = ""PWD =""
- # 加入小黑屋时间默认为 5 分钟, 此功能为了防止僵尸票导致一直下单不成功错过正常的票
- TICKET_BLACK_LIST_TIME = 5
- # 自动打码
- IS_AUTO_CODE = True
- # 设置 2 本地自动打码, 需要配置 tensorflow 和 keras 库, 3 为云打码, 由于云打码服务器资源有限 (为 2h4C 的 CPU 服务器), 请不要恶意请求, 不然只能关闭服务器
- # ps: 请不要一直依赖云服务器资源, 在此向所有提供服务器同学表示感谢
- AUTO_CODE_TYPE = 3
- # 此处设置云打码服务器地址, 如果有自建的服务器, 可以自行更改
- HOST = "120.77.154.140:8000"
- REQ_URL = "/verify/base64/"
- HTTP_TYPE = "http"
- # HOST="12306.yinaoxiong.cn" #备用服务器稳定性较差
- # REQ_URL="/verify/base64/"
- # HTTP_TYPE="https"
- # 邮箱配置, 如果抢票成功, 将通过邮件配置通知给您
- # 列举 163
- # email: "xxx@163.com"
- # notice_email_list: "123@qq.com"
- # username: "xxxxx"
- # password: "xxxxx
- # host: "smtp.163.com"
- # 列举 qq ,qq 设置比较复杂, 需要在邮箱 --> 账户 --> 开启 smtp 服务, 取得授权码 == 邮箱登录密码
- # email: "xxx@qq.com"
- # notice_email_list: "123@qq.com"
- # username: "xxxxx"
- # password: "授权码"
- # host: "smtp.qq.com"
- EMAIL_CONF = {
- "IS_MAIL": True,
- "email": "","notice_email_list":"",
- "username": "","password":"",
- "host": "smtp.qq.com",
- }
- # 是否开启 server 酱 微信提醒, 使用前需要前往 http://sc.ftqq.com/3.version 扫码绑定获取 SECRET 并关注获得抢票结果通知的公众号
- SERVER_CHAN_CONF = {
- "is_server_chan": False,
- "secret": ""
- }
- # 是否开启 cdn 查询, 可以更快的检测票票 1 为开启, 2 为关闭
- IS_CDN = 1
- # 下单接口分为两种, 1 模拟网页自动捡漏下单 (不稳定),2 模拟车次后面的购票按钮下单 (稳如老狗)
- ORDER_TYPE = 2
- # 下单模式 1 为预售, 整点刷新, 刷新间隔 0.1-0.5S, 然后会校验时间, 比如 12 点的预售, 那脚本就会在 12.00 整检票, 刷新订单
- # 2 是捡漏, 捡漏的刷新间隔时间为 0.5-3 秒, 时间间隔长, 不容易封 ip
- ORDER_MODEL = 1
- # 是否开启代理, 0 代表关闭, 1 表示开始
- # 开启此功能的时候请确保代理 ip 是否可用, 在测试放里面经过充分的测试, 再开启此功能, 不然可能会耽误你购票的宝贵时间
- # 使用方法:
- # 1, 在 agency/proxy_list 列表下填入代理 ip
- # 2, 测试 UnitTest/TestAll/testProxy 测试代理是否可以用
- # 3, 开启代理 ip
- IS_PROXY = 0
- # 预售放票时间, 如果是捡漏模式, 可以忽略此操作
- OPEN_TIME = "12:59:50"
- # 1 = 使用 selenium 获取 devicesID
- # 2 = 使用网页端 / otn/HttpZF/logdevice 获取 devicesId, 这个接口的算法目前可能有点问题, 如果登录一直 302 的请改为配置 1
- # 3 = 自己打开浏览器在 headers-Cookies 中抓取 RAIL_DEVICEID 和 RAIL_EXPIRATION, 这个就不用配置 selenium
- COOKIE_TYPE = 3
- # 如果 COOKIE_TYPE=1, 则需配置 chromeDriver 路径, 下载地址 http://chromedriver.storage.googleapis.com/index.html
- # chromedriver 配置版本只要和 Chrome 的大版本匹配就行
- CHROME_PATH = "/usr/src/app/chromedriver"
- # 为了 docker37 准备的环境变量, Windows 环境可以不用管这个参数
- CHROME_CHROME_PATH = "/opt/google/chrome/google-chrome"
- # 如果 COOKIE_TYPE=3, 则需配置 RAIL_EXPIRATION,RAIL_DEVICEID 的值
- RAIL_EXPIRATION = "1577033439142"
- RAIL_DEVICEID = "PuV16sVaV-CTGsFZUuL8JLAk4OhuT1wgUYC_W3L2JZfWx8Ygx8LOPkko3PSOrK5_xSKhXjgyTMS8dBmj1RZHL2CKBTmVs6UG_yptlB4NJbGHldltrLMTUEgoDpSkpX2vzpGXgMQsTRzgOXfuQkAWwS4GjCxSmV3C; BIGipServerpassport=820510986.50215.0000; route=9036359bb8a8a461c164a04f8f50b252"
- # 1=> 为一直随机 ua,2-> 只启动的时候随机一次 ua
- RANDOM_AGENT = 2
- PASSENGER_TICKER_STR = {
一等座 : M ,
特等座 : P ,
二等座 : O ,
商务座 : 9,
硬座 : 1,
无座 : 1,
软座 : 2,
软卧 : 4,
硬卧 : 3,
- }
- # 保护 12306 官网请求频率, 设置随机请求时间, 原则为 5 分钟不大于 80 次
- # 最大间隔请求时间
- MAX_TIME = 3
- # 最小间隔请求时间
- MIN_TIME = 1
- # 软件版本
- RE_VERSION = "1.2.003"
第二步: 启动前筛选 cdn
python3 run.py c
第三步: 启动服务
python3 run.py r
成功抢票后就会出现下面的结果啦!
项目地址:
https://github.com/testerSunshine/12306
程序员为了抢火车票, 都干了什么!
程序员为了抢票而写代码这件事可以追溯到 12306 网站刚出现的时候.
2010 年初, 12306 网络购票刚刚出现, 一年后 GitHub 上就已经有程序员为了买票而写脚本了, 但是当时仅限于查询余票.
随后, 越来越多的程序员开始了 "面向回家编程", 出的最大的新闻是差点搞垮 GitHub.
2012 年, 一位叫做 iFish 的大佬开发的插件, 被很多浏览器的春节版本纷纷搭载, 连 12306 官方也引用了里面的一个资源.
这个插件引发了著名的「12306 订票助手拖垮 GitHub」事件.
简单来说, 就是这款 "订票助手" 使用的文件并不是普通的静态文件 (例如 Gist), 而是一个 repo 的 raw data. 这就意味着, 每次有人请求这个文件, GitHub 都要去访问这个 repo, 查找要求的数据.
并且, 如果一次数据请求失败, 那么这个指令就会就每五秒请求一次, 直到成功. 于是在春节前十几天的抢票高峰时, 巨大的访问量导致 GitHub 受到 DDOS 攻击, 不堪负载.
事后作者本人也表示: 慌得一批.
之后随着各种 App 付费抢票的出现, 很多人不会选择码一堆代码只为抢一张票, 但是程序员心中的执念还是始终不会熄灭,"面向回家编程", 再艰难也是值得的!
最后祝愿各位小伙伴们: 在今年的春运中成功抢票, 顺利回家!
* 凡来源非注明 "机器学习算法与 Python 学习原创" 的所有作品均为转载稿件, 其目的在于促进信息交流, 并不代表本公众号赞同其观点或对其内容真实性负责.
来源: https://www.qcloud.com/developer/article/1558020