From e91ad184bbc3553d57526781ab8bf6b3ccce90f3 Mon Sep 17 00:00:00 2001 From: Jalin Date: Fri, 18 Jan 2019 17:36:01 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=8E=92=E9=99=A4=E8=BD=A6?= =?UTF-8?q?=E6=AC=A1,=20=E5=A2=9E=E5=8A=A0=E9=80=9A=E8=BF=87=E5=BA=8F?= =?UTF-8?q?=E5=8F=B7=E7=A1=AE=E5=AE=9A=E5=94=AF=E4=B8=80=E8=81=94=E7=B3=BB?= =?UTF-8?q?=E4=BA=BA=20#68?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 ++- env.docker.py.example | 20 +++++++++++++------- env.py.example | 10 ++++++++-- py12306/config.py | 1 + py12306/helpers/func.py | 6 ++++++ py12306/log/query_log.py | 6 +++++- py12306/query/job.py | 10 +++++++--- py12306/user/job.py | 20 +++++++++++++++----- py12306/web/handler/query.py | 1 + 9 files changed, 58 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index 88c223f..dab226e 100644 --- a/README.md +++ b/README.md @@ -121,7 +121,8 @@ docker run --rm --name py12306 -p 8008:8008 -d -v $(pwd):/config -v py12306:/dat - 新增 钉钉通知 - 新增 Telegram 通知 - 新增 ServerChan 和 PushBear 微信推送 - +- 19-01-18 + - 新增 CDN 查询 ## 截图 ### Web 管理页面 diff --git a/env.docker.py.example b/env.docker.py.example index ea42f50..1cf5f14 100644 --- a/env.docker.py.example +++ b/env.docker.py.example @@ -84,21 +84,24 @@ 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 = '' # 邮件服务登录密码 +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 = { # 登录信息 +WEB_USER = { # 登录信息 'username': 'admin', 'password': 'password' } WEB_PORT = 8008 # 监听端口 +# 是否开启 CDN 查询 +CDN_ENABLED = 0 + # 查询任务 QUERY_JOBS = [ { @@ -123,6 +126,7 @@ QUERY_JOBS = [ 'members': [ # 乘客姓名,会根据当前账号自动识别乘客类型 购买儿童票 设置两个相同的姓名即可,程序会自动识别 如 ['张三', '张三'] "张三", "王五", + # 7, # 支持通过序号确定唯一乘客,序号查看可通过 python main.py -t 登录成功之后在 runtime/user/ 下找到对应的 用户名_passengers.json 文件,找到对应的 code 填入 ], 'allow_less_member': 0, # 是否允许余票不足时提交部分乘客 'seats': [ # 筛选座位 有先后顺序 :Array @@ -134,6 +138,8 @@ QUERY_JOBS = [ "K356", "K1172", "K4184" + ], + 'except_train_numbers': [ # 筛选车次,排除车次 train_numbers 和 except_train_numbers 不可同时存在 ] }, diff --git a/env.py.example b/env.py.example index a3665bf..9e99118 100644 --- a/env.py.example +++ b/env.py.example @@ -86,8 +86,8 @@ 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 = '' # 邮件服务登录密码 +EMAIL_SERVER_USER = '' # 邮件服务登录用户名 +EMAIL_SERVER_PASSWORD = '' # 邮件服务登录密码 # Web 管理 WEB_ENABLE = 1 # 是否打开 Web 管理 @@ -97,6 +97,9 @@ WEB_USER = { # 登录信息 } WEB_PORT = 8008 # 监听端口 +# 是否开启 CDN 查询 +CDN_ENABLED = 0 + # 查询任务 QUERY_JOBS = [ { @@ -121,6 +124,7 @@ QUERY_JOBS = [ 'members': [ # 乘客姓名,会根据当前账号自动识别乘客类型 购买儿童票 设置两个相同的姓名即可,程序会自动识别 如 ['张三', '张三'] "张三", "王五", + # 7, # 支持通过序号确定唯一乘客,序号查看可通过 python main.py -t 登录成功之后在 runtime/user/ 下找到对应的 用户名_passengers.json 文件,找到对应的 code 填入 ], 'allow_less_member': 0, # 是否允许余票不足时提交部分乘客 'seats': [ # 筛选座位 有先后顺序 :Array @@ -132,6 +136,8 @@ QUERY_JOBS = [ "K356", "K1172", "K4184" + ], + 'except_train_numbers': [ # 筛选车次,排除车次 train_numbers 和 except_train_numbers 不可同时存在 ] }, diff --git a/py12306/config.py b/py12306/config.py index 4b95fc6..ae3b67f 100644 --- a/py12306/config.py +++ b/py12306/config.py @@ -37,6 +37,7 @@ class Config: RUNTIME_DIR = PROJECT_DIR + 'runtime/' QUERY_DATA_DIR = RUNTIME_DIR + 'query/' USER_DATA_DIR = RUNTIME_DIR + 'user/' + USER_PASSENGERS_FILE = RUNTIME_DIR + 'user/%s_passengers.json' STATION_FILE = PROJECT_DIR + 'data/stations.txt' CONFIG_FILE = PROJECT_DIR + 'env.py' diff --git a/py12306/helpers/func.py b/py12306/helpers/func.py index b6f7196..2d55ab1 100644 --- a/py12306/helpers/func.py +++ b/py12306/helpers/func.py @@ -121,6 +121,12 @@ def time_int(): return int(time.time()) +def is_number(val): + if isinstance(val, int): return val + if isinstance(val, str): return val.isdigit() + return False + + def create_thread_and_run(jobs, callback_name, wait=True, daemon=True, args=(), kwargs={}): threads = [] if not isinstance(jobs, list): jobs = [jobs] diff --git a/py12306/log/query_log.py b/py12306/log/query_log.py index 62aa137..c77c6e8 100644 --- a/py12306/log/query_log.py +++ b/py12306/log/query_log.py @@ -101,7 +101,11 @@ class QueryLog(BaseLog): self.add_log('乘车日期:{}'.format(job.left_dates)) self.add_log('坐席:{}'.format(','.join(job.allow_seats))) self.add_log('乘车人:{}'.format(','.join(job.members))) - self.add_log('筛选车次:{}'.format(','.join(job.allow_train_numbers if job.allow_train_numbers else ['不筛选']))) + if job.except_train_numbers: + train_number_message = '排除 ' + ','.join(job.allow_train_numbers) + else: + train_number_message = ','.join(job.allow_train_numbers if job.allow_train_numbers else ['不筛选']) + self.add_log('筛选车次:{}'.format(train_number_message)) self.add_log('任务名称:{}'.format(job.job_name)) # 乘车日期:['2019-01-24', '2019-01-25', '2019-01-26', '2019-01-27'] self.add_log('') diff --git a/py12306/query/job.py b/py12306/query/job.py index 3debf1a..edcb664 100644 --- a/py12306/query/job.py +++ b/py12306/query/job.py @@ -34,6 +34,7 @@ class Job: current_seat = None current_order_seat = None allow_train_numbers = [] + except_train_numbers = [] members = [] member_num = 0 member_num_take = 0 # 最终提交的人数 @@ -75,7 +76,8 @@ class Job: self.account_key = str(info.get('account_key')) self.allow_seats = info.get('seats') self.allow_train_numbers = info.get('train_numbers') - self.members = info.get('members') + self.except_train_numbers = info.get('except_train_numbers') + self.members = list(map(str, info.get('members'))) self.member_num = len(self.members) self.member_num_take = self.member_num self.allow_less_member = bool(info.get('allow_less_member')) @@ -148,7 +150,7 @@ class Job: return False for result in results: self.ticket_info = ticket_info = result.split('|') - if not self.is_trains_number_valid(ticket_info): # 车次是否有效 + if not self.is_trains_number_valid(): # 车次是否有效 continue QueryLog.add_log(QueryLog.MESSAGE_QUERY_LOG_OF_EVERY_TRAIN.format(self.get_info_of_train_number())) if not self.is_has_ticket(ticket_info): @@ -231,7 +233,9 @@ class Job: def is_has_ticket_by_seat(self, seat): return seat != '' and seat != '无' and seat != '*' - def is_trains_number_valid(self, ticket_info): + def is_trains_number_valid(self): + if self.except_train_numbers: + return self.get_info_of_train_number().upper() not in map(str.upper, self.except_train_numbers) if self.allow_train_numbers: return self.get_info_of_train_number().upper() in map(str.upper, self.allow_train_numbers) return True diff --git a/py12306/user/job.py b/py12306/user/job.py index 4600ed0..94d9f0c 100644 --- a/py12306/user/job.py +++ b/py12306/user/job.py @@ -150,7 +150,8 @@ class UserJob: UserLog.add_quick_log(UserLog.MESSAGE_LOGIN_FAIL.format(result.get('result_message'))).flush() else: UserLog.add_quick_log( - UserLog.MESSAGE_LOGIN_FAIL.format(result.get('result_message', result.get('message', CommonLog.MESSAGE_RESPONSE_EMPTY_ERROR)))).flush() + UserLog.MESSAGE_LOGIN_FAIL.format(result.get('result_message', result.get('message', + CommonLog.MESSAGE_RESPONSE_EMPTY_ERROR)))).flush() return False @@ -304,10 +305,14 @@ class UserJob: result = response.json() if result.get('data.normal_passengers'): self.passengers = result.get('data.normal_passengers') + # 将乘客写入到文件 + with open(Config().USER_PASSENGERS_FILE % self.user_name, 'w') as f: + f.write(json.dumps(self.passengers,indent=4, ensure_ascii=False)) return self.passengers else: UserLog.add_quick_log( - UserLog.MESSAGE_GET_USER_PASSENGERS_FAIL.format(result.get('messages', CommonLog.MESSAGE_RESPONSE_EMPTY_ERROR), self.retry_time)).flush() + UserLog.MESSAGE_GET_USER_PASSENGERS_FAIL.format( + result.get('messages', CommonLog.MESSAGE_RESPONSE_EMPTY_ERROR), self.retry_time)).flush() stay_second(self.retry_time) return self.get_user_passengers() @@ -326,13 +331,18 @@ class UserJob: self.get_user_passengers() results = [] for member in members: - child_check = array_dict_find_by_key_value(results, 'name', member) - if child_check: + is_member_code = is_number(member) + if not is_member_code: + child_check = array_dict_find_by_key_value(results, 'name', member) + if not is_member_code and child_check: new_member = child_check.copy() new_member['type'] = UserType.CHILD new_member['type_text'] = dict_find_key_by_value(UserType.dicts, int(new_member['type'])) else: - passenger = array_dict_find_by_key_value(self.passengers, 'passenger_name', member) + if is_member_code: + passenger = array_dict_find_by_key_value(self.passengers, 'code', member) + else: + passenger = array_dict_find_by_key_value(self.passengers, 'passenger_name', member) if not passenger: UserLog.add_quick_log( UserLog.MESSAGE_USER_PASSENGERS_IS_INVALID.format(self.user_name, member)).flush() diff --git a/py12306/web/handler/query.py b/py12306/web/handler/query.py index f66a906..93b2a7b 100644 --- a/py12306/web/handler/query.py +++ b/py12306/web/handler/query.py @@ -30,6 +30,7 @@ def convert_job_to_info(job: Job): 'member_num': job.member_num, 'allow_seats': job.allow_seats, 'allow_train_numbers': job.allow_train_numbers, + 'except_train_numbers': job.except_train_numbers, 'allow_less_member': job.allow_less_member, 'passengers': job.passengers, }