专栏首页攻城狮的那点事Github上开源项目12306抢票工具帮你实现回家梦

Github上开源项目12306抢票工具帮你实现回家梦

最近有发现github上的一个python项目抢票项目,可在自己笔记本上搭建环境并且部署好即可以实现自动打码、自动登录、准点预售和捡漏、智能候补、邮件通知。源代码地址如下:

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"

6.运行程序开始抢票

直接使用以下命令进行抢票即可:

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表示感谢,同时也祝各位早日抢到回家的票!

本文分享自微信公众号 - 攻城狮的那点事(gh_e40249fc5212)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-12-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • SpringCloud微服务项目实战 - 限流、熔断、降级处理

    我们知道,在分布式微服务项目体系中,一个系统是由若干个子服务模块组成,这若干个子服务相互调用协同工作,对外输出服务使得整个系统运作。

    攻城狮的那点事
  • SpringBoot电商项目实战 — 数据库服务化切分

    在如今的电商项目中,随着业务系统的数据量日益增大,数据存储能力逐渐成为影响系统性能的瓶颈。而关系型数据库本身比较容易成为系统瓶颈,单机存储容量、连接数、处理能力...

    攻城狮的那点事
  • Java 8中集合优雅快速的处理方式

    相信现在大多数的伙伴们,都在使用Java 8了,而 Java 8相比以前的版本,是作出了革命性的改变。Java8的特性大致可总结为,开发速度更快,代码更少,增加...

    攻城狮的那点事
  • 加密工具类,提供RSA & AES & DES 等加密解密方法工具类介绍加密解密概念使用方法公钥、私钥生成

    用户2141756
  • 关于公钥与私钥,以及利用它们进行加密和认证

    下一篇,我即将详细分析windows vista下的EFS加密技术。在这之前,先分析一下相关的公钥与私钥、以及相关的加密与认证技术。

    williamwong
  • useTextSelection vue 文本选择hook

    copy_left
  • 百度熊掌号如何实现搜索结果出图

    百度熊掌号如何实现搜索结果出图呢?很多人听到这个名词会有点迷糊,不知道什么意思。看看下图就明白了。下面是魏艾斯博客的百度熊掌号文章列表,之前只有文字标题,现在程...

    魏艾斯博客www.vpsss.net
  • Eclipse配合GDB和jlinkGDBServer仿真调试STM32

    在Eclipse的IDE环境下,除了可以搭建STM32的编译环境外,还可以配合jlink仿真器实时仿真调试stm32.

    特立独行的猫a
  • 张量数据结构

    Pytorch是一个基于Python的机器学习库。它广泛应用于计算机视觉,自然语言处理等深度学习领域。是目前和TensorFlow分庭抗礼的深度学习框架,在学术...

    lyhue1991
  • 分布式系统的那些事儿(五) - 容错与故障

    我们都经历过巨石应用,单一应用某个功能诱发的故障导致整个站点挂掉,任何人都无法访问,只能一一排错再部署上线,这样造成的影响就是用户的流失。而分布式应用就没有这样...

    风间影月

扫码关注云+社区

领取腾讯云代金券