下周末就是中秋节了,笔者做一名北漂的天津人,也特别能理解那些远离家乡独自在外的同事,每逢佳节倍思亲,但这时候的火车票却是十分难抢,那么笔者就为大家介绍一下今天Github上趋势榜首的“12306自动抢票”项目的使用方法(Github地址在https://codeload.github.com/testerSunshine/12306/zip/master)
特别说明:本项目属于爬虫类项目,如果商用可能会有法律风险,请各位读者谨慎使用,如果由于根据本文使用12306自动抢票软件引发法律纠纷,笔者并不承担。
12306抢票项目的安装和使用
目前“12306自动抢票”的Github官网上还没有一个完整的安装和布署攻略,这里我就把完整的安装流程向大家说明一下。不过目前本项目应该还只支持UBANTU等LINUX平台,这个项目的很多依赖项在WINDOWS平台上装非常麻烦,所以建议直接在UBANTU上布署,这样相对比较简单。
1.下载项目源码:
使用以下命令下载项目源码
git clone https://github.com/testerSunshine/12306.git
cd 12306
2.下载项目依赖的识别码打码模型
打开以下网址:https://github.com/testerSunshine/12306model,下载下图两个标红的模型文件,并放到12306项目的根目录(一般是~/12306)
3.安装项目依赖
使用以下命令下载项目依赖项,本项目的依赖项比较多,建议直接使用sudo安装更多稳妥,如果有报错,则需要单独去解决具体安装项的问题,目前看最主要的问题可能在于tensorflow的安装,不过由于不需要GPU的版本,所以直接安装应该也不会有什么问题。
sudo pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt
4.安装chromedriver
使用以下命令安装chromedriver,一般安装后会放在/usr/local/bin下,需要在配置文件的CHROME_PATH标签下填好
sudo apt-get install chromium-chromedriver
5.修改配置文件
修改“12306自动抢票”项目根目录下的TickerConfig.py,具体注释原作者已经写好了,如下:
关于软件使用配置说明,一定要看!!!
# ps: 如果是候补车票,需要通过人证一致性核验的用户及激活的“铁路畅行”会员可以提交候补需求,请您按照操作说明在铁路12306app.上完成人证核验
# 关于候补了之后是否还能继续捡漏的问题在此说明: 软件为全自动候补加捡漏,如果软件候补成功则会停止抢票,发出邮件通知,但是不会影响你继续捡漏,
# 如果这个时候捡漏捡到的话,也是可以付款成功的,也就是说,捡漏+候补,可以最大程度提升抢票成功率
# 刷票模式:1=刷票 2=候补+刷票
TICKET_TYPE = 2
# 候补最晚兑现日期,目前软件为捡漏加自动候补,所以这个值一定要填,并且这个日期一定要填小于最长订票时间(30天)
# 格式为日期+小时+分
# 举例: 比如今天才可以买10.1号的票,比如你那个发车是10.1号上午两点,你兑现时间写到10.1晚上22点?
# t("#fromDate").val() + "#" + t("#dafaultTime").html().replace("时", "") + "#" + t("#dafaultMinutes").html().replace("分", ""),
J_Z_PARAM = "2019-09-28#22#59"
# 出发日期(list) "2018-01-06", "2018-01-07"
# ps: 日期如果是单日,一定要前面补个0,正确做法:2019-01-01, 错误做法:2019-1-1
STATION_DATES = [
"2019-09-25"
]
# 填入需要购买的车次(list),"G1353"
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
# 邮箱配置,如果抢票成功,将通过邮件配置通知给您
# 列举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": False,
"email": "",
"notice_email_list": "",
"username": "",
"password": "",
"host": "",
}
# 是否开启 pushbear 微信提醒, 使用前需要前往 http://pushbear.ftqq.com 扫码绑定获取 send_key 并关注获得抢票结果通知的公众号
PUSHBEAR_CONF = {
"is_pushbear": False,
"send_key": ""
}
# 是否开启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 = 2
# 是否开启代理, 0代表关闭, 1表示开始
# 开启此功能的时候请确保代理ip是否可用,在测试放里面经过充分的测试,再开启此功能,不然可能会耽误你购票的宝贵时间
# 使用方法:
# 1、在agency/proxy_list列表下填入代理ip
# 2、测试UnitTest/TestAll/testProxy 测试代理是否可以用
# 3、开启代理ip
IS_PROXY = 0
# 预售放票时间, 如果是捡漏模式,可以忽略此操作
OPEN_TIME = "13:00:00"
# 1=使用selenium获取devicesID
# 2=使用网页端/otn/HttpZF/logdevice获取devicesId,这个接口的算法目前可能有点问题,如果登录一直302的请改为配置1
COOKIE_TYPE = 1
# 如果COOKIE_TYPE=1,则需配置chromeDriver路径(注意是填你机器本地chromeDriver的路径,这个地方一定要改),下载地址http://chromedriver.storage.googleapis.com/index.html
# chromedriver配置版本只要和chrome的大版本匹配就行
# 如果是windows,最好在路径加上r, ex: r"/Users/wenxianping/Downloads/chromedriver"
CHROME_PATH = ""
PASSENGER_TICKER_STR = {
'一等座': 'M',
'特等座': 'P',
'二等座': 'O',
'商务座': 9,
'硬座': 1,
'无座': 1,
'软座': 2,
'软卧': 4,
'硬卧': 3,
}
# 软件版本
RE_VERSION = "1.1.106"
5.运行程序开始抢票
直接使用以下命令进行抢票即可:
sudo python run.py
看到软件帮你自动抢票了
代码导读
总体而言这个抢票项目设计思路清昕,有很多地方值得一读,先给大家带来以下两部分
1.使用Selenium得到cookie的device_id,具体在~/config/getCookie.py
def getDrvicesID(session):
"""
:return:
"""
print("cookie获取中")
if TickerConfig.COOKIE_TYPE is 1:
from selenium import webdriver#导入Selenium包
cookies = []
options = webdriver.ChromeOptions()
options.add_argument('headless')
driver = webdriver.Chrome(chrome_options=options,
executable_path=TickerConfig.CHROME_PATH)#设置的chrome_driver的地址
driver.get("https://www.12306.cn/index/index.html")
time.sleep(10)
#根据cookie的name来获得
for c in driver.get_cookies():
cookie = dict()
if c.get("name") == "RAIL_DEVICEID" or c.get("name") == RAIL_EXPIRATION":
cookie[c.get("name")] = c.get("value")
cookies.append(cookie)
if cookies:
session.httpClint.set_cookies(cookies)
print("cookie获取完成")
elif TickerConfig.COOKIE_TYPE is 2:
request_device_id(session)
2.是自动打码的部分,在~/verify/localVerifyCode.py
def verify(fn):
backend.clear_session()
verify_titles = ['打字机', '调色板', '跑步机', '毛线', '老虎', '安全帽', '沙包', '盘子', '本子', '药片', '双面胶', '龙舟', '红酒', '拖把', '卷尺', '海苔', '红豆', '黑板', '热水袋', '烛台', '钟表', '路灯', '沙拉', '海报', '公交卡', '樱桃', '创可贴', '牌坊', '苍蝇拍', '高压锅', '电线', '网球拍', '海鸥', '风铃', '订书机', '冰箱', '话梅', '排风机', '锅铲', '绿豆', '航母', '电子秤', '红枣', '金字塔', '鞭炮', '菠萝', '开瓶器', '电饭煲', '仪表盘', '棉棒', '篮球', '狮子', '蚂蚁', '蜡烛', '茶盅', '印章', '茶几', '啤酒', '档案袋', '挂钟', '刺绣', '铃铛', '护腕', '手掌印', '锦旗', '文具盒', '辣椒酱', '耳塞', '中国结', '蜥蜴', '剪纸', '漏斗', '锣', '蒸笼', '珊瑚', '雨靴', '薯条', '蜜蜂', '日历', '口哨']
# 读取并预处理验证码
img = base64_to_image(fn)#将img转换
text = get_text(img)
imgs = np.array(list(pretreatment._get_imgs(img)))
imgs = preprocess_input(imgs)
text_list = []
# 识别文字
model = models.load_model(PATH('../model.v2.0.h5'))#使用之前的model识别文字
label = model.predict(text)
label = label.argmax()
text = verify_titles[label]
text_list.append(text)
# 获取下一个词
# 根据第一个词的长度来定位第二个词的位置
if len(text) == 1:
offset = 27
elif len(text) == 2:
offset = 47
else:
offset = 60
text = get_text(img, offset=offset)
if text.mean() < 0.95:
label = model.predict(text)
label = label.argmax()
text = verify_titles[label]
text_list.append(text)
print("题目为{}".format(text_list))
# 加载图片分类器
model = models.load_model(PATH('../12306.image.model.h5'))
labels = model.predict(imgs)
labels = labels.argmax(axis=1)
results = []
for pos, label in enumerate(labels):
l = verify_titles[label]
print(pos+1, l)
if l in text_list:
results.append(str(pos+1))
return results
好了,以上就是对于12306项目的简介,在这里也对项目的原作者testerSunshine表示感谢,同时也祝各位读者身体健康,中秋快乐,合家团圆!
转载:https://blog.csdn.net/BEYONDMA/article/details/100622963