🐎 py12306:一款强大的12306自动购票助手,支持NAS部署哦!

py12306
py12306是Github的一个开源项目,主要功能就是12306自动购票助手,支持集群部署,支持多账号、多任务购票,而且还有Web管理界面,非常人性化。

不过很长一段时间这款工具都没有再更新,大概半年前笔者还在自己的NAS上倒腾过。也许是今年的票实在是太难买了,最近笔者翻看这个项目时发现py12306又开始更新了(合并了一些PR),可喜可贺。恰逢年关抢票大战,笔者就把如何配置和使用py12306做一个简单介绍,希望能帮到大家,并提前恭祝各位游子:事业蒸蒸日上、阖家幸福。

1️⃣ py12306功能简介

关于py12306的功能和特性,简单罗列一下:

  • 支持多日期查询余票
  • 自动打码下单
  • 用户状态恢复
  • 电话语音通知
  • 多账号、多任务、多线程支持、支持扫描登录
  • 单个任务多站点查询
  • 支持集群部署、分布式运行
  • 支持Docker安装
  • 支持动态修改配置文件
  • 支持邮件、Bark、钉钉、电报、微信消息等通知方式
  • 友好的Web管理页面
  • 代理池支持 (画饼状态😂)

2️⃣ py12306功能演示

如果你设置的是扫描登录方式,在启动py12306后,可在日志中看到登录二维码,使用12306 App扫描即可完成12306账号登录验证,如下图所示:
py12306

1、登录Web管理界面

在浏览器中使用:8008打开py12306的web管理界面,使用配置文件中设置的用户名和密码登录即可。
py12306

2、首页

可以看到接入的12306账号数量、任务数量、查询次数和是CDN查询数量(开启才有)。
py12306

3、用户管理

可以看到当前接入的用户信息,包括账号、姓名、是否加载成功、可用状态、登录次数等信息。
py12306

4、查询任务

就是配置文件中设置的查询任务,包括名称、出发日期、乘客数量、座位、车次等信息。
py12306
5、实时日志

可以方便地看到每一次查询车次的情况。
py12306

3️⃣ 配置py12306

无论是源码运行还是Docker运行,都需要先配置好相关参数,具体的参数配置我直接放在下面了,请复制下来保存到文件env.py文件中。

温馨提示:不要被这一大堆字母吓到了,照着上面备注填写相关的信息就行了,主要是设置账号、web管理账号、查询任务、通知信息等核心参数需要配置,其他的可以按自己实际需要修改。

# -*- coding: utf-8 -*-

# 12306 账号
USER_ACCOUNTS = [
    # 目前已支持仅查询,不下单,屏蔽掉下面的账号即可
    {
        'key': 0,  # 如使用多个账号 key 不能重复
        'user_name': '12306账号',
        'password': '忽略',
        'type': 'qr'  # qr 为扫码登录,填写其他为密码登录
    },
    # {
    #     'key': 'wangwu',
    #     'user_name': '[email protected]',
    #     'password': 'wangwu',
    #     'type': ''
    # }
]

# 查询间隔(指每一个任务中每一个日期的间隔 / 单位秒)
# 默认取间隔/2 到 间隔之间的随机数 如设置为 1 间隔则为 0.5 ~ 1 之间的随机数
# 接受字典形式 格式:    {'min': 0.5, 'max': 1}
QUERY_INTERVAL = 1

# 网络请求重试次数
REQUEST_MAX_RETRY = 5

# 用户心跳检测间隔 格式同上
USER_HEARTBEAT_INTERVAL = 120

# 多线程查询
QUERY_JOB_THREAD_ENABLED = 0  # 是否开启多线程查询,开启后第个任务会单独分配线程处理

# 打码平台账号
# 目前只支持免费打码接口 和 若快打码,注册地址:http://www.ruokuai.com/login
AUTO_CODE_PLATFORM = 'free'  # 免费填写 free 若快 ruokuai  # 免费打码无法保证持续可用,如失效请手动切换; 个人打码填写 user 并修改API_USER_CODE_QCR_API 为自己地址
API_USER_CODE_QCR_API = ''
AUTO_CODE_ACCOUNT = {  # 使用 free 可用省略
    'user': 'your user name',
    'pwd': 'your password'
}

# 语音验证码
# 没找到比较好用的,现在用的这个是阿里云 API 市场上的,基本满足要求,价格也便宜
# 购买成功后到控制台找到  APPCODE 放在下面就可以了
# 地址:易源 https://market.aliyun.com/products/57126001/cmapi019902.html
# 2019-01-18 更新
# 增加新的服务商 鼎信 https://market.aliyun.com/products/56928004/cmapi026600.html?spm=5176.2020520132.101.2.e27e7218KQttQS
NOTIFICATION_BY_VOICE_CODE = 1  # 开启语音通知
NOTIFICATION_VOICE_CODE_TYPE = 'dingxin'  # 语音验证码服务商  可用项 dingxin  yiyuan
NOTIFICATION_API_APP_CODE = 'your app code'
NOTIFICATION_VOICE_CODE_PHONE = 'your phone'  # 接受通知的手机号

