增加排除车次, 增加通过序号确定唯一联系人 #68
This commit is contained in:
@@ -121,7 +121,8 @@ docker run --rm --name py12306 -p 8008:8008 -d -v $(pwd):/config -v py12306:/dat
|
|||||||
- 新增 钉钉通知
|
- 新增 钉钉通知
|
||||||
- 新增 Telegram 通知
|
- 新增 Telegram 通知
|
||||||
- 新增 ServerChan 和 PushBear 微信推送
|
- 新增 ServerChan 和 PushBear 微信推送
|
||||||
|
- 19-01-18
|
||||||
|
- 新增 CDN 查询
|
||||||
|
|
||||||
## 截图
|
## 截图
|
||||||
### Web 管理页面
|
### Web 管理页面
|
||||||
|
|||||||
@@ -99,6 +99,9 @@ WEB_USER = { # 登录信息
|
|||||||
}
|
}
|
||||||
WEB_PORT = 8008 # 监听端口
|
WEB_PORT = 8008 # 监听端口
|
||||||
|
|
||||||
|
# 是否开启 CDN 查询
|
||||||
|
CDN_ENABLED = 0
|
||||||
|
|
||||||
# 查询任务
|
# 查询任务
|
||||||
QUERY_JOBS = [
|
QUERY_JOBS = [
|
||||||
{
|
{
|
||||||
@@ -123,6 +126,7 @@ QUERY_JOBS = [
|
|||||||
'members': [ # 乘客姓名,会根据当前账号自动识别乘客类型 购买儿童票 设置两个相同的姓名即可,程序会自动识别 如 ['张三', '张三']
|
'members': [ # 乘客姓名,会根据当前账号自动识别乘客类型 购买儿童票 设置两个相同的姓名即可,程序会自动识别 如 ['张三', '张三']
|
||||||
"张三",
|
"张三",
|
||||||
"王五",
|
"王五",
|
||||||
|
# 7, # 支持通过序号确定唯一乘客,序号查看可通过 python main.py -t 登录成功之后在 runtime/user/ 下找到对应的 用户名_passengers.json 文件,找到对应的 code 填入
|
||||||
],
|
],
|
||||||
'allow_less_member': 0, # 是否允许余票不足时提交部分乘客
|
'allow_less_member': 0, # 是否允许余票不足时提交部分乘客
|
||||||
'seats': [ # 筛选座位 有先后顺序 :Array
|
'seats': [ # 筛选座位 有先后顺序 :Array
|
||||||
@@ -134,6 +138,8 @@ QUERY_JOBS = [
|
|||||||
"K356",
|
"K356",
|
||||||
"K1172",
|
"K1172",
|
||||||
"K4184"
|
"K4184"
|
||||||
|
],
|
||||||
|
'except_train_numbers': [ # 筛选车次,排除车次 train_numbers 和 except_train_numbers 不可同时存在
|
||||||
]
|
]
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -97,6 +97,9 @@ WEB_USER = { # 登录信息
|
|||||||
}
|
}
|
||||||
WEB_PORT = 8008 # 监听端口
|
WEB_PORT = 8008 # 监听端口
|
||||||
|
|
||||||
|
# 是否开启 CDN 查询
|
||||||
|
CDN_ENABLED = 0
|
||||||
|
|
||||||
# 查询任务
|
# 查询任务
|
||||||
QUERY_JOBS = [
|
QUERY_JOBS = [
|
||||||
{
|
{
|
||||||
@@ -121,6 +124,7 @@ QUERY_JOBS = [
|
|||||||
'members': [ # 乘客姓名,会根据当前账号自动识别乘客类型 购买儿童票 设置两个相同的姓名即可,程序会自动识别 如 ['张三', '张三']
|
'members': [ # 乘客姓名,会根据当前账号自动识别乘客类型 购买儿童票 设置两个相同的姓名即可,程序会自动识别 如 ['张三', '张三']
|
||||||
"张三",
|
"张三",
|
||||||
"王五",
|
"王五",
|
||||||
|
# 7, # 支持通过序号确定唯一乘客,序号查看可通过 python main.py -t 登录成功之后在 runtime/user/ 下找到对应的 用户名_passengers.json 文件,找到对应的 code 填入
|
||||||
],
|
],
|
||||||
'allow_less_member': 0, # 是否允许余票不足时提交部分乘客
|
'allow_less_member': 0, # 是否允许余票不足时提交部分乘客
|
||||||
'seats': [ # 筛选座位 有先后顺序 :Array
|
'seats': [ # 筛选座位 有先后顺序 :Array
|
||||||
@@ -132,6 +136,8 @@ QUERY_JOBS = [
|
|||||||
"K356",
|
"K356",
|
||||||
"K1172",
|
"K1172",
|
||||||
"K4184"
|
"K4184"
|
||||||
|
],
|
||||||
|
'except_train_numbers': [ # 筛选车次,排除车次 train_numbers 和 except_train_numbers 不可同时存在
|
||||||
]
|
]
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -37,6 +37,7 @@ class Config:
|
|||||||
RUNTIME_DIR = PROJECT_DIR + 'runtime/'
|
RUNTIME_DIR = PROJECT_DIR + 'runtime/'
|
||||||
QUERY_DATA_DIR = RUNTIME_DIR + 'query/'
|
QUERY_DATA_DIR = RUNTIME_DIR + 'query/'
|
||||||
USER_DATA_DIR = RUNTIME_DIR + 'user/'
|
USER_DATA_DIR = RUNTIME_DIR + 'user/'
|
||||||
|
USER_PASSENGERS_FILE = RUNTIME_DIR + 'user/%s_passengers.json'
|
||||||
|
|
||||||
STATION_FILE = PROJECT_DIR + 'data/stations.txt'
|
STATION_FILE = PROJECT_DIR + 'data/stations.txt'
|
||||||
CONFIG_FILE = PROJECT_DIR + 'env.py'
|
CONFIG_FILE = PROJECT_DIR + 'env.py'
|
||||||
|
|||||||
@@ -121,6 +121,12 @@ def time_int():
|
|||||||
return int(time.time())
|
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={}):
|
def create_thread_and_run(jobs, callback_name, wait=True, daemon=True, args=(), kwargs={}):
|
||||||
threads = []
|
threads = []
|
||||||
if not isinstance(jobs, list): jobs = [jobs]
|
if not isinstance(jobs, list): jobs = [jobs]
|
||||||
|
|||||||
@@ -101,7 +101,11 @@ class QueryLog(BaseLog):
|
|||||||
self.add_log('乘车日期:{}'.format(job.left_dates))
|
self.add_log('乘车日期:{}'.format(job.left_dates))
|
||||||
self.add_log('坐席:{}'.format(','.join(job.allow_seats)))
|
self.add_log('坐席:{}'.format(','.join(job.allow_seats)))
|
||||||
self.add_log('乘车人:{}'.format(','.join(job.members)))
|
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))
|
self.add_log('任务名称:{}'.format(job.job_name))
|
||||||
# 乘车日期:['2019-01-24', '2019-01-25', '2019-01-26', '2019-01-27']
|
# 乘车日期:['2019-01-24', '2019-01-25', '2019-01-26', '2019-01-27']
|
||||||
self.add_log('')
|
self.add_log('')
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ class Job:
|
|||||||
current_seat = None
|
current_seat = None
|
||||||
current_order_seat = None
|
current_order_seat = None
|
||||||
allow_train_numbers = []
|
allow_train_numbers = []
|
||||||
|
except_train_numbers = []
|
||||||
members = []
|
members = []
|
||||||
member_num = 0
|
member_num = 0
|
||||||
member_num_take = 0 # 最终提交的人数
|
member_num_take = 0 # 最终提交的人数
|
||||||
@@ -75,7 +76,8 @@ class Job:
|
|||||||
self.account_key = str(info.get('account_key'))
|
self.account_key = str(info.get('account_key'))
|
||||||
self.allow_seats = info.get('seats')
|
self.allow_seats = info.get('seats')
|
||||||
self.allow_train_numbers = info.get('train_numbers')
|
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 = len(self.members)
|
||||||
self.member_num_take = self.member_num
|
self.member_num_take = self.member_num
|
||||||
self.allow_less_member = bool(info.get('allow_less_member'))
|
self.allow_less_member = bool(info.get('allow_less_member'))
|
||||||
@@ -148,7 +150,7 @@ class Job:
|
|||||||
return False
|
return False
|
||||||
for result in results:
|
for result in results:
|
||||||
self.ticket_info = ticket_info = result.split('|')
|
self.ticket_info = ticket_info = result.split('|')
|
||||||
if not self.is_trains_number_valid(ticket_info): # 车次是否有效
|
if not self.is_trains_number_valid(): # 车次是否有效
|
||||||
continue
|
continue
|
||||||
QueryLog.add_log(QueryLog.MESSAGE_QUERY_LOG_OF_EVERY_TRAIN.format(self.get_info_of_train_number()))
|
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):
|
if not self.is_has_ticket(ticket_info):
|
||||||
@@ -231,7 +233,9 @@ class Job:
|
|||||||
def is_has_ticket_by_seat(self, seat):
|
def is_has_ticket_by_seat(self, seat):
|
||||||
return seat != '' and seat != '无' and 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:
|
if self.allow_train_numbers:
|
||||||
return self.get_info_of_train_number().upper() in map(str.upper, self.allow_train_numbers)
|
return self.get_info_of_train_number().upper() in map(str.upper, self.allow_train_numbers)
|
||||||
return True
|
return True
|
||||||
|
|||||||
@@ -150,7 +150,8 @@ class UserJob:
|
|||||||
UserLog.add_quick_log(UserLog.MESSAGE_LOGIN_FAIL.format(result.get('result_message'))).flush()
|
UserLog.add_quick_log(UserLog.MESSAGE_LOGIN_FAIL.format(result.get('result_message'))).flush()
|
||||||
else:
|
else:
|
||||||
UserLog.add_quick_log(
|
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
|
return False
|
||||||
|
|
||||||
@@ -304,10 +305,14 @@ class UserJob:
|
|||||||
result = response.json()
|
result = response.json()
|
||||||
if result.get('data.normal_passengers'):
|
if result.get('data.normal_passengers'):
|
||||||
self.passengers = 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
|
return self.passengers
|
||||||
else:
|
else:
|
||||||
UserLog.add_quick_log(
|
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)
|
stay_second(self.retry_time)
|
||||||
return self.get_user_passengers()
|
return self.get_user_passengers()
|
||||||
|
|
||||||
@@ -326,11 +331,16 @@ class UserJob:
|
|||||||
self.get_user_passengers()
|
self.get_user_passengers()
|
||||||
results = []
|
results = []
|
||||||
for member in members:
|
for member in members:
|
||||||
|
is_member_code = is_number(member)
|
||||||
|
if not is_member_code:
|
||||||
child_check = array_dict_find_by_key_value(results, 'name', member)
|
child_check = array_dict_find_by_key_value(results, 'name', member)
|
||||||
if child_check:
|
if not is_member_code and child_check:
|
||||||
new_member = child_check.copy()
|
new_member = child_check.copy()
|
||||||
new_member['type'] = UserType.CHILD
|
new_member['type'] = UserType.CHILD
|
||||||
new_member['type_text'] = dict_find_key_by_value(UserType.dicts, int(new_member['type']))
|
new_member['type_text'] = dict_find_key_by_value(UserType.dicts, int(new_member['type']))
|
||||||
|
else:
|
||||||
|
if is_member_code:
|
||||||
|
passenger = array_dict_find_by_key_value(self.passengers, 'code', member)
|
||||||
else:
|
else:
|
||||||
passenger = array_dict_find_by_key_value(self.passengers, 'passenger_name', member)
|
passenger = array_dict_find_by_key_value(self.passengers, 'passenger_name', member)
|
||||||
if not passenger:
|
if not passenger:
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ def convert_job_to_info(job: Job):
|
|||||||
'member_num': job.member_num,
|
'member_num': job.member_num,
|
||||||
'allow_seats': job.allow_seats,
|
'allow_seats': job.allow_seats,
|
||||||
'allow_train_numbers': job.allow_train_numbers,
|
'allow_train_numbers': job.allow_train_numbers,
|
||||||
|
'except_train_numbers': job.except_train_numbers,
|
||||||
'allow_less_member': job.allow_less_member,
|
'allow_less_member': job.allow_less_member,
|
||||||
'passengers': job.passengers,
|
'passengers': job.passengers,
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user