diff --git a/py12306/cluster/cluster.py b/py12306/cluster/cluster.py index 78f5d9a..6bf5a96 100644 --- a/py12306/cluster/cluster.py +++ b/py12306/cluster/cluster.py @@ -146,7 +146,7 @@ class Cluster(): if not master: if Config().NODE_SLAVE_CAN_BE_MASTER: # 提升子节点为主节点 - slave = list(self.nodes)[-1] + slave = list(self.nodes)[0] self.session.hset(self.KEY_NODES, slave, self.KEY_MASTER) self.publish_log_message(ClusterLog.MESSAGE_ASCENDING_MASTER_NODE.format(slave, ClusterLog.get_print_nodes( diff --git a/py12306/config.py b/py12306/config.py index 3b018b5..103c7fb 100644 --- a/py12306/config.py +++ b/py12306/config.py @@ -118,8 +118,7 @@ class Config: setattr(self, key, value) if not first: if key == 'USER_ACCOUNTS' and old != value: - # 用户修改 print('用户修改了') - User.update_user_accounts(auto=True, old=old) + User().update_user_accounts(auto=True, old=old) elif key == 'QUERY_JOBS' and old != value: Query().update_query_jobs(auto=True) # 任务修改 elif key == 'QUERY_INTERVAL' and old != value: diff --git a/py12306/helpers/OCR.py b/py12306/helpers/OCR.py index cef1ff5..c7a0347 100644 --- a/py12306/helpers/OCR.py +++ b/py12306/helpers/OCR.py @@ -35,13 +35,14 @@ class OCR: def get_image_position_by_offset(self, offsets): positions = [] - width = 70 - height = 70 - random_num = random.randint(0, 8) + width = 75 + height = 75 for offset in offsets: + random_x = random.randint(-5, 5) + random_y = random.randint(-5, 5) offset = int(offset) - x = width * (offset % 5) - width / 2 + random_num - y = height * math.ceil(offset / 4) - height / 2 - random_num + x = width * ((offset - 1) % 4 + 1) - width / 2 + random_x + y = height * math.ceil(offset / 4) - height / 2 + random_y positions.append(int(x)) positions.append(int(y)) return positions diff --git a/py12306/helpers/auth_code.py b/py12306/helpers/auth_code.py index 89753f0..ed121d7 100644 --- a/py12306/helpers/auth_code.py +++ b/py12306/helpers/auth_code.py @@ -60,7 +60,7 @@ class AuthCode: 校验验证码 :return: """ - url = API_AUTH_CODE_CHECK.get('url').format(answer=answer, random=random.random()) + url = API_AUTH_CODE_CHECK.get('url').format(answer=answer, random=time_int()) response = self.session.get(url) result = response.json() if result.get('result_code') == '4': diff --git a/py12306/log/base.py b/py12306/log/base.py index 58c4ace..38ead41 100644 --- a/py12306/log/base.py +++ b/py12306/log/base.py @@ -63,7 +63,7 @@ class BaseLog: if is_main_thread(): self.logs = [] else: - if logs: del self.thread_logs[current_thread_id()] + if logs and self.thread_logs.get(current_thread_id()): del self.thread_logs[current_thread_id()] @classmethod def add_quick_log(cls, content=''): diff --git a/py12306/log/user_log.py b/py12306/log/user_log.py index 479754d..b95b1ce 100644 --- a/py12306/log/user_log.py +++ b/py12306/log/user_log.py @@ -57,7 +57,7 @@ class UserLog(BaseLog): @classmethod def print_start_login(cls, user): self = cls() - self.add_log('正在登录用户 {}'.format(user.user_name)) + self.add_quick_log('正在登录用户 {}'.format(user.user_name)) self.flush() return self diff --git a/py12306/user/job.py b/py12306/user/job.py index 853acb1..61be884 100644 --- a/py12306/user/job.py +++ b/py12306/user/job.py @@ -14,6 +14,7 @@ from py12306.log.user_log import UserLog class UserJob: # heartbeat = 60 * 2 # 心跳保持时长 heartbeat_interval = 60 * 2 + check_interval = 5 key = None user_name = '' password = '' @@ -67,7 +68,7 @@ class UserJob: if Config().is_master() and not self.cookie: self.load_user_from_remote() # 主节点加载一次 Cookie self.check_heartbeat() if Const.IS_TEST: return - sleep(self.heartbeat_interval) + sleep(self.check_interval) def check_heartbeat(self): # 心跳检测 @@ -75,7 +76,7 @@ class UserJob: return True # 只有主节点才能走到这 if self.is_first_time() or not self.check_user_is_login(): - self.handle_login() + if not self.handle_login(): return self.is_ready = True message = UserLog.MESSAGE_USER_HEARTBEAT_NORMAL.format(self.get_name(), self.heartbeat_interval) @@ -130,6 +131,7 @@ class UserJob: user_name = self.auth_uamauthclient(new_tk) self.update_user_info({'user_name': user_name}) self.login_did_success() + return True elif result.get('result_code') == 2: # 账号之内错误 # 登录失败,用户名或密码为空 # 密码输入错误 @@ -237,11 +239,13 @@ class UserJob: UserLog.add_quick_log(UserLog.MESSAGE_USER_COOKIE_NOT_FOUND_FROM_REMOTE.format(self.user_name)).flush() stay_second(self.retry_time) return self.load_user_from_remote() - self.session.cookies.update(cookie) - if not self.cookie: # 第一次加载 - self.cookie = True - self.did_loaded_user() - return True + if cookie: + self.session.cookies.update(cookie) + if not self.cookie: # 第一次加载 + self.cookie = True + self.did_loaded_user() + return True + return False def check_is_ready(self): return self.is_ready diff --git a/py12306/user/user.py b/py12306/user/user.py index 89aca10..f69ce7c 100644 --- a/py12306/user/user.py +++ b/py12306/user/user.py @@ -50,6 +50,7 @@ class User: def init_user(self, info): user = UserJob(info=info) self.users.append(user) + return user def refresh_users(self, old): for account in self.user_accounts: @@ -58,8 +59,10 @@ class User: if old_account and account != old_account: user = self.get_user(key) user.init_data(account) - elif not old_account: - self.init_user(account) + elif not old_account: # 新用户 添加到 多线程 + new_user = self.init_user(account) + create_thread_and_run(jobs=new_user, callback_name='run', wait=Const.IS_TEST) + for account in old: # 退出已删除的用户 if not array_dict_find_by_key_value(self.user_accounts, 'key', account.get('key')): user = self.get_user(account.get('key'))