Github上的开源工具帮助你实现“十一”回家的愿望

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/BEYONDMA/article/details/100622963
下周末就是中秋节了,笔者做一名北漂的天津人,也特别能理解那些远离家乡独自在外的同事,每逢佳节倍思亲,但这时候的火车票却是十分难抢,那么笔者就为大家介绍一下今天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表示感谢,同时也祝各位读者身体健康,中秋快乐,合家团圆!
————————————————
版权声明:本文为CSDN博主「beyondma」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/BEYONDMA/article/details/100622963

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Github下载地址:https://github.com/XLAccount/MiaoBo 项目详解地址:http://www.code4app.com/blog-843201-350.html 快速集成RTMP的视频推流教程:http://www.code4app.com/blog-843201-315.html ffmpeg常用命令操作:http://www.code4app.com/blog-843201-326.html #关于IJKMediaFramework/IJKMediaFramework.h找不到的问题,下载后直接拉到项目中即可 下载地址:https://pan.baidu.com/s/1boPOomN 密码::9yd8 #BUG修复: 解决登录程序偶尔崩溃,修复轮播图片和页面控制器叠加等问题,修复新浪授权登录 (2016.9.7) 解决程序运行中偶尔崩溃问题,解决连续下拉刷新崩溃问题,优化代码 (2016.9.8) 优化直播页面,减少不必要的性能消耗,增加用户体验 (2016.9.11) 适配5s以上的机型除了6sPlus和6Plus延迟较大外,其余延迟都较小,网速好的话可以忽略不计 (2016.9.12) 新版本极大优化程序性能,修复关注数据异常等小问题,重新布局热门页面,减少因反复加载带来的性能消耗 (2016.9.13) 增加个人中心页面,采用下拉放大图片 ➕ 波纹效果 (2016.9.14) ![image text](https://github.com/XLAccount/ALLGIFS/blob/master/psb.gif) 展示图片 ![image](https://github.com/XLAccount/ALLGIFS/blob/master/psb-1.gif) 展示图片 ![image text](https://github.com/XLAccount/ALLGIFS/blob/master/psb-2.gif) 展示图片 ![image text](https://github.com/XLAccount/ALLGIFS/blob/master/psb-3.gif) 展示图片 感谢大神Monkey_ALin http://www.jianshu.com/users/9723687edfb5/latest_articles 的demo支持

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值