今年以来,听到不少人抱怨12306越来越难买到票了,笔者也经常坐高铁,确实也感受到了与以往的不同。不管怎么说,我们知道还是不知道原因都无济于事,能做的就是抢到那张自己想要的票,其他的都是浮云。
废话不多说,这次笔者要介绍的是一款开源抢票工具,名字就叫12306
。不过,由于众所周知的原因,这个工具目前没有提供现成Docker镜像,我们使用起来需要一定的动手能力,但是也不难。下面我们来看看如何玩转起来。
前提条件
- 电脑/NAS上安装好Docker,版本号18.09及以上
- 电脑/NAS上安装好Docker-Compose,版本号1.23.2及以上
- 电脑/NAS上安装好Git
一、下载源码
开头也说了,没有现成的Docker镜像,所以要用源码来跑。我没在机器上找一个目录,本文就以/home/code
为例吧。
在机器上打开终端或cmd,执行下面命令,等待下载完成即可:
git clone https://github.com/testerSunshine/12306.git
二、配置抢票参数
1、找到TickerConfig.py
文件
下载完成以后,进入到12306
文件夹中,找到TickerConfig.py
文件。
2、配置参数
接下来是最核心的步骤了,我们需要在这个文件里配置我们的出发日期、始发和到达城市、座位类型、你的12306帐号等等信息。
笔者已经在下面详细列出了,参照着填写就行:
参数 | 含义 | 示例 |
---|---|---|
TICKET_TYPE | 刷屏模式:1=刷屏,2=候补+刷屏 | 建议填1 |
STATION_DATES | 出发日期,支持多个日期,使用数组,日期格式为:2023-09-25 | [ "2020-01-18", "2020-01-19" ] |
STATION_TRAINS | 指定车次,支持多个,可以不填,使用数组,格式就是车次号 | ["G1353","G1354"] |
FROM_STATION | 始发城市 | 如:"广州南"、"广州" |
TO_STATION | 到达城市 | 如:"广州南"、"广州" |
SET_TYPE | 座位类别,12306上支持 的类别:商务座、一等座、二等座、特等座、软卧、硬卧、硬座、无座、动卧 | 如:"二等座" |
USER | 12306帐号的用户名 | 你自己的,如:"hahaha" |
PWD | 12306帐号的密码 | 你自己的,如:"mypwd |
AUTO_CODE_TYPE | 打码模式,就是自动识别验证码。2=自动打码,需要配置tensorflow和keras库,比较麻烦;3=云打码,用别人部署好的打码服务 | 我们在这里选3 |
HOST | 云打码地址 | 设置为:captcha:80,docker部署的 |
下面是配置文件的形式,参考着填:
# -*- coding=utf-8 -*-
# 关于软件使用配置说明,一定要看!!!
# ps: 如果是候补车票,需要通过人证一致性核验的用户及激活的“铁路畅行”会员可以提交候补需求,请您按照操作说明在铁路12306app.上完成人证核验
# 关于候补了之后是否还能继续捡漏的问题在此说明: 软件为全自动候补加捡漏,如果软件候补成功则会停止抢票,发出邮件通知,但是不会影响你继续捡漏,
# 如果这个时候捡漏捡到的话,也是可以付款成功的,也就是说,捡漏+候补,可以最大程度提升抢票成功率
# 刷票模式:1=刷票 2=候补+刷票
TICKET_TYPE = 1
# 出发日期(list) "2018-01-06", "2018-01-07"
STATION_DATES = [
"2023-09-28"
]
# 填入需要购买的车次(list),"G1353"
# 修改车次填入规则,注:(以前设置的车次逻辑不变),如果车次填入为空,那么就是当日乘车所有车次都纳入筛选返回
# 不填车次是整个list为空才算,如果不是为空,依然会判断车次的,这种是错误的写法 [""], 正确的写法 []
STATION_TRAINS = []
# 出发城市,比如深圳北,就填深圳就搜得到
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"
HOST = "captcha:80"
REQ_URL = "/verify/base64/"
HTTP_TYPE = "http"
# HOST="12306.yinaoxiong.cn" #备用服务器稳定性较差
# REQ_URL="/verify/base64/"
# HTTP_TYPE="https"
# 邮箱配置,如果抢票成功,将通过邮件配置通知给您
# 列举163
# email: "[email protected]"
# notice_email_list: "[email protected]"
# username: "xxxxx"
# password: "xxxxx
# host: "smtp.163.com"
# 列举qq ,qq设置比较复杂,需要在邮箱-->账户-->开启smtp服务,取得授权码==邮箱登录密码
# email: "[email protected]"
# notice_email_list: "[email protected]"
# 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:57"
# 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 = ""
RAIL_DEVICEID = ""
# RAIL_EXPIRATION = "1577034103293"
# RAIL_DEVICEID = "CDno29Erc_Pf3FSXb4dzq-Op64EhWrsi5yUZKVIKR1MAfYo2qFlCeXD8VkexY7_1qg-ClV-fE8j9jgVlPZxRh3wVc2iqLe_5A8sdr62qZx4B22JPF8lFCjpgTKZ5ODW90HJd5tiQsJ1KR9nOqHRxHj1FT5LEIwfw"
# 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.004"
其他的参数,可以参考上面的注释说明,按需选填,如果实在不懂就不要动为好。
3、修改Dockerfile
源码中的dockerfile文件中使用的一个依赖已经不见了,我们需要重新找一个可用的来替代它。
首先,在12306
文件夹下找到Dockerfile37
,找到第39~40行
然后,把第39~40行的内容改为下面的:
RUN wget -q https://repo.debiancn.org/debiancn/pool/main/g/google-chrome-stable/google-chrome-stable_77.0.3865.120-1_amd64.deb && \
dpkg -i google-chrome-stable_77.0.3865.120-1_amd64.deb && rm -f google-chrome-stable_77.0.3865.120-1_amd64.deb
三、开始起飞
1、启动容器开始抢票
以上环境和配置都准备妥当之后,就可以开始刷起来了,在12306
目录下,执行下面命令,系统开始自动构建镜像并启动容器:
docker-compose up --build -d
可能会有点慢、不要急,等待镜像构建完成,如果失败了就多试几次,如果还是不行可能要开一下梯子。
2、查看运行日志
容器启动完成后,可以在终端中执行下面命令,可以看到容器的运行日志:
docker logs --follow ticket
3、停止抢票
如果你已经抢到心意的票了或者不想继续刷了,执行下面命令立马停止:
docker-compose down
总结
这个项目除了使用Docker运行完,也支持直接使用Python运行,但是要自己解决一些依赖为题,笔者还是建议使用Docker的方式,相对简单些。
原创不易,如果觉得此文对你有帮助,不妨点赞+收藏+关注,你的鼓励是我支持创作的动力!

文章评论