# 钉钉通知
# 使用说明   https://open-doc.dingtalk.com/docs/doc.htm?treeId=257&articleId=105735&docType=1
DINGTALK_ENABLED = 0
DINGTALK_WEBHOOK = 'https://oapi.dingtalk.com/robot/send?access_token=your token'

# Telegram消息推送
# 目前共有两个Bot:
#   1:https://t.me/notificationme_bot
#   2:https://t.me/RE_Link_Push_bot
# 任选一个Bot,关注获取URL链接,如果没有回复则发送给Bot这条信息: /start
# 将获取的URL填入下面对应位置
# 注意:因为以上Bot都由他人公益提供,无法保证随时可用,如以上Bot都无法使用,请使用其他消息推送方式
# Bot1来源:https://github.com/Fndroid/tg_push_bot
# Bot2来源:https://szc.me/post/2.html
TELEGRAM_ENABLED = 0
TELEGRAM_BOT_API_URL = 'https://tgbot.lbyczf.com/sendMessage/:your_token'

# ServerChan 和 PushBear 微信消息推送
# 使用说明
# ServerChan     http://sc.ftqq.com
# PushBear       http://pushbear.ftqq.com
SERVERCHAN_ENABLED = 0
SERVERCHAN_KEY = ''
PUSHBEAR_ENABLED = 0
PUSHBEAR_KEY = ''

# Bark 推送到ios设备
# 参考 https://www.v2ex.com/t/467407
BARK_ENABLED = 0
BARK_PUSH_URL = 'https://api.day.app/:your_token'

# 输出日志到文件
OUT_PUT_LOG_TO_FILE_ENABLED = 0
OUT_PUT_LOG_TO_FILE_PATH = 'runtime/12306.log'  # 日志目录

# 分布式集群配置
CLUSTER_ENABLED = 0  # 集群状态
NODE_IS_MASTER = 1  # 是否是主节点 同时只能启用 1 个主节点
NODE_SLAVE_CAN_BE_MASTER = 1  # 主节点宕机后,子节点是否可以自动提升为主节点(建议打开)
NODE_NAME = 'master'  # 节点名称,不能重复
REDIS_HOST = 'localhost'  # Redis  host
REDIS_PORT = '6379'  # Redis  port
REDIS_PASSWORD = ''  # Redis  密码 没有可以留空

# 邮箱配置
EMAIL_ENABLED = 0  # 是否开启邮件通知
EMAIL_SENDER = '[email protected]'  # 邮件发送者
EMAIL_RECEIVER = '[email protected]'  # 邮件接受者 # 可以多个 [[email protected], [email protected]]
EMAIL_SERVER_HOST = 'localhost'  # 邮件服务 host
EMAIL_SERVER_USER = ''  # 邮件服务登录用户名
EMAIL_SERVER_PASSWORD = ''  # 邮件服务登录密码

# Web 管理
WEB_ENABLE = 1  # 是否打开 Web 管理
WEB_USER = {  # 登录信息
    'username': 'admin',
    'password': 'password'
}
WEB_PORT = 8008  # 监听端口

# 是否开启 CDN 查询
CDN_ENABLED = 0
CDN_CHECK_TIME_OUT = 1 # 检测单个 cdn 是否可用超时时间

# 是否使用浏览器缓存中的RAIL_EXPIRATION 和 RAIL_DEVICEID
CACHE_RAIL_ID_ENABLED = 0
RAIL_EXPIRATION = '' #浏览12306 网站中的Cache的RAIL_EXPIRATION 值
RAIL_DEVICEID = '' #浏览12306 网站中的Cache的RAIL_DEVICEID 值

