增加排除车次, 增加通过序号确定唯一联系人 #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 通知
|
||||
- 新增 ServerChan 和 PushBear 微信推送
|
||||
|
||||
- 19-01-18
|
||||
- 新增 CDN 查询
|
||||
|
||||
## 截图
|
||||
### Web 管理页面
|
||||
|
||||
@@ -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 不可同时存在
|
||||
]
|
||||
|
||||
},
|
||||
|
||||
@@ -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 不可同时存在
|
||||
]
|
||||
|
||||
},
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -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('')
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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,
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user