Skip to content

Commit

Permalink
增加排除车次, 增加通过序号确定唯一联系人 pjialin#68
Browse files Browse the repository at this point in the history
  • Loading branch information
pjialin committed Jan 18, 2019
1 parent 556a8fc commit e91ad18
Show file tree
Hide file tree
Showing 9 changed files with 58 additions and 19 deletions.
3 changes: 2 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 管理页面
Expand Down
20 changes: 13 additions & 7 deletions env.docker.py.example
Original file line number Diff line number Diff line change
Expand Up @@ -84,21 +84,24 @@ REDIS_PORT = '6379' # Redis port
REDIS_PASSWORD = '' # Redis 密码 没有可以留空

# 邮箱配置
EMAIL_ENABLED = 0 # 是否开启邮件通知
EMAIL_SENDER = '[email protected]' # 邮件发送者
EMAIL_RECEIVER = '[email protected]' # 邮件接受者 # 可以多个 [[email protected], [email protected]]
EMAIL_SERVER_HOST = 'localhost' # 邮件服务 host
EMAIL_SERVER_USER = '' # 邮件服务登录用户名
EMAIL_SERVER_PASSWORD = '' # 邮件服务登录密码
EMAIL_ENABLED = 0 # 是否开启邮件通知
EMAIL_SENDER = '[email protected]' # 邮件发送者
EMAIL_RECEIVER = '[email protected]' # 邮件接受者 # 可以多个 [[email protected], [email protected]]
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 = [
{
Expand All @@ -123,6 +126,7 @@ QUERY_JOBS = [
'members': [ # 乘客姓名,会根据当前账号自动识别乘客类型 购买儿童票 设置两个相同的姓名即可,程序会自动识别 如 ['张三', '张三']
"张三",
"王五",
# 7, # 支持通过序号确定唯一乘客,序号查看可通过 python main.py -t 登录成功之后在 runtime/user/ 下找到对应的 用户名_passengers.json 文件,找到对应的 code 填入
],
'allow_less_member': 0, # 是否允许余票不足时提交部分乘客
'seats': [ # 筛选座位 有先后顺序 :Array
Expand All @@ -134,6 +138,8 @@ QUERY_JOBS = [
"K356",
"K1172",
"K4184"
],
'except_train_numbers': [ # 筛选车次,排除车次 train_numbers 和 except_train_numbers 不可同时存在
]

},
Expand Down
10 changes: 8 additions & 2 deletions env.py.example
Original file line number Diff line number Diff line change
Expand Up @@ -86,8 +86,8 @@ EMAIL_ENABLED = 0 # 是否开启邮件通知
EMAIL_SENDER = '[email protected]' # 邮件发送者
EMAIL_RECEIVER = '[email protected]' # 邮件接受者 # 可以多个 [[email protected], [email protected]]
EMAIL_SERVER_HOST = 'localhost' # 邮件服务 host
EMAIL_SERVER_USER = '' # 邮件服务登录用户名
EMAIL_SERVER_PASSWORD = '' # 邮件服务登录密码
EMAIL_SERVER_USER = '' # 邮件服务登录用户名
EMAIL_SERVER_PASSWORD = '' # 邮件服务登录密码

# Web 管理
WEB_ENABLE = 1 # 是否打开 Web 管理
Expand All @@ -97,6 +97,9 @@ WEB_USER = { # 登录信息
}
WEB_PORT = 8008 # 监听端口

# 是否开启 CDN 查询
CDN_ENABLED = 0

# 查询任务
QUERY_JOBS = [
{
Expand All @@ -121,6 +124,7 @@ QUERY_JOBS = [
'members': [ # 乘客姓名,会根据当前账号自动识别乘客类型 购买儿童票 设置两个相同的姓名即可,程序会自动识别 如 ['张三', '张三']
"张三",
"王五",
# 7, # 支持通过序号确定唯一乘客,序号查看可通过 python main.py -t 登录成功之后在 runtime/user/ 下找到对应的 用户名_passengers.json 文件,找到对应的 code 填入
],
'allow_less_member': 0, # 是否允许余票不足时提交部分乘客
'seats': [ # 筛选座位 有先后顺序 :Array
Expand All @@ -132,6 +136,8 @@ QUERY_JOBS = [
"K356",
"K1172",
"K4184"
],
'except_train_numbers': [ # 筛选车次,排除车次 train_numbers 和 except_train_numbers 不可同时存在
]

},
Expand Down
1 change: 1 addition & 0 deletions py12306/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -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'
Expand Down
6 changes: 6 additions & 0 deletions py12306/helpers/func.py
Original file line number Diff line number Diff line change
Expand Up @@ -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]
Expand Down
6 changes: 5 additions & 1 deletion py12306/log/query_log.py
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,11 @@ def print_init_jobs(cls, jobs):
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('')
Expand Down
10 changes: 7 additions & 3 deletions py12306/query/job.py
Original file line number Diff line number Diff line change
Expand Up @@ -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 # 最终提交的人数
Expand Down Expand Up @@ -75,7 +76,8 @@ def init_data(self, info):
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'))
Expand Down Expand Up @@ -148,7 +150,7 @@ def handle_response(self, response):
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):
Expand Down Expand Up @@ -231,7 +233,9 @@ def is_has_ticket(self, ticket_info):
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
Expand Down
20 changes: 15 additions & 5 deletions py12306/user/job.py
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,8 @@ def login(self):
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

Expand Down Expand Up @@ -304,10 +305,14 @@ def get_user_passengers(self):
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()

Expand All @@ -326,13 +331,18 @@ def get_passengers_by_members(self, members):
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()
Expand Down
1 change: 1 addition & 0 deletions py12306/web/handler/query.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
}

0 comments on commit e91ad18

Please sign in to comment.