From f93fdcfd8800849285c732015336e4c3b345b607 Mon Sep 17 00:00:00 2001 From: Jalin Date: Thu, 10 Jan 2019 17:23:08 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20docker=20=E6=94=AF?= =?UTF-8?q?=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 +- Dockerfile | 19 +++++++ env.docker.py.example | 118 ++++++++++++++++++++++++++++++++++++++++++ py12306/app.py | 9 +++- 4 files changed, 147 insertions(+), 2 deletions(-) create mode 100644 Dockerfile create mode 100644 env.docker.py.example diff --git a/.gitignore b/.gitignore index 7292e9d..b75d241 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,5 @@ venv __pycache__ env.py -env.slave.py \ No newline at end of file +env.slave.py +env.docker.py \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..210250a --- /dev/null +++ b/Dockerfile @@ -0,0 +1,19 @@ +FROM python:3.6.6-slim + +MAINTAINER + +WORKDIR /code + +COPY requirements.txt . +RUN pip install --no-cache-dir -r requirements.txt + + +RUN mkdir /data +RUN mkdir -p /data/query /data/user +VOLUME /data + +COPY . . + +COPY env.docker.py.example /config/env.py + +CMD [ "python", "main.py" , "-c", "/config/env.py"] diff --git a/env.docker.py.example b/env.docker.py.example new file mode 100644 index 0000000..e714248 --- /dev/null +++ b/env.docker.py.example @@ -0,0 +1,118 @@ +# encoding=utf8 + +# 12306 账号 +USER_ACCOUNTS = [ + # 目前已支持仅查询,不下单,屏蔽掉下面的账号即可 + { + 'key': 0, # 如使用多个账号 key 不能重复 + 'user_name': 'your user name', + 'password': 'your password' + }, + # { + # 'key': 'wangwu', + # 'user_name': 'wangwu@qq.com', + # 'password': 'wangwu' + # } +] + +# 查询间隔(指每一个任务中每一个日期的间隔 / 单位秒) +# 默认取间隔/2 到 间隔之间的随机数 如设置为 1 间隔则为 0.5 ~ 1 之间的随机数 +# 接受字典形式 格式: {'min': 0.5, 'max': 1} +QUERY_INTERVAL = 1 + +# 用户心跳检测间隔 格式同上 +USER_HEARTBEAT_INTERVAL = 120 + +# 多线程查询 +QUERY_JOB_THREAD_ENABLED = 0 # 是否开启多线程查询,开启后第个任务会单独分配线程处理 + +# 打码平台账号 +# 目前只支持若快打码,注册地址:http://www.ruokuai.com/login +AUTO_CODE_ACCOUNT = { + 'user': 'your user name', + 'pwd': 'your password' +} + +# 语音验证码 +# 没找到比较好用的,现在用的这个是阿里云 API 市场上的,基本满足要求,价格也便宜 +# 购买成功后到控制台找到 APPCODE 放在下面就可以了 +# 地址:https://market.aliyun.com/products/57126001/cmapi019902.html +NOTIFICATION_BY_VOICE_CODE = 1 # 开启语音验证码 +NOTIFICATION_API_APP_CODE = 'your app code' +NOTIFICATION_VOICE_CODE_PHONE = 'your phone' # 接受通知的手机号 + +# 输出日志到文件 (Docker 中不建议修改此组配置项) +OUT_PUT_LOG_TO_FILE_ENABLED = 1 +OUT_PUT_LOG_TO_FILE_PATH = '/config/12306.log' # 日志目录 +RUNTIME_DIR = '/data/' +QUERY_DATA_DIR = '/data/query/' +USER_DATA_DIR = '/data/user/' + +# 分布式集群配置 +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 post +REDIS_PASSWORD = '' # # Redis 密码 没有可以留空 + +# 查询任务 +QUERY_JOBS = [ + { + # 'job_name': 'bj -> sz', # 任务名称,不填默认会以车站名命名,不可重复 + 'account_key': 0, # 将会使用指定账号下单 + 'left_dates': [ # 出发日期 :Array + "2019-01-25", + "2019-01-26", + ], + 'stations': { # 车站 支持多个车站同时查询 :Dict or :List + 'left': '北京', + 'arrive': '深圳', + }, + # # 多个车站示例 (建议添加多个,有时多买几站成功率会高一点) + # 'stations': [{ + # 'left': '北京', + # 'arrive': '深圳', + # },{ # 多个车站示例 + # 'left': '北京', + # 'arrive': '广州', + # }], + 'members': [ # 乘客姓名,会根据当前账号自动识别乘客类型 购买儿童票 设置两个相同的姓名即可,程序会自动识别 如 ['张三', '张三'] + "张三", + "王五", + ], + 'allow_less_member': 0, # 是否允许余票不足时提交部分乘客 + 'seats': [ # 筛选座位 有先后顺序 :Array + # 可用值: 特等座, 商务座, 一等座, 二等座, 软卧, 硬卧, 动卧, 硬座, 无座 + '硬卧', + '硬座' + ], + 'train_numbers': [ # 筛选车次 可以为空,为空则所有车次都可以提交 + "K356", + "K1172", + "K4184" + ] + + }, + # { + # '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': [] + # } +] diff --git a/py12306/app.py b/py12306/app.py index afb4976..628fea4 100644 --- a/py12306/app.py +++ b/py12306/app.py @@ -1,3 +1,4 @@ +import os import signal import sys @@ -41,7 +42,7 @@ class App: def did_start(cls): self = cls() from py12306.helpers.station import Station - Station() # 防止多线程时初始化出现问题 + Station() # 防止多线程时初始化出现问题 # if Config.is_cluster_enabled(): # from py12306.cluster.cluster import Cluster # Cluster().run() @@ -78,6 +79,11 @@ class App: return False return True + @staticmethod + def check_data_dir_exists(): + os.makedirs(Config().QUERY_DATA_DIR, exist_ok=True) + os.makedirs(Config().USER_DATA_DIR, exist_ok=True) + @classmethod def test_send_notifications(cls): if Config().NOTIFICATION_BY_VOICE_CODE: # 语音通知 @@ -92,6 +98,7 @@ class App: 待优化 :return: """ + cls.check_data_dir_exists() if not cls.check_user_account_is_empty(): # CommonLog.add_quick_log(CommonLog.MESSAGE_CHECK_EMPTY_USER_ACCOUNT).flush(exit=True, publish=False) # 不填写用户则不自动下单 if not cls.check_auto_code():