From aa9214cc3a7b52c017924cc5aedb543003a7cd27 Mon Sep 17 00:00:00 2001 From: zhinianboke <115088296+zhinianboke@users.noreply.github.com> Date: Sat, 26 Jul 2025 22:58:18 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- XianyuAutoAsync.py | 12 +++++++++--- cookie_manager.py | 27 +++++++++++++++++++++------ db_manager.py | 19 +++++++++++++++++++ 3 files changed, 49 insertions(+), 9 deletions(-) diff --git a/XianyuAutoAsync.py b/XianyuAutoAsync.py index cb03407..7a8c19b 100644 --- a/XianyuAutoAsync.py +++ b/XianyuAutoAsync.py @@ -53,16 +53,17 @@ class XianyuLive: except: return "未知错误" - def __init__(self, cookies_str=None, cookie_id: str = "default"): + def __init__(self, cookies_str=None, cookie_id: str = "default", user_id: int = None): """初始化闲鱼直播类""" if not cookies_str: cookies_str = COOKIES_STR if not cookies_str: raise ValueError("未提供cookies,请在global_config.yml中配置COOKIES_STR或通过参数传入") - + self.cookies = trans_cookies(cookies_str) self.cookie_id = cookie_id # 唯一账号标识 self.cookies_str = cookies_str # 保存原始cookie字符串 + self.user_id = user_id # 保存用户ID,用于token刷新时保持正确的所有者关系 self.base_url = WEBSOCKET_URL self.myid = self.cookies['unb'] self.device_id = generate_device_id(self.myid) @@ -239,7 +240,12 @@ class XianyuLive: # 更新数据库中的Cookie if hasattr(self, 'cookie_id') and self.cookie_id: try: - db_manager.save_cookie(self.cookie_id, self.cookies_str) + # 获取当前Cookie的用户ID,避免在刷新时改变所有者 + current_user_id = None + if hasattr(self, 'user_id') and self.user_id: + current_user_id = self.user_id + + db_manager.save_cookie(self.cookie_id, self.cookies_str, current_user_id) logger.debug(f"已更新Cookie到数据库: {self.cookie_id}") except Exception as e: logger.error(f"更新数据库Cookie失败: {self._safe_str(e)}") diff --git a/cookie_manager.py b/cookie_manager.py index a901281..303bd16 100644 --- a/cookie_manager.py +++ b/cookie_manager.py @@ -51,11 +51,11 @@ class CookieManager: return True # ------------------------ 内部协程 ------------------------ - async def _run_xianyu(self, cookie_id: str, cookie_value: str): + async def _run_xianyu(self, cookie_id: str, cookie_value: str, user_id: int = None): """在事件循环中启动 XianyuLive.main""" from XianyuAutoAsync import XianyuLive # 延迟导入,避免循环 try: - live = XianyuLive(cookie_value, cookie_id=cookie_id) + live = XianyuLive(cookie_value, cookie_id=cookie_id, user_id=user_id) await live.main() except asyncio.CancelledError: logger.info(f"XianyuLive 任务已取消: {cookie_id}") @@ -68,9 +68,18 @@ class CookieManager: self.cookies[cookie_id] = cookie_value # 保存到数据库,如果没有指定user_id,则保持原有绑定关系 db_manager.save_cookie(cookie_id, cookie_value, user_id) - task = self.loop.create_task(self._run_xianyu(cookie_id, cookie_value)) + + # 获取实际保存的user_id(如果没有指定,数据库会返回实际的user_id) + actual_user_id = user_id + if actual_user_id is None: + # 从数据库获取Cookie对应的user_id + cookie_info = db_manager.get_cookie_details(cookie_id) + if cookie_info: + actual_user_id = cookie_info.get('user_id') + + task = self.loop.create_task(self._run_xianyu(cookie_id, cookie_value, actual_user_id)) self.tasks[cookie_id] = task - logger.info(f"已启动账号任务: {cookie_id}") + logger.info(f"已启动账号任务: {cookie_id} (用户ID: {actual_user_id})") async def _remove_cookie_async(self, cookie_id: str): task = self.tasks.pop(cookie_id, None) @@ -117,11 +126,17 @@ class CookieManager: def update_cookie(self, cookie_id: str, new_value: str): """替换指定账号的 Cookie 并重启任务""" async def _update(): + # 获取原有的user_id + original_user_id = None + cookie_info = db_manager.get_cookie_details(cookie_id) + if cookie_info: + original_user_id = cookie_info.get('user_id') + # 先移除 if cookie_id in self.tasks: await self._remove_cookie_async(cookie_id) - # 再添加 - await self._add_cookie_async(cookie_id, new_value) + # 再添加,保持原有的user_id + await self._add_cookie_async(cookie_id, new_value, original_user_id) try: current_loop = asyncio.get_running_loop() diff --git a/db_manager.py b/db_manager.py index da02ed2..d6db0d2 100644 --- a/db_manager.py +++ b/db_manager.py @@ -494,6 +494,25 @@ class DBManager: except Exception as e: logger.error(f"根据ID获取Cookie失败: {e}") return None + + def get_cookie_details(self, cookie_id: str) -> Optional[Dict[str, any]]: + """获取Cookie的详细信息,包括user_id""" + with self.lock: + try: + cursor = self.conn.cursor() + cursor.execute("SELECT id, value, user_id, created_at FROM cookies WHERE id = ?", (cookie_id,)) + result = cursor.fetchone() + if result: + return { + 'id': result[0], + 'value': result[1], + 'user_id': result[2], + 'created_at': result[3] + } + return None + except Exception as e: + logger.error(f"获取Cookie详细信息失败: {e}") + return None # -------------------- 关键字操作 -------------------- def save_keywords(self, cookie_id: str, keywords: List[Tuple[str, str]]) -> bool: