rename old
This commit is contained in:
0
old_py12306/log/__init__.py
Normal file
0
old_py12306/log/__init__.py
Normal file
77
old_py12306/log/base.py
Normal file
77
old_py12306/log/base.py
Normal file
@@ -0,0 +1,77 @@
|
||||
import os
|
||||
import sys
|
||||
import io
|
||||
from contextlib import redirect_stdout
|
||||
|
||||
from py12306.config import Config
|
||||
from py12306.helpers.func import *
|
||||
|
||||
|
||||
class BaseLog:
|
||||
logs = []
|
||||
thread_logs = {}
|
||||
quick_log = []
|
||||
|
||||
@classmethod
|
||||
def add_log(cls, content=''):
|
||||
self = cls()
|
||||
# print('添加 Log 主进程{} 进程ID{}'.format(is_main_thread(), current_thread_id()))
|
||||
if is_main_thread():
|
||||
self.logs.append(content)
|
||||
else:
|
||||
tmp_log = self.thread_logs.get(current_thread_id(), [])
|
||||
tmp_log.append(content)
|
||||
self.thread_logs[current_thread_id()] = tmp_log
|
||||
return self
|
||||
|
||||
@classmethod
|
||||
def flush(cls, sep='\n', end='\n', file=None, exit=False, publish=True):
|
||||
from py12306.cluster.cluster import Cluster
|
||||
self = cls()
|
||||
logs = self.get_logs()
|
||||
# 输出到文件
|
||||
if file == None and Config().OUT_PUT_LOG_TO_FILE_ENABLED and not Const.IS_TEST: # TODO 文件无法写入友好提示
|
||||
file = open(Config().OUT_PUT_LOG_TO_FILE_PATH, 'a', encoding='utf-8')
|
||||
if not file: file = None
|
||||
# 输出日志到各个节点
|
||||
if publish and self.quick_log and Config().is_cluster_enabled() and Cluster().is_ready: #
|
||||
f = io.StringIO()
|
||||
with redirect_stdout(f):
|
||||
print(*logs, sep=sep, end='' if end == '\n' else end)
|
||||
out = f.getvalue()
|
||||
Cluster().publish_log_message(out)
|
||||
else:
|
||||
print(*logs, sep=sep, end=end, file=file)
|
||||
self.empty_logs(logs)
|
||||
if exit: sys.exit()
|
||||
|
||||
def get_logs(self):
|
||||
if self.quick_log:
|
||||
logs = self.quick_log
|
||||
else:
|
||||
if is_main_thread():
|
||||
logs = self.logs
|
||||
else:
|
||||
logs = self.thread_logs.get(current_thread_id())
|
||||
return logs
|
||||
|
||||
def empty_logs(self, logs=None):
|
||||
if self.quick_log:
|
||||
self.quick_log = []
|
||||
else:
|
||||
if is_main_thread():
|
||||
self.logs = []
|
||||
else:
|
||||
if logs and self.thread_logs.get(current_thread_id()): del self.thread_logs[current_thread_id()]
|
||||
|
||||
@classmethod
|
||||
def add_quick_log(cls, content=''):
|
||||
self = cls()
|
||||
self.quick_log.append(content)
|
||||
return self
|
||||
|
||||
def notification(self, title, content=''):
|
||||
# if sys.platform == 'darwin': # 不太友好 先关闭,之前没考虑到 mac 下会请求权限
|
||||
# os.system( 'osascript -e \'tell app "System Events" to display notification "{content}" with title "{title}"\''.format(
|
||||
# title=title, content=content))
|
||||
pass
|
||||
35
old_py12306/log/cluster_log.py
Normal file
35
old_py12306/log/cluster_log.py
Normal file
@@ -0,0 +1,35 @@
|
||||
from py12306.log.base import BaseLog
|
||||
from py12306.helpers.func import *
|
||||
|
||||
|
||||
@singleton
|
||||
class ClusterLog(BaseLog):
|
||||
# 这里如果不声明,会出现重复打印,目前不知道什么原因
|
||||
logs = []
|
||||
thread_logs = {}
|
||||
quick_log = []
|
||||
|
||||
MESSAGE_JOIN_CLUSTER_SUCCESS = '# 节点 {} 成功加入到集群,当前节点列表 {} #'
|
||||
|
||||
MESSAGE_LEFT_CLUSTER = '# 节点 {} 已离开集群,当前节点列表 {} #'
|
||||
|
||||
MESSAGE_NODE_ALREADY_IN_CLUSTER = '# 当前节点已存在于集群中,自动分配新的节点名称 {} #'
|
||||
|
||||
MESSAGE_SUBSCRIBE_NOTIFICATION_PREFIX = '{} )'
|
||||
MESSAGE_SUBSCRIBE_NOTIFICATION = MESSAGE_SUBSCRIBE_NOTIFICATION_PREFIX + '{}'
|
||||
|
||||
MESSAGE_ASCENDING_MASTER_NODE = '# 已将 {} 提升为主节点,当前节点列表 {} #'
|
||||
|
||||
MESSAGE_MASTER_DID_LOST = '# 主节点已退出,{} 秒后程序将自动退出 #'
|
||||
|
||||
MESSAGE_MASTER_NODE_ALREADY_RUN = '# 启动失败,主节点 {} 已经在运行中 #'
|
||||
MESSAGE_MASTER_NODE_NOT_FOUND = '# 启动失败,请先启动主节点 #'
|
||||
|
||||
MESSAGE_NODE_BECOME_MASTER_AGAIN = '# 节点 {} 已启动,已自动成为主节点 #'
|
||||
|
||||
|
||||
|
||||
@staticmethod
|
||||
def get_print_nodes(nodes):
|
||||
message = ['{}{}'.format('*' if val == '1' else '', key) for key, val in nodes.items()]
|
||||
return '[ {} ]'.format(', '.join(message))
|
||||
141
old_py12306/log/common_log.py
Normal file
141
old_py12306/log/common_log.py
Normal file
@@ -0,0 +1,141 @@
|
||||
from py12306.log.base import BaseLog
|
||||
from py12306.config import *
|
||||
from py12306.helpers.func import *
|
||||
|
||||
|
||||
@singleton
|
||||
class CommonLog(BaseLog):
|
||||
# 这里如果不声明,会出现重复打印,目前不知道什么原因
|
||||
logs = []
|
||||
thread_logs = {}
|
||||
quick_log = []
|
||||
|
||||
MESSAGE_12306_IS_CLOSED = '当前时间: {} | 12306 休息时间,程序将在明天早上 6 点自动运行'
|
||||
MESSAGE_RETRY_AUTH_CODE = '{} 秒后重新获取验证码'
|
||||
|
||||
MESSAGE_EMPTY_APP_CODE = '无法发送语音消息,未填写验证码接口 appcode'
|
||||
MESSAGE_VOICE_API_FORBID = '语音消息发送失败,请检查 appcode 是否填写正确或 套餐余额是否充足'
|
||||
MESSAGE_VOICE_API_SEND_FAIL = '语音消息发送失败,错误原因 {}'
|
||||
MESSAGE_VOICE_API_SEND_SUCCESS = '语音消息发送成功! 接口返回信息 {} '
|
||||
|
||||
MESSAGE_CHECK_AUTO_CODE_FAIL = '请配置打码账号的账号密码'
|
||||
MESSAGE_CHECK_EMPTY_USER_ACCOUNT = '请配置 12306 账号密码'
|
||||
|
||||
MESSAGE_TEST_SEND_VOICE_CODE = '正在测试发送语音验证码...'
|
||||
MESSAGE_TEST_SEND_EMAIL = '正在测试发送邮件...'
|
||||
MESSAGE_TEST_SEND_DINGTALK = '正在测试发送钉钉消息...'
|
||||
MESSAGE_TEST_SEND_TELEGRAM = '正在测试推送到Telegram...'
|
||||
MESSAGE_TEST_SEND_SERVER_CHAN = '正在测试发送ServerChan消息...'
|
||||
MESSAGE_TEST_SEND_PUSH_BEAR = '正在测试发送PushBear消息...'
|
||||
MESSAGE_TEST_SEND_PUSH_BARK = '正在测试发送Bark消息...'
|
||||
|
||||
MESSAGE_CONFIG_FILE_DID_CHANGED = '配置文件已修改,正在重新加载中\n'
|
||||
MESSAGE_API_RESPONSE_CAN_NOT_BE_HANDLE = '接口返回错误'
|
||||
|
||||
MESSAGE_SEND_EMAIL_SUCCESS = '邮件发送成功,请检查收件箱'
|
||||
MESSAGE_SEND_EMAIL_FAIL = '邮件发送失败,请手动检查配置,错误原因 {}'
|
||||
|
||||
MESSAGE_SEND_TELEGRAM_SUCCESS = 'Telegram推送成功'
|
||||
MESSAGE_SEND_TELEGRAM_FAIL = 'Telegram推送失败,错误原因 {}'
|
||||
|
||||
MESSAGE_SEND_SERVER_CHAN_SUCCESS = '发送成功,请检查微信'
|
||||
MESSAGE_SEND_SERVER_CHAN_FAIL = 'ServerChan发送失败,请检查KEY'
|
||||
|
||||
MESSAGE_SEND_PUSH_BEAR_SUCCESS = '发送成功,请检查微信'
|
||||
MESSAGE_SEND_PUSH_BEAR_FAIL = 'PushBear发送失败,请检查KEY'
|
||||
|
||||
MESSAGE_SEND_BARK_SUCCESS = 'Bark推送成功'
|
||||
MESSAGE_SEND_BARK_FAIL = 'Bark推送失败,错误原因 {}'
|
||||
|
||||
MESSAGE_OUTPUT_TO_FILE_IS_UN_ENABLE = '请先打开配置项中的:OUT_PUT_LOG_TO_FILE_ENABLED ( 输出到文件 )'
|
||||
|
||||
MESSAGE_GET_RESPONSE_FROM_FREE_AUTO_CODE = '从免费打码获取结果失败'
|
||||
|
||||
MESSAGE_RESPONSE_EMPTY_ERROR = '网络错误'
|
||||
|
||||
MESSAGE_CDN_START_TO_CHECK = '正在筛选 {} 个 CDN...'
|
||||
MESSAGE_CDN_START_TO_RECHECK = '正在重新筛选 {} 个 CDN...当前时间 {}\n'
|
||||
MESSAGE_CDN_RESTORE_SUCCESS = 'CDN 恢复成功,上次检测 {}\n'
|
||||
MESSAGE_CDN_CHECKED_SUCCESS = '# CDN 检测完成,可用 CDN {} #\n'
|
||||
MESSAGE_CDN_CLOSED = '# CDN 已关闭 #'
|
||||
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self.init_data()
|
||||
|
||||
def init_data(self):
|
||||
pass
|
||||
|
||||
@classmethod
|
||||
def print_welcome(cls):
|
||||
self = cls()
|
||||
self.add_quick_log('######## py12306 购票助手,本程序为开源工具,请勿用于商业用途 ########')
|
||||
if Const.IS_TEST:
|
||||
self.add_quick_log()
|
||||
self.add_quick_log('当前为测试模式,程序运行完成后自动结束')
|
||||
if not Const.IS_TEST and Config().OUT_PUT_LOG_TO_FILE_ENABLED:
|
||||
self.add_quick_log()
|
||||
self.add_quick_log('日志已输出到文件中: {}'.format(Config().OUT_PUT_LOG_TO_FILE_PATH))
|
||||
if Config().WEB_ENABLE:
|
||||
self.add_quick_log()
|
||||
self.add_quick_log('WEB 管理页面已开启,请访问 主机地址 + 端口 {} 进行查看'.format(Config().WEB_PORT))
|
||||
|
||||
self.add_quick_log()
|
||||
self.flush(file=False, publish=False)
|
||||
return self
|
||||
|
||||
@classmethod
|
||||
def print_configs(cls):
|
||||
# 打印配置
|
||||
self = cls()
|
||||
enable = '已开启'
|
||||
disable = '未开启'
|
||||
self.add_quick_log('**** 当前配置 ****')
|
||||
self.add_quick_log('多线程查询: {}'.format(get_true_false_text(Config().QUERY_JOB_THREAD_ENABLED, enable, disable)))
|
||||
self.add_quick_log('CDN 状态: {}'.format(get_true_false_text(Config().CDN_ENABLED, enable, disable))).flush()
|
||||
self.add_quick_log('通知状态:')
|
||||
if Config().NOTIFICATION_BY_VOICE_CODE:
|
||||
self.add_quick_log(
|
||||
'语音验证码: {}'.format(get_true_false_text(Config().NOTIFICATION_BY_VOICE_CODE, enable, disable)))
|
||||
if Config().EMAIL_ENABLED:
|
||||
self.add_quick_log('邮件通知: {}'.format(get_true_false_text(Config().EMAIL_ENABLED, enable, disable)))
|
||||
if Config().DINGTALK_ENABLED:
|
||||
self.add_quick_log('钉钉通知: {}'.format(get_true_false_text(Config().DINGTALK_ENABLED, enable, disable)))
|
||||
if Config().TELEGRAM_ENABLED:
|
||||
self.add_quick_log('Telegram通知: {}'.format(get_true_false_text(Config().TELEGRAM_ENABLED, enable, disable)))
|
||||
if Config().SERVERCHAN_ENABLED:
|
||||
self.add_quick_log(
|
||||
'ServerChan通知: {}'.format(get_true_false_text(Config().SERVERCHAN_ENABLED, enable, disable)))
|
||||
if Config().BARK_ENABLED:
|
||||
self.add_quick_log('Bark通知: {}'.format(get_true_false_text(Config().BARK_ENABLED, enable, disable)))
|
||||
if Config().PUSHBEAR_ENABLED:
|
||||
self.add_quick_log(
|
||||
'PushBear通知: {}'.format(get_true_false_text(Config().PUSHBEAR_ENABLED, enable, disable)))
|
||||
self.add_quick_log().flush(sep='\t\t')
|
||||
self.add_quick_log('查询间隔: {} 秒'.format(Config().QUERY_INTERVAL))
|
||||
self.add_quick_log('用户心跳检测间隔: {} 秒'.format(Config().USER_HEARTBEAT_INTERVAL))
|
||||
self.add_quick_log('WEB 管理页面: {}'.format(get_true_false_text(Config().WEB_ENABLE, enable, disable)))
|
||||
if Config().is_cluster_enabled():
|
||||
from py12306.cluster.cluster import Cluster
|
||||
self.add_quick_log('分布式查询: {}'.format(get_true_false_text(Config().is_cluster_enabled(), enable, enable)))
|
||||
self.add_quick_log('节点名称: {}'.format(Cluster().node_name))
|
||||
self.add_quick_log('节点是否主节点: {}'.format(get_true_false_text(Config().is_master(), '是', '否')))
|
||||
self.add_quick_log(
|
||||
'子节点提升为主节点: {}'.format(get_true_false_text(Config().NODE_SLAVE_CAN_BE_MASTER, enable, disable)))
|
||||
self.add_quick_log()
|
||||
self.flush()
|
||||
return self
|
||||
|
||||
@classmethod
|
||||
def print_test_complete(cls):
|
||||
self = cls()
|
||||
self.add_quick_log('# 测试完成,请检查输出是否正确 #')
|
||||
self.flush(publish=False)
|
||||
return self
|
||||
|
||||
@classmethod
|
||||
def print_auto_code_fail(cls, reason):
|
||||
self = cls()
|
||||
self.add_quick_log('打码失败: 错误原因 {reason}'.format(reason=reason))
|
||||
self.flush()
|
||||
return self
|
||||
72
old_py12306/log/order_log.py
Normal file
72
old_py12306/log/order_log.py
Normal file
@@ -0,0 +1,72 @@
|
||||
from py12306.log.base import BaseLog
|
||||
from py12306.helpers.func import *
|
||||
|
||||
|
||||
@singleton
|
||||
class OrderLog(BaseLog):
|
||||
# 这里如果不声明,会出现重复打印,目前不知道什么原因
|
||||
logs = []
|
||||
thread_logs = {}
|
||||
quick_log = []
|
||||
|
||||
MESSAGE_REQUEST_INIT_DC_PAGE_FAIL = '请求初始化订单页面失败'
|
||||
|
||||
MESSAGE_SUBMIT_ORDER_REQUEST_FAIL = '提交订单失败,错误原因 {} \n'
|
||||
MESSAGE_SUBMIT_ORDER_REQUEST_SUCCESS = '提交订单成功'
|
||||
MESSAGE_CHECK_ORDER_INFO_FAIL = '检查订单失败,错误原因 {} \n'
|
||||
MESSAGE_CHECK_ORDER_INFO_SUCCESS = '检查订单成功'
|
||||
|
||||
MESSAGE_GET_QUEUE_INFO_SUCCESS = '获取排队信息成功,目前排队人数 {}, 余票还剩余 {} 张'
|
||||
MESSAGE_GET_QUEUE_INFO_NO_SEAT = '接口返回实际为无票,跳过本次排队'
|
||||
MESSAGE_GET_QUEUE_COUNT_SUCCESS = '排队成功,你当前排在第 {} 位, 余票还剩余 {} 张'
|
||||
MESSAGE_GET_QUEUE_LESS_TICKET = '排队失败,目前排队人数已经超过余票张数'
|
||||
MESSAGE_GET_QUEUE_COUNT_FAIL = '排队失败,错误原因 {}'
|
||||
|
||||
MESSAGE_CONFIRM_SINGLE_FOR_QUEUE_SUCCESS = '# 提交订单成功!#'
|
||||
MESSAGE_CONFIRM_SINGLE_FOR_QUEUE_ERROR = '出票失败,错误原因 {}'
|
||||
MESSAGE_CONFIRM_SINGLE_FOR_QUEUE_FAIL = '提交订单失败,错误原因 {}'
|
||||
|
||||
MESSAGE_QUERY_ORDER_WAIT_TIME_WAITING = '排队等待中,排队人数 {},预计还需要 {} 秒'
|
||||
MESSAGE_QUERY_ORDER_WAIT_TIME_FAIL = '排队失败,错误原因 {}'
|
||||
MESSAGE_QUERY_ORDER_WAIT_TIME_INFO = '第 {} 次排队,请耐心等待'
|
||||
|
||||
MESSAGE_ORDER_SUCCESS_NOTIFICATION_TITLE = '车票购买成功!'
|
||||
MESSAGE_ORDER_SUCCESS_NOTIFICATION_CONTENT = '请及时登录12306账号[{}],打开 \'未完成订单\',在30分钟内完成支付!'
|
||||
MESSAGE_ORDER_SUCCESS_NOTIFICATION_INFO = '\t\t车次信息: {} {}[{}] -> {}[{}],乘车日期 {},席位:{},乘车人:{}'
|
||||
|
||||
MESSAGE_ORDER_SUCCESS_NOTIFICATION_OF_VOICE_CODE_START_SEND = '正在发送语音通知...'
|
||||
MESSAGE_ORDER_SUCCESS_NOTIFICATION_OF_VOICE_CODE_CONTENT = '你的车票 {} 到 {} 购买成功,请登录 12306 进行支付'
|
||||
|
||||
MESSAGE_ORDER_SUCCESS_NOTIFICATION_OF_EMAIL_CONTENT = '订单号 {},请及时登录12306账号[{}],打开 \'未完成订单\',在30分钟内完成支付!'
|
||||
|
||||
MESSAGE_JOB_CLOSED = '当前任务已结束'
|
||||
|
||||
@classmethod
|
||||
def print_passenger_did_deleted(cls, passengers):
|
||||
self = cls()
|
||||
result = [passenger.get('name') + '(' + passenger.get('type_text') + ')' for passenger in passengers]
|
||||
self.add_quick_log('# 删减后的乘客列表 {} #'.format(', '.join(result)))
|
||||
self.flush()
|
||||
return self
|
||||
|
||||
@classmethod
|
||||
def print_ticket_did_ordered(cls, order_id):
|
||||
self = cls()
|
||||
self.add_quick_log('# 车票购买成功,订单号 {} #'.format(order_id))
|
||||
self.flush()
|
||||
return self
|
||||
|
||||
@classmethod
|
||||
def get_order_success_notification_info(cls, query):
|
||||
from py12306.query.job import Job
|
||||
assert isinstance(query, Job)
|
||||
passengers = [passenger.get(
|
||||
'name') + '(' + passenger.get('type_text') + ')' for passenger in query.passengers]
|
||||
return cls.MESSAGE_ORDER_SUCCESS_NOTIFICATION_INFO.format(query.get_info_of_train_number(),
|
||||
query.get_info_of_left_station(),
|
||||
query.get_info_of_train_left_time(),
|
||||
query.get_info_of_arrive_station(),
|
||||
query.get_info_of_train_arrive_time(),
|
||||
query.get_info_of_left_date(),
|
||||
query.current_seat_name,
|
||||
','.join(passengers))
|
||||
200
old_py12306/log/query_log.py
Normal file
200
old_py12306/log/query_log.py
Normal file
@@ -0,0 +1,200 @@
|
||||
# -*- coding:utf-8 -*-
|
||||
import datetime
|
||||
import json
|
||||
import sys
|
||||
from os import path
|
||||
|
||||
from py12306.config import Config
|
||||
from py12306.cluster.cluster import Cluster
|
||||
from py12306.log.base import BaseLog
|
||||
from py12306.helpers.func import *
|
||||
|
||||
|
||||
@singleton
|
||||
class QueryLog(BaseLog):
|
||||
# 这里如果不声明,会出现重复打印,目前不知道什么原因
|
||||
logs = []
|
||||
thread_logs = {}
|
||||
quick_log = []
|
||||
|
||||
data = {
|
||||
'query_count': 0,
|
||||
'last_time': '',
|
||||
}
|
||||
data_path = None
|
||||
|
||||
LOG_INIT_JOBS = ''
|
||||
|
||||
MESSAGE_GIVE_UP_CHANCE_CAUSE_TICKET_NUM_LESS_THAN_SPECIFIED = '余票数小于乘车人数,放弃此次提交机会'
|
||||
MESSAGE_QUERY_LOG_OF_EVERY_TRAIN = '{}'
|
||||
MESSAGE_QUERY_LOG_OF_TRAIN_INFO = '{} {}'
|
||||
MESSAGE_QUERY_START_BY_DATE = '出发日期 {}: {} - {}'
|
||||
|
||||
MESSAGE_JOBS_DID_CHANGED = '任务已更新,正在重新加载...\n'
|
||||
|
||||
MESSAGE_SKIP_ORDER = '跳过本次请求,节点 {} 用户 {} 正在处理该订单\n'
|
||||
|
||||
MESSAGE_QUERY_JOB_BEING_DESTROY = '查询任务 {} 已结束\n'
|
||||
|
||||
MESSAGE_INIT_PASSENGERS_SUCCESS = '初始化乘客成功'
|
||||
MESSAGE_CHECK_PASSENGERS = '查询任务 {} 正在验证乘客信息'
|
||||
|
||||
MESSAGE_USER_IS_EMPTY_WHEN_DO_ORDER = '未配置自动下单账号,{} 秒后继续查询\n'
|
||||
MESSAGE_ORDER_USER_IS_EMPTY = '未找到下单账号,{} 秒后继续查询'
|
||||
|
||||
cluster = None
|
||||
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self.data_path = Config().QUERY_DATA_DIR + 'status.json'
|
||||
self.cluster = Cluster()
|
||||
|
||||
@classmethod
|
||||
def init_data(cls):
|
||||
self = cls()
|
||||
# 获取上次记录
|
||||
result = False
|
||||
if not Config.is_cluster_enabled() and path.exists(self.data_path):
|
||||
with open(self.data_path, encoding='utf-8') as f:
|
||||
result = f.read()
|
||||
try:
|
||||
result = json.loads(result)
|
||||
except json.JSONDecodeError as e:
|
||||
result = {}
|
||||
# self.add_quick_log('加载status.json失败, 文件内容为: {}.'.format(repr(result)))
|
||||
# self.flush() # 这里可以用不用提示
|
||||
|
||||
if Config.is_cluster_enabled():
|
||||
result = self.get_data_from_cluster()
|
||||
|
||||
if result:
|
||||
self.data = {**self.data, **result}
|
||||
self.print_data_restored()
|
||||
|
||||
def get_data_from_cluster(self):
|
||||
query_count = self.cluster.session.get(Cluster.KEY_QUERY_COUNT, 0)
|
||||
last_time = self.cluster.session.get(Cluster.KEY_QUERY_LAST_TIME, '')
|
||||
if query_count and last_time:
|
||||
return {'query_count': query_count, 'last_time': last_time}
|
||||
return False
|
||||
|
||||
def refresh_data_of_cluster(self):
|
||||
return {
|
||||
'query_count': self.cluster.session.incr(Cluster.KEY_QUERY_COUNT),
|
||||
'last_time': self.cluster.session.set(Cluster.KEY_QUERY_LAST_TIME, time_now()),
|
||||
}
|
||||
|
||||
@classmethod
|
||||
def print_init_jobs(cls, jobs):
|
||||
"""
|
||||
输出初始化信息
|
||||
:return:
|
||||
"""
|
||||
self = cls()
|
||||
self.add_log('# 发现 {} 个任务 #'.format(len(jobs)))
|
||||
index = 1
|
||||
for job in jobs:
|
||||
self.add_log('================== 任务 {} =================='.format(index))
|
||||
for station in job.stations:
|
||||
self.add_log('出发站:{} 到达站:{}'.format(station.get('left'), station.get('arrive')))
|
||||
|
||||
self.add_log('乘车日期:{}'.format(job.left_dates))
|
||||
self.add_log('坐席:{}'.format(','.join(job.allow_seats)))
|
||||
self.add_log('乘车人:{}'.format(','.join(job.members)))
|
||||
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('')
|
||||
index += 1
|
||||
|
||||
self.flush()
|
||||
return self
|
||||
|
||||
@classmethod
|
||||
def print_ticket_num_less_than_specified(cls, rest_num, job):
|
||||
self = cls()
|
||||
self.add_quick_log(
|
||||
'余票数小于乘车人数,当前余票数: {rest_num}, 实际人数 {actual_num}, 删减人车人数到: {take_num}'.format(rest_num=rest_num,
|
||||
actual_num=job.member_num,
|
||||
take_num=job.member_num_take))
|
||||
self.flush()
|
||||
return self
|
||||
|
||||
@classmethod
|
||||
def print_ticket_seat_available(cls, left_date, train_number, seat_type, rest_num):
|
||||
self = cls()
|
||||
self.add_quick_log(
|
||||
'[ 查询到座位可用 出发时间 {left_date} 车次 {train_number} 座位类型 {seat_type} 余票数量 {rest_num} ]'.format(
|
||||
left_date=left_date,
|
||||
train_number=train_number,
|
||||
seat_type=seat_type,
|
||||
rest_num=rest_num))
|
||||
self.flush()
|
||||
return self
|
||||
|
||||
@classmethod
|
||||
def print_ticket_available(cls, left_date, train_number, rest_num):
|
||||
self = cls()
|
||||
self.add_quick_log('检查完成 开始提交订单 '.format())
|
||||
self.notification('查询到可用车票', '时间 {left_date} 车次 {train_number} 余票数量 {rest_num}'.format(left_date=left_date,
|
||||
train_number=train_number,
|
||||
rest_num=rest_num))
|
||||
self.flush()
|
||||
return self
|
||||
|
||||
@classmethod
|
||||
def print_query_error(cls, reason, code=None):
|
||||
self = cls()
|
||||
self.add_quick_log('查询余票请求失败')
|
||||
if code:
|
||||
self.add_quick_log('状态码 {} '.format(code))
|
||||
if reason:
|
||||
self.add_quick_log('错误原因 {} '.format(reason))
|
||||
self.flush(sep='\t')
|
||||
return self
|
||||
|
||||
@classmethod
|
||||
def print_job_start(cls, job_name):
|
||||
self = cls()
|
||||
message = '>> 第 {query_count} 次查询 {job_name} {time}'.format(
|
||||
query_count=int(self.data.get('query_count', 0)) + 1,
|
||||
job_name=job_name, time=time_now().strftime("%Y-%m-%d %H:%M:%S"))
|
||||
self.add_log(message)
|
||||
self.refresh_data()
|
||||
if is_main_thread():
|
||||
self.flush(publish=False)
|
||||
return self
|
||||
|
||||
@classmethod
|
||||
def add_query_time_log(cls, time, is_cdn):
|
||||
return cls().add_log(('*' if is_cdn else '') + '耗时 %.2f' % time)
|
||||
|
||||
@classmethod
|
||||
def add_stay_log(cls, second):
|
||||
self = cls()
|
||||
self.add_log('停留 {}'.format(second))
|
||||
return self
|
||||
|
||||
def print_data_restored(self):
|
||||
self.add_quick_log('============================================================')
|
||||
self.add_quick_log('|=== 查询记录恢复成功 上次查询 {last_date} ===|'.format(last_date=self.data.get('last_time')))
|
||||
self.add_quick_log('============================================================')
|
||||
self.add_quick_log('')
|
||||
self.flush(publish=False)
|
||||
return self
|
||||
|
||||
def refresh_data(self):
|
||||
if Config.is_cluster_enabled():
|
||||
self.data = {**self.data, **self.refresh_data_of_cluster()}
|
||||
else:
|
||||
self.data['query_count'] += 1
|
||||
self.data['last_time'] = str(datetime.datetime.now())
|
||||
self.save_data()
|
||||
|
||||
def save_data(self):
|
||||
with open(self.data_path, 'w') as file:
|
||||
file.write(json.dumps(self.data))
|
||||
12
old_py12306/log/redis_log.py
Normal file
12
old_py12306/log/redis_log.py
Normal file
@@ -0,0 +1,12 @@
|
||||
from py12306.log.base import BaseLog
|
||||
from py12306.helpers.func import *
|
||||
|
||||
|
||||
@singleton
|
||||
class RedisLog(BaseLog):
|
||||
# 这里如果不声明,会出现重复打印,目前不知道什么原因
|
||||
logs = []
|
||||
thread_logs = {}
|
||||
quick_log = []
|
||||
|
||||
MESSAGE_REDIS_INIT_SUCCESS = 'Redis 初始化成功'
|
||||
76
old_py12306/log/user_log.py
Normal file
76
old_py12306/log/user_log.py
Normal file
@@ -0,0 +1,76 @@
|
||||
from py12306.log.base import BaseLog
|
||||
from py12306.helpers.func import *
|
||||
|
||||
|
||||
@singleton
|
||||
class UserLog(BaseLog):
|
||||
# 这里如果不声明,会出现重复打印,目前不知道什么原因
|
||||
logs = []
|
||||
thread_logs = {}
|
||||
quick_log = []
|
||||
|
||||
MESSAGE_DOWNLAOD_AUTH_CODE_FAIL = '验证码下载失败 错误原因: {} {} 秒后重试'
|
||||
MESSAGE_DOWNLAODING_THE_CODE = '正在下载验证码...'
|
||||
MESSAGE_CODE_AUTH_FAIL = '验证码验证失败 错误原因: {}'
|
||||
MESSAGE_CODE_AUTH_SUCCESS = '验证码验证成功 开始登录...'
|
||||
MESSAGE_LOGIN_FAIL = '登录失败 错误原因: {}'
|
||||
MESSAGE_LOADED_USER = '正在尝试恢复用户: {}'
|
||||
MESSAGE_LOADED_USER_SUCCESS = '用户恢复成功: {}'
|
||||
MESSAGE_LOADED_USER_BUT_EXPIRED = '用户状态已过期,正在重新登录'
|
||||
MESSAGE_USER_HEARTBEAT_NORMAL = '用户 {} 心跳正常,下次检测 {} 秒后'
|
||||
|
||||
MESSAGE_GET_USER_PASSENGERS_FAIL = '获取用户乘客列表失败,错误原因: {} {} 秒后重试'
|
||||
MESSAGE_USER_PASSENGERS_IS_INVALID = '乘客信息校验失败,在账号 {} 中未找到该乘客: {}\n'
|
||||
|
||||
# MESSAGE_WAIT_USER_INIT_COMPLETE = '未找到可用账号或用户正在初始化,{} 秒后重试'
|
||||
|
||||
MESSAGE_USERS_DID_CHANGED = '\n用户信息已更新,正在重新加载...'
|
||||
|
||||
MESSAGE_USER_BEING_DESTROY = '用户 {} 已退出'
|
||||
MESSAGE_USER_COOKIE_NOT_FOUND_FROM_REMOTE = '用户 {} 状态加载中...'
|
||||
|
||||
MESSAGE_WAIT_USER_INIT_COMPLETE = '账号正在登录中,{} 秒后自动重试'
|
||||
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self.init_data()
|
||||
|
||||
def init_data(self):
|
||||
pass
|
||||
|
||||
@classmethod
|
||||
def print_init_users(cls, users):
|
||||
"""
|
||||
输出初始化信息
|
||||
:return:
|
||||
"""
|
||||
self = cls()
|
||||
self.add_quick_log('# 发现 {} 个用户 #\n'.format(len(users)))
|
||||
self.flush()
|
||||
return self
|
||||
|
||||
@classmethod
|
||||
def print_welcome_user(cls, user):
|
||||
self = cls()
|
||||
self.add_quick_log('# 欢迎回来,{} #\n'.format(user.get_name()))
|
||||
self.flush()
|
||||
return self
|
||||
|
||||
@classmethod
|
||||
def print_start_login(cls, user):
|
||||
self = cls()
|
||||
self.add_quick_log('正在登录用户 {}'.format(user.user_name))
|
||||
self.flush()
|
||||
return self
|
||||
|
||||
@classmethod
|
||||
def print_user_passenger_init_success(cls, passengers):
|
||||
self = cls()
|
||||
result = [passenger.get('name') + '(' + passenger.get('type_text') + ')' for passenger in passengers]
|
||||
self.add_quick_log('# 乘客验证成功 {} #\n'.format(', '.join(result)))
|
||||
self.flush()
|
||||
return self
|
||||
|
||||
@classmethod
|
||||
def print_user_expired(cls):
|
||||
return cls().add_quick_log(cls.MESSAGE_LOADED_USER_BUT_EXPIRED).flush()
|
||||
Reference in New Issue
Block a user