# 查询任务
QUERY_JOBS = [
    {
        # 'job_name':  'bj -> sz',  # 任务名称,不填默认会以车站名命名,不可重复
        'account_key': 0,  # 将会使用指定账号下单
        'left_dates': [  # 出发日期 :Array
            "2020-01-25",
            "2020-01-26",
        ],
        'stations': {  # 车站 支持多个车站同时查询  :Dict or :List
            'left': '北京',
            'arrive': '深圳',
        },
        #  # 多个车站示例  (建议添加多个,有时多买几站成功率会高一点)
        # 'stations': [{
        #     'left': '北京',
        #     'arrive': '深圳',
        # },{  # 多个车站示例
        #     'left': '北京',
        #     'arrive': '广州',
        # }],
        'members': [  # 乘客姓名,会根据当前账号自动识别乘客类型 购买儿童票 设置两个相同的姓名即可,程序会自动识别 如  ['张三', '张三']
            "张三",
            #"*王五", #在姓名前加*表示学生购买成人票
            # 7,  # 支持通过序号确定唯一乘客,序号查看可通过  python main.py -t 登录成功之后在 runtime/user/ 下找到对应的 用户名_passengers.json 文件,找到对应的 code 填入
        ],
        'allow_less_member': 0,  # 是否允许余票不足时提交部分乘客
        'seats': [  # 筛选座位  有先后顺序 :Array
            # 可用值: 特等座, 商务座, 一等座, 二等座, 软卧, 硬卧, 动卧, 软座, 硬座, 无座
            '硬卧',
            '硬座'
        ],
        'train_numbers': [  # 筛选车次 可以为空,为空则所有车次都可以提交 如 [] 注意大小写需要保持一致
            "K356",
            "K1172",
            "K4184"
        ],
        'except_train_numbers': [  # 筛选车次,排除车次  train_numbers 和 except_train_numbers 不可同时存在
        ],
        'period': {  # 筛选时间
            'from': '00:00',
            'to': '24:00'
        }

    },
    # {
    #     'job_name':  'cd -> gz',  # 任务名称,不填默认会以车站名命名,不可重复
    #     'account_key': 0,  # 将会使用指定账号下单
    #     'left_dates': [
    #         "2019-01-27",
    #         "2019-01-28"
    #     ],
    #     'stations': {
    #         'left': '成都',
    #         'arrive': '广州',
    #     },
    #     'members': [
    #         "小王",
    #     ],
    #     'allow_less_member': 0,
    #     'seats': [
    #         '硬卧',
    #     ],
    #     'train_numbers': []
    # }
]

4️⃣ 运行py12306

作者提供了两种运行py12306的方式,分别是源码运行和Docker运行,笔者建议能用Docker的尽量用Docker,毕竟源码运行还得搞定Python环境,也是个麻烦事儿。

一、源码方式运行

运行py12306需要python 3.6 及以上版本,源码运行的话请自行现在机器上安装好Python。

1、下载源码&安装依赖

git clone https://github.com/pjialin/py12306

pip install -r requirements.txt

2、配置

将上面配置好的env.py文件拷贝到py12306文件夹中

3、启动前测试

目前提供了一些简单的测试,包括用户账号检测,乘客信息检测,车站检测等

A、开始测试 -t

python main.py -t

B、测试通知消息 (语音, 邮件) -t -n

# 默认不会进行通知测试,要对通知进行测试需要加上 -n 参数 
python main.py -t -n

4、运行程序

python main.py

详细的参数列表如下:

-t 测试配置信息
-t -n 测试配置信息以及通知消息
-c 指定自定义配置文件位置

二、Docker方式运行

Docker运行相对就简单的多了,直接使用Docker Compose就能快速启动。

1、配置

新建文件夹config,将上面配置好的env.py文件拷贝到config文件夹中。

2、compose.yml

笔者把compose.yml文件贴在下面了,直接在NAS上使用Docker Compose跑起来就行。在群晖里就是新建项目,在威联通里就行新建应用程序,都是一个意思。官方的Docker镜像似乎跑不起来了了,于是笔者自己打了个镜像,名称为fooololo/py12306

version: '3.9'
services:
  py12306:
    image: fooololo/py12306:latest
    # image: pjialin/py12306:latest
    container_name: py12306
    restart: unless-stopped
    network_mode: bridge
    environment:
        TZ: Asia/Shanghai
    ports:
      - 8008:8008
    volumes:
      - path/to/py12306/config:/config
      - path/to/py12306/data:/data

参数说明

  • path/to/py12306/config: 配置文件和日志保存目录,请改成自己的实际路径,不要照搬照抄
  • path/to/py12306/data: 数据文件的保存目录,请改成自己的实际路径,不要照搬照抄
  • 8008:8008: 映射端口,左边端口可以修改

就这么多吧,原创不易,如果觉得此文对你有帮助,不妨点赞+收藏+关注,你的鼓励是我持续创作的动力!

高等精灵实验室

原创文章,作者:诺多,如若转载,请注明出处:https://www.huluohu.com/posts/948/

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
🦄 幻兽帕鲁来啦!在NAS上也能轻松搭一个专用服务器,快喊上好兄弟一起来战斗!
上一篇 2024年1月26日 17:48
🦌 Appsmith:一个用于构建、部署和维护内部应用程序的开源低代码平台
下一篇 2024年1月31日 21:12

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

评论列表(1条)

  • 魔龙
    魔龙 2024年2月13日 12:50

    你好,我用群晖部署的,运行后需要扫码登录,在日志里出现的码是乱的,然后提示保存到/code/runtime/user/qrcode,可是我在群晖里无法找到这个文件夹,请指教如何映射这个文件