优化用户检测流程

This commit is contained in:
Jalin
2019-01-22 21:53:41 +08:00
parent 79929da88d
commit f781c353c3
6 changed files with 35 additions and 36 deletions

View File

@@ -13,10 +13,7 @@ API_BASE_LOGIN = {
"url": BASE_URL_OF_12306 + '/passport/web/login', "url": BASE_URL_OF_12306 + '/passport/web/login',
} }
API_USER_CHECK = { API_USER_LOGIN_CHECK = BASE_URL_OF_12306 + '/otn/login/conf'
"url": BASE_URL_OF_12306 + '/otn/login/checkUser',
"method": "post",
}
API_AUTH_CODE_DOWNLOAD = { API_AUTH_CODE_DOWNLOAD = {
'url': BASE_URL_OF_12306 + '/passport/captcha/captcha-image?login_site=E&module=login&rand=sjrand&_={random}' 'url': BASE_URL_OF_12306 + '/passport/captcha/captcha-image?login_site=E&module=login&rand=sjrand&_={random}'

View File

@@ -11,13 +11,8 @@ class Request(HTMLSession):
""" """
请求处理类 请求处理类
""" """
# session = {} # session = {}
# def __init__(self, mock_browser=True, session=None):
# super().__init__(mock_browser=mock_browser)
# self.session = session if session else HTMLSession()
pass
def save_to_file(self, url, path): def save_to_file(self, url, path):
response = self.get(url, stream=True) response = self.get(url, stream=True)
with open(path, 'wb') as f: with open(path, 'wb') as f:
@@ -37,6 +32,13 @@ class Request(HTMLSession):
expand_class(response, 'json', Request.json) expand_class(response, 'json', Request.json)
return response return response
def add_response_hook(self, hook):
exist_hooks = self.hooks['response']
if not isinstance(exist_hooks, list): hooks = [exist_hooks]
hooks.append(hook)
self.hooks['response'] = hooks
return self
def json(self, default={}): def json(self, default={}):
""" """
重写 json 方法,拦截错误 重写 json 方法,拦截错误
@@ -67,4 +69,4 @@ class Request(HTMLSession):
if not cdn: cdn = Cdn.get_cdn() if not cdn: cdn = Cdn.get_cdn()
url = url.replace(HOST_URL_OF_12306, cdn) url = url.replace(HOST_URL_OF_12306, cdn)
return self.request(method,url, headers={'Host': HOST_URL_OF_12306}, verify=False, **kwargs) return self.request(method, url, headers={'Host': HOST_URL_OF_12306}, verify=False, **kwargs)

View File

@@ -43,8 +43,7 @@ class BaseLog:
else: else:
print(*logs, sep=sep, end=end, file=file) print(*logs, sep=sep, end=end, file=file)
self.empty_logs(logs) self.empty_logs(logs)
if exit: if exit: sys.exit()
sys.exit()
def get_logs(self): def get_logs(self):
if self.quick_log: if self.quick_log:

View File

@@ -70,3 +70,7 @@ class UserLog(BaseLog):
self.add_quick_log('# 乘客验证成功 {} #\n'.format(', '.join(result))) self.add_quick_log('# 乘客验证成功 {} #\n'.format(', '.join(result)))
self.flush() self.flush()
return self return self
@classmethod
def print_user_expired(cls):
return cls().add_quick_log(cls.MESSAGE_LOADED_USER_BUT_EXPIRED).flush()

View File

@@ -47,6 +47,7 @@ class UserJob:
def init_data(self, info): def init_data(self, info):
self.session = Request() self.session = Request()
self.session.add_response_hook(self.response_login_check)
self.key = str(info.get('key')) self.key = str(info.get('key'))
self.user_name = info.get('user_name') self.user_name = info.get('user_name')
self.password = info.get('password') self.password = info.get('password')
@@ -54,7 +55,6 @@ class UserJob:
def update_user(self): def update_user(self):
from py12306.user.user import User from py12306.user.user import User
self.user = User() self.user = User()
# if not Const.IS_TEST: 测试模块下也可以从文件中加载用户
self.load_user() self.load_user()
def run(self): def run(self):
@@ -71,7 +71,6 @@ class UserJob:
app_available_check() app_available_check()
if Config().is_slave(): if Config().is_slave():
self.load_user_from_remote() self.load_user_from_remote()
pass
else: else:
if Config().is_master() and not self.cookie: self.load_user_from_remote() # 主节点加载一次 Cookie if Config().is_master() and not self.cookie: self.load_user_from_remote() # 主节点加载一次 Cookie
self.check_heartbeat() self.check_heartbeat()
@@ -84,18 +83,11 @@ class UserJob:
return True return True
# 只有主节点才能走到这 # 只有主节点才能走到这
if self.is_first_time() or not self.check_user_is_login(): if self.is_first_time() or not self.check_user_is_login():
self.is_ready = False
if not self.handle_login(): return if not self.handle_login(): return
self.set_last_heartbeat()
self.is_ready = True
self.user_did_load() self.user_did_load()
message = UserLog.MESSAGE_USER_HEARTBEAT_NORMAL.format(self.get_name(), Config().USER_HEARTBEAT_INTERVAL) message = UserLog.MESSAGE_USER_HEARTBEAT_NORMAL.format(self.get_name(), Config().USER_HEARTBEAT_INTERVAL)
if not Config.is_cluster_enabled(): UserLog.add_quick_log(message).flush()
UserLog.add_quick_log(message).flush()
else:
self.cluster.publish_log_message(message)
# self.set_last_heartbeat()
def get_last_heartbeat(self): def get_last_heartbeat(self):
if Config().is_cluster_enabled(): if Config().is_cluster_enabled():
@@ -106,7 +98,7 @@ class UserJob:
def set_last_heartbeat(self, time=None): def set_last_heartbeat(self, time=None):
time = time if time != None else time_int() time = time if time != None else time_int()
if Config().is_cluster_enabled(): if Config().is_cluster_enabled():
return self.cluster.session.set(Cluster.KEY_USER_LAST_HEARTBEAT, time) self.cluster.session.set(Cluster.KEY_USER_LAST_HEARTBEAT, time)
self.last_heartbeat = time self.last_heartbeat = time
# def init_cookies # def init_cookies
@@ -115,7 +107,9 @@ class UserJob:
return not self.cluster.get_user_cookie(self.key) return not self.cluster.get_user_cookie(self.key)
return not path.exists(self.get_cookie_path()) return not path.exists(self.get_cookie_path())
def handle_login(self): def handle_login(self, expire=False):
if expire: UserLog.print_user_expired()
self.is_ready = False
UserLog.print_start_login(user=self) UserLog.print_start_login(user=self)
return self.login() return self.login()
@@ -155,15 +149,13 @@ class UserJob:
return False return False
pass
def check_user_is_login(self): def check_user_is_login(self):
response = self.session.get(API_USER_CHECK.get('url')) response = self.session.get(API_USER_LOGIN_CHECK)
is_login = response.json().get('data.flag', False) is_login = response.json().get('data.is_login', False) == 'Y'
if is_login: if is_login:
self.save_user() self.save_user()
self.set_last_heartbeat() self.set_last_heartbeat()
# self.get_user_info() # 检测应该是不会维持状态这里再请求下个人中心看有没有用01-10 看来应该是没用 return self.get_user_info() # 检测应该是不会维持状态这里再请求下个人中心看有没有用01-10 看来应该是没用 01-22 有时拿到的状态 是已失效的再加上试试
return is_login return is_login
@@ -192,7 +184,8 @@ class UserJob:
self.welcome_user() self.welcome_user()
self.save_user() self.save_user()
self.get_user_info() self.get_user_info()
pass self.set_last_heartbeat()
self.is_ready = True
def welcome_user(self): def welcome_user(self):
UserLog.print_welcome_user(self) UserLog.print_welcome_user(self)
@@ -222,7 +215,6 @@ class UserJob:
UserLog.add_quick_log(UserLog.MESSAGE_LOADED_USER.format(self.user_name)).flush() UserLog.add_quick_log(UserLog.MESSAGE_LOADED_USER.format(self.user_name)).flush()
if self.check_user_is_login() and self.get_user_info(): if self.check_user_is_login() and self.get_user_info():
UserLog.add_quick_log(UserLog.MESSAGE_LOADED_USER_SUCCESS.format(self.user_name)).flush() UserLog.add_quick_log(UserLog.MESSAGE_LOADED_USER_SUCCESS.format(self.user_name)).flush()
self.is_ready = True
UserLog.print_welcome_user(self) UserLog.print_welcome_user(self)
self.user_did_load() self.user_did_load()
else: else:
@@ -234,6 +226,7 @@ class UserJob:
用户已经加载成功 用户已经加载成功
:return: :return:
""" """
self.is_ready = True
if self.user_loaded: return if self.user_loaded: return
self.user_loaded = True self.user_loaded = True
Event().user_loaded({'key': self.key}) # 发布通知 Event().user_loaded({'key': self.key}) # 发布通知
@@ -247,7 +240,7 @@ class UserJob:
self.update_user_info({**user_data, **{'user_name': user_data.get('name')}}) self.update_user_info({**user_data, **{'user_name': user_data.get('name')}})
self.save_user() self.save_user()
return True return True
return None return False
def load_user(self): def load_user(self):
if Config().is_cluster_enabled(): return if Config().is_cluster_enabled(): return
@@ -278,7 +271,7 @@ class UserJob:
if not Config().is_slave(): if not Config().is_slave():
self.did_loaded_user() self.did_loaded_user()
else: else:
self.is_ready = True # 设置子节点用户 已准备好 self.is_ready = True # 设置子节点用户 已准备好
UserLog.print_welcome_user(self) UserLog.print_welcome_user(self)
return True return True
return False return False
@@ -300,6 +293,10 @@ class UserJob:
UserLog.add_quick_log(UserLog.MESSAGE_USER_BEING_DESTROY.format(self.user_name)).flush() UserLog.add_quick_log(UserLog.MESSAGE_USER_BEING_DESTROY.format(self.user_name)).flush()
self.is_alive = False self.is_alive = False
def response_login_check(self, response, **kwargs):
if Config().is_master() and response.json().get('data.noLogin') == 'true': # relogin
self.handle_login(expire=True)
def get_user_passengers(self): def get_user_passengers(self):
if self.passengers: return self.passengers if self.passengers: return self.passengers
response = self.session.post(API_USER_PASSENGERS) response = self.session.post(API_USER_PASSENGERS)
@@ -308,7 +305,7 @@ class UserJob:
self.passengers = result.get('data.normal_passengers') self.passengers = result.get('data.normal_passengers')
# 将乘客写入到文件 # 将乘客写入到文件
with open(Config().USER_PASSENGERS_FILE % self.user_name, 'w', encoding='utf-8') as f: with open(Config().USER_PASSENGERS_FILE % self.user_name, 'w', encoding='utf-8') as f:
f.write(json.dumps(self.passengers,indent=4, ensure_ascii=False)) 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(

View File

@@ -57,6 +57,6 @@ def convert_job_to_info(job: UserJob):
'name': job.get_name(), 'name': job.get_name(),
'is_ready': job.is_ready, 'is_ready': job.is_ready,
'is_loaded': job.user_loaded, # 是否成功加载 ready 是当前是否可用 'is_loaded': job.user_loaded, # 是否成功加载 ready 是当前是否可用
'last_heartbeat': timestamp_to_time(job.last_heartbeat), 'last_heartbeat': timestamp_to_time(job.last_heartbeat) if job.last_heartbeat else '-',
'login_num': job.login_num 'login_num': job.login_num
} }