群晖Docker安装12306自动购票助手

image-hbaf.png

项目介绍

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

  • 官方的Docker镜像似乎跑不起来了了,所以使用第三方打包镜像,名称为fooololo/py12306。

py12306功能简介

  • 支持多日期查询余票

  • 自动打码下单

  • 用户状态恢复

  • 电话语音通知

  • 多账号、多任务、多线程支持、支持扫描登录

  • 单个任务多站点查询

  • 支持集群部署、分布式运行

  • 支持Docker安装

  • 支持动态修改配置文件

  • 支持邮件、Bark、钉钉、电报、微信消息等通知方式

  • 友好的Web管理页面

  • 代理池支持 (画饼状态😂)

安装教程

创建所需文件夹

  1. 打开群晖的SSH功能,使用终端软件进行连接,并切换到root状态下。

  2. 进入群晖的docker文件夹(你想把配置文件和数据存在哪里就进入哪个文件夹)。

    cd /volume1/docker
  3. 创建py12306所需文件夹

    root@NAS:/volume1/docker# mkdir py12306    #创建py12306文件夹
    root@NAS:/volume1/docker# cd py12306    #进入py12306文件夹
    root@NAS:/volume1/docker/py12306# mkdir config data    #创建config配置文件夹、data数据文件夹
    root@NAS:/volume1/docker/py12306# ls    #列出当前目录的文件
    config  data
    root@NAS:/volume1/docker/py12306#
  4. 进入config文件夹

    cd config

创建配置文件

  1. 编辑配置文件

    vi env.py
  2. 按字母 i 键进入编辑模式,修改为你自己的信息后复制下面的命令,粘贴到终端,按Esc键退出编辑模式,输入:wq保存并退出。

    # -*- coding: utf-8 -*-
    
    # 12306 账号
    USER_ACCOUNTS = [
        # 目前已支持仅查询,不下单,屏蔽掉下面的账号即可
        {
            'key': 0,  # 如使用多个账号 key 不能重复
            'user_name': '12306账号',
            'password': '忽略',
            'type': 'qr'  # qr 为扫码登录,填写其他为密码登录
        },
        # {
        #     'key': 'wangwu',
        #     'user_name': 'wangwu@qq.com',    #这是演示例子
        #     '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    #0改成1是开启日志
    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 = 'sender@example.com'  # 邮件发送者
    EMAIL_RECEIVER = 'receiver@example.com'  # 邮件接受者 # 可以多个 [email1@gmail.com, email2@gmail.com]
    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': []
        # }
    ]
    
    

  3. 返回上一目录

    cd ..

创建docker-compose文件

  1. 创建docker-compose.yml文件

    vi docker-compose.yml
  2. 按字母 i 键进入编辑模式,修改为你自己的信息后复制下面的命令,粘贴到终端,按Esc键退出编辑模式,输入:wq保存并退出。

    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:
          - /volume1/docker/py12306/config:/config    #更换为你自己的文件夹路径
          - /volume1/docker/py12306/data:/data    #更换为你自己的文件夹路径

安装容器

  1. 执行命令启动docker-compose文件,拉取镜像并创建容器。

    docker-compose up -d

访问服务

  1. 打开浏览器,以群晖的IP地址+设置的端口号进行访问。
    以本机为例:http://172.16.19.6:8008
    默认账号:admin
    默认密码:password

  2. 登录成功

功德+1(狗子).gif

👇👇👇