From 547c81114516a87055e9651555a8a47923003449 Mon Sep 17 00:00:00 2001 From: zhinianboke <115088296+zhinianboke@users.noreply.github.com> Date: Thu, 31 Jul 2025 09:25:55 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=B3=A8=E9=87=8A=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 42 ++---------------------- XianyuAutoAsync.py | 74 ++----------------------------------------- utils/xianyu_utils.py | 4 --- 3 files changed, 5 insertions(+), 115 deletions(-) diff --git a/README.md b/README.md index e15cd45..a8128fc 100644 --- a/README.md +++ b/README.md @@ -46,7 +46,7 @@ - **批量管理** - 支持批量查看、编辑商品信息 - **智能去重** - 自动去重,避免重复存储 -### � 商品搜索功能 +### 🔍 商品搜索功能 - **真实数据获取** - 基于Playwright技术获取真实闲鱼商品数据 - **智能排序** - 按"人想要"数量自动倒序排列 - **多页搜索** - 支持一次性获取多页商品数据 @@ -297,7 +297,6 @@ docker rm -f xianyu-auto-reply ## ⚙️ 配置说明 - ### 管理员密码配置 **重要**:为了系统安全,强烈建议修改默认管理员密码! @@ -315,7 +314,6 @@ docker rm -f xianyu-auto-reply 3. 在"修改密码"区域输入当前密码和新密码 4. 点击"修改密码"按钮完成修改 - **密码管理机制**: - 数据库初始化时创建admin用户,密码为 `admin123` - 重启时如果用户表已存在,不重新初始化 @@ -437,43 +435,7 @@ curl http://localhost:8080/health ### 🔧 故障排除 -#### 常见问题解决 - -**1. 商品搜索功能报错(Playwright浏览器问题)** -```bash -# 错误信息:Executable doesn't exist at /root/.cache/ms-playwright/chromium... - -# 解决方案:重新构建镜像(推荐) -docker-compose down -docker-compose build --no-cache -docker-compose up -d - -# 或者手动修复(临时方案) -docker exec -it xianyu-auto-reply bash -playwright install chromium -exit -docker restart xianyu-auto-reply -``` - -**2. JavaScript运行时错误** -```bash -# 错误信息:Could not find an available JavaScript runtime - -# 解决方案1:重新构建镜像(推荐) -docker-compose down -docker-compose build --no-cache -docker-compose up -d - -# 解决方案2:手动修复 -docker exec -it xianyu-auto-reply bash -apt-get update -apt-get install -y nodejs npm -python fix_js_runtime.py -exit -docker restart xianyu-auto-reply -``` - -**2. 其他问题排查** +**1. 问题排查** 1. 查看日志:`docker-compose logs -f` 2. 检查状态:`./docker-deploy.sh status` 3. 健康检查:`curl http://localhost:8080/health` diff --git a/XianyuAutoAsync.py b/XianyuAutoAsync.py index 38ec7cb..6e8c961 100644 --- a/XianyuAutoAsync.py +++ b/XianyuAutoAsync.py @@ -107,11 +107,7 @@ class XianyuLive: self.confirmed_orders = {} # 记录已确认发货的订单,防止重复确认 self.order_confirm_cooldown = 300 # 5分钟内不重复确认同一订单 - # 人工接管功能已禁用,永远走自动模式 - # self.manual_mode_conversations = set() # 存储处于人工接管模式的会话ID - # self.manual_mode_timeout = MANUAL_MODE.get('timeout', 3600) # 人工接管超时时间,默认1小时 - # self.manual_mode_timestamps = {} # 记录进入人工模式的时间 - # self.toggle_keywords = MANUAL_MODE.get('toggle_keywords', ['。']) # 切换关键词 + self.session = None # 用于API调用的aiohttp session def can_auto_delivery(self, item_id: str) -> bool: @@ -130,39 +126,7 @@ class XianyuLive: self.last_delivery_time[item_id] = time.time() logger.debug(f"【{self.cookie_id}】标记商品 {item_id} 已发货") - # 人工接管功能已禁用,以下方法不再使用 - # def check_toggle_keywords(self, message): - # """检查消息是否包含切换关键词""" - # return any(keyword in message for keyword in self.toggle_keywords) - # def is_manual_mode(self, chat_id): - # """检查是否处于人工接管模式""" - # if chat_id in self.manual_mode_conversations: - # # 检查是否超时 - # if time.time() - self.manual_mode_timestamps.get(chat_id, 0) > self.manual_mode_timeout: - # self.exit_manual_mode(chat_id) - # return False - # return True - # return False - - # def enter_manual_mode(self, chat_id): - # """进入人工接管模式""" - # self.manual_mode_conversations.add(chat_id) - # self.manual_mode_timestamps[chat_id] = time.time() - - # def exit_manual_mode(self, chat_id): - # """退出人工接管模式""" - # self.manual_mode_conversations.discard(chat_id) - # self.manual_mode_timestamps.pop(chat_id, None) - - # def toggle_manual_mode(self, chat_id): - # """切换人工接管模式""" - # if self.is_manual_mode(chat_id): - # self.exit_manual_mode(chat_id) - # return False - # else: - # self.enter_manual_mode(chat_id) - # return True async def refresh_token(self): """刷新token""" @@ -1848,31 +1812,7 @@ class XianyuLive: logger.debug(f"提取用户ID失败: {self._safe_str(e)}") user_id = "unknown_user" - # 安全地获取商品ID - # item_id = None - # try: - # # 尝试从reminderUrl中提取商品ID - # message_1 = message.get("1") - # if isinstance(message_1, dict): - # reminder_data = message_1.get("10") - # if isinstance(reminder_data, dict): - # url_info = reminder_data.get("reminderUrl") - # if isinstance(url_info, str) and "itemId=" in url_info: - # item_id = url_info.split("itemId=")[1].split("&")[0] - # logger.info(f"从reminderUrl提取商品ID: {item_id}") - # # 如果没有提取到,使用辅助方法 - # if not item_id: - # item_id = self.extract_item_id_from_message(message) - - # # 最后的fallback - # if not item_id: - # item_id = f"auto_{user_id}_{int(time.time())}" - # logger.warning(f"无法提取商品ID,使用默认值: {item_id}") - - # except Exception as e: - # logger.error(f"提取商品ID时发生错误: {self._safe_str(e)}") - # item_id = f"auto_{user_id}_{int(time.time())}" # 安全地提取商品ID item_id = None @@ -1951,12 +1891,7 @@ class XianyuLive: # 格式化消息时间 msg_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(create_time/1000)) - # 人工接管模式已禁用,永远走自动模式 - # if self.check_toggle_keywords(send_message): - # is_manual = self.toggle_manual_mode(chat_id) - # mode_str = "进入" if is_manual else "退出" - # logger.info(f"[{msg_time}] 【系统】用户: {send_user_name} 的会话 {chat_id} [商品id: {item_id}] {mode_str}人工接管模式") - # return + # 判断消息方向 if send_user_id == self.myid: @@ -1969,10 +1904,7 @@ class XianyuLive: - # 人工接管模式已禁用,永远走自动模式 - # if self.is_manual_mode(chat_id): - # logger.info(f"[{msg_time}] 【系统】会话 {chat_id} 处于人工接管模式,不自动回复") - # return + # 自动回复消息 if not AUTO_REPLY.get('enabled', True): diff --git a/utils/xianyu_utils.py b/utils/xianyu_utils.py index 7c971ed..f30a003 100644 --- a/utils/xianyu_utils.py +++ b/utils/xianyu_utils.py @@ -372,10 +372,6 @@ def decrypt(data: str) -> str: raise Exception(f"解密失败: {str(e)}") if __name__ == '__main__': - # t = 1741667630548 - # token = 'b7e897bf9767618a32b439c6103fe1cb' - # data = '{"appKey":"444e9908a51d1cb236a27862abc769c9","deviceId":"ED4CBA2C-5DA0-4154-A902-BF5CB52409E2-3888777108"}' - # print(generate_sign(t, token, data)) msg = "ggGLAYEBsjMxNDk2MzcwNjNAZ29vZmlzaAKzNDc5ODMzODkwOTZAZ29vZmlzaAOxMzQxNjU2NTI3NDU0Mi5QTk0EAAXPAAABlbKji20GggFlA4UBoAK6W+aIkeW3suaLjeS4i++8jOW+heS7mOasvl0DoAQaBdoEKnsiY29udGVudFR5cGUiOjI2LCJkeENhcmQiOnsiaXRlbSI6eyJtYWluIjp7ImNsaWNrUGFyYW0iOnsiYXJnMSI6Ik1zZ0NhcmQiLCJhcmdzIjp7InNvdXJjZSI6ImltIiwidGFza19pZCI6IjNleFFKSE9UbVBVMSIsIm1zZ19pZCI6ImNjOGJjMmRmN2M5MzRkZjA4NmUwNTY3Y2I2OWYxNTczIn19LCJleENvbnRlbnQiOnsiYmdDb2xvciI6IiNGRkZGRkYiLCJidXR0b24iOnsiYmdDb2xvciI6IiNGRkU2MEYiLCJib3JkZXJDb2xvciI6IiNGRkU2MEYiLCJjbGlja1BhcmFtIjp7ImFyZzEiOiJNc2dDYXJkQWN0aW9uIiwiYXJncyI6eyJzb3VyY2UiOiJpbSIsInRhc2tfaWQiOiIzZXhRSkhPVG1QVTEiLCJtc2dfaWQiOiJjYzhiYzJkZjdjOTM0ZGYwODZlMDU2N2NiNjlmMTU3MyJ9fSwiZm9udENvbG9yIjoiIzMzMzMzMyIsInRhcmdldFVybCI6ImZsZWFtYXJrZXQ6Ly9hZGp1c3RfcHJpY2U/Zmx1dHRlcj10cnVlJmJpek9yZGVySWQ9MjUwMzY4ODEyNjM1NjYzNjM3MCIsInRleHQiOiLkv67mlLnku7fmoLwifSwiZGVzYyI6Iuivt+WPjOaWueayn+mAmuWPiuaXtuehruiupOS7t+agvCIsImRlc2NDb2xvciI6IiNBM0EzQTMiLCJ0aXRsZSI6IuaIkeW3suaLjeS4i++8jOW+heS7mOasviIsInVwZ3JhZGUiOnsidGFyZ2V0VXJsIjoiaHR0cHM6Ly9oNS5tLmdvb2Zpc2guY29tL2FwcC9pZGxlRmlzaC1GMmUvZm0tZG93bmxhb2QvaG9tZS5odG1sP25vUmVkcmllY3Q9dHJ1ZSZjYW5CYWNrPXRydWUmY2hlY2tWZXJzaW9uPXRydWUiLCJ2ZXJzaW9uIjoiNy43LjkwIn19LCJ0YXJnZXRVcmwiOiJmbGVhbWFya2V0Oi8vb3JkZXJfZGV0YWlsP2lkPTI1MDM2ODgxMjYzNTY2MzYzNzAmcm9sZT1zZWxsZXIifX0sInRlbXBsYXRlIjp7Im5hbWUiOiJpZGxlZmlzaF9tZXNzYWdlX3RyYWRlX2NoYXRfY2FyZCIsInVybCI6Imh0dHBzOi8vZGluYW1pY3guYWxpYmFiYXVzZXJjb250ZW50LmNvbS9wdWIvaWRsZWZpc2hfbWVzc2FnZV90cmFkZV9jaGF0X2NhcmQvMTY2NzIyMjA1Mjc2Ny9pZGxlZmlzaF9tZXNzYWdlX3RyYWRlX2NoYXRfY2FyZC56aXAiLCJ2ZXJzaW9uIjoiMTY2NzIyMjA1Mjc2NyJ9fX0HAQgBCQAK3gAQpmJpelRhZ9oAe3sic291cmNlSWQiOiJDMkM6M2V4UUpIT1RtUFUxIiwidGFza05hbWUiOiLlt7Lmi43kuItf5pyq5LuY5qy+X+WNluWutiIsIm1hdGVyaWFsSWQiOiIzZXhRSkhPVG1QVTEiLCJ0YXNrSWQiOiIzZXhRSkhPVG1QVTEifbFjbG9zZVB1c2hSZWNlaXZlcqVmYWxzZbFjbG9zZVVucmVhZE51bWJlcqVmYWxzZaxkZXRhaWxOb3RpY2W6W+aIkeW3suaLjeS4i++8jOW+heS7mOasvl2nZXh0SnNvbtoBr3sibXNnQXJncyI6eyJ0YXNrX2lkIjoiM2V4UUpIT1RtUFUxIiwic291cmNlIjoiaW0iLCJtc2dfaWQiOiJjYzhiYzJkZjdjOTM0ZGYwODZlMDU2N2NiNjlmMTU3MyJ9LCJxdWlja1JlcGx5IjoiMSIsIm1zZ0FyZzEiOiJNc2dDYXJkIiwidXBkYXRlS2V5IjoiNDc5ODMzODkwOTY6MjUwMzY4ODEyNjM1NjYzNjM3MDoxX25vdF9wYXlfc2VsbGVyIiwibWVzc2FnZUlkIjoiY2M4YmMyZGY3YzkzNGRmMDg2ZTA1NjdjYjY5ZjE1NzMiLCJtdWx0aUNoYW5uZWwiOnsiaHVhd2VpIjoiRVhQUkVTUyIsInhpYW9taSI6IjEwODAwMCIsIm9wcG8iOiJFWFBSRVNTIiwiaG9ub3IiOiJOT1JNQUwiLCJhZ29vIjoicHJvZHVjdCIsInZpdm8iOiJPUkRFUiJ9LCJjb250ZW50VHlwZSI6IjI2IiwiY29ycmVsYXRpb25Hcm91cElkIjoiM2V4UUpIT1RtUFUxX0ZGcjRHT1NuOE9RbyJ9qHJlY2VpdmVyrTIyMDI2NDA5MTgwNzmrcmVkUmVtaW5kZXKy562J5b6F5Lmw5a625LuY5qy+sHJlZFJlbWluZGVyU3R5bGWhMa9yZW1pbmRlckNvbnRlbnS6W+aIkeW3suaLjeS4i++8jOW+heS7mOasvl2ucmVtaW5kZXJOb3RpY2W75Lmw5a625bey5ouN5LiL77yM5b6F5LuY5qy+rXJlbWluZGVyVGl0bGW75Lmw5a625bey5ouN5LiL77yM5b6F5LuY5qy+q3JlbWluZGVyVXJs2gCaZmxlYW1hcmtldDovL21lc3NhZ2VfY2hhdD9pdGVtSWQ9OTAwMDUyNjQ0Mjc3JnBlZXJVc2VySWQ9MzE0OTYzNzA2MyZwZWVyVXNlck5pY2s955S3KioqeSZzaWQ9NDc5ODMzODkwOTYmbWVzc2FnZUlkPWNjOGJjMmRmN2M5MzRkZjA4NmUwNTY3Y2I2OWYxNTczJmFkdj1ub6xzZW5kZXJVc2VySWSqMzE0OTYzNzA2M65zZW5kZXJVc2VyVHlwZaEwq3Nlc3Npb25UeXBloTGqdXBkYXRlSGVhZKR0cnVlDAEDgahuZWVkUHVzaKR0cnVl" msg = "ggGLAYEBsjMxNDk2MzcwNjNAZ29vZmlzaAKzNDc5ODMzODkwOTZAZ29vZmlzaAOxMzQxNjU2NTI3NDU0Mi5QTk0EAAXPAAABlbKji20GggFlA4UBoAK6W+aIkeW3suaLjeS4i++8jOW+heS7mOasvl0DoAQaBdoEKnsiY29udGVudFR5cGUiOjI2LCJkeENhcmQiOnsiaXRlbSI6eyJtYWluIjp7ImNsaWNrUGFyYW0iOnsiYXJnMSI6Ik1zZ0NhcmQiLCJhcmdzIjp7InNvdXJjZSI6ImltIiwidGFza19pZCI6IjNleFFKSE9UbVBVMSIsIm1zZ19pZCI6ImNjOGJjMmRmN2M5MzRkZjA4NmUwNTY3Y2I2OWYxNTczIn19LCJleENvbnRlbnQiOnsiYmdDb2xvciI6IiNGRkZGRkYiLCJidXR0b24iOnsiYmdDb2xvciI6IiNGRkU2MEYiLCJib3JkZXJDb2xvciI6IiNGRkU2MEYiLCJjbGlja1BhcmFtIjp7ImFyZzEiOiJNc2dDYXJkQWN0aW9uIiwiYXJncyI6eyJzb3VyY2UiOiJpbSIsInRhc2tfaWQiOiIzZXhRSkhPVG1QVTEiLCJtc2dfaWQiOiJjYzhiYzJkZjdjOTM0ZGYwODZlMDU2N2NiNjlmMTU3MyJ9fSwiZm9udENvbG9yIjoiIzMzMzMzMyIsInRhcmdldFVybCI6ImZsZWFtYXJrZXQ6Ly9hZGp1c3RfcHJpY2U/Zmx1dHRlcj10cnVlJmJpek9yZGVySWQ9MjUwMzY4ODEyNjM1NjYzNjM3MCIsInRleHQiOiLkv67mlLnku7fmoLwifSwiZGVzYyI6Iuivt+WPjOaWueayn+mAmuWPiuaXtuehruiupOS7t+agvCIsImRlc2NDb2xvciI6IiNBM0EzQTMiLCJ0aXRsZSI6IuaIkeW3suaLjeS4i++8jOW+heS7mOasviIsInVwZ3JhZGUiOnsidGFyZ2V0VXJsIjoiaHR0cHM6Ly9oNS5tLmdvb2Zpc2guY29tL2FwcC9pZGxlRmlzaC1GMmUvZm0tZG93bmxhb2QvaG9tZS5odG1sP25vUmVkcmllY3Q9dHJ1ZSZjYW5CYWNrPXRydWUmY2hlY2tWZXJzaW9uPXRydWUiLCJ2ZXJzaW9uIjoiNy43LjkwIn19LCJ0YXJnZXRVcmwiOiJmbGVhbWFya2V0Oi8vb3JkZXJfZGV0YWlsP2lkPTI1MDM2ODgxMjYzNTY2MzYzNzAmcm9sZT1zZWxsZXIifX0sInRlbXBsYXRlIjp7Im5hbWUiOiJpZGxlZmlzaF9tZXNzYWdlX3RyYWRlX2NoYXRfY2FyZCIsInVybCI6Imh0dHBzOi8vZGluYW1pY3guYWxpYmFiYXVzZXJjb250ZW50LmNvbS9wdWIvaWRsZWZpc2hfbWVzc2FnZV90cmFkZV9jaGF0X2NhcmQvMTY2NzIyMjA1Mjc2Ny9pZGxlZmlzaF9tZXNzYWdlX3RyYWRlX2NoYXRfY2FyZC56aXAiLCJ2ZXJzaW9uIjoiMTY2NzIyMjA1Mjc2NyJ9fX0HAQgBCQAK3gAQpmJpelRhZ9oAe3sic291cmNlSWQiOiJDMkM6M2V4UUpIT1RtUFUxIiwidGFza05hbWUiOiLlt7Lmi43kuItf5pyq5LuY5qy+X+WNluWutiIsIm1hdGVyaWFsSWQiOiIzZXhRSkhPVG1QVTEiLCJ0YXNrSWQiOiIzZXhRSkhPVG1QVTEifbFjbG9zZVB1c2hSZWNlaXZlcqVmYWxzZbFjbG9zZVVucmVhZE51bWJlcqVmYWxzZaxkZXRhaWxOb3RpY2W6W+aIkeW3suaLjeS4i++8jOW+heS7mOasvl2nZXh0SnNvbtoBr3sibXNnQXJncyI6eyJ0YXNrX2lkIjoiM2V4UUpIT1RtUFUxIiwic291cmNlIjoiaW0iLCJtc2dfaWQiOiJjYzhiYzJkZjdjOTM0ZGYwODZlMDU2N2NiNjlmMTU3MyJ9LCJxdWlja1JlcGx5IjoiMSIsIm1zZ0FyZzEiOiJNc2dDYXJkIiwidXBkYXRlS2V5IjoiNDc5ODMzODkwOTY6MjUwMzY4ODEyNjM1NjYzNjM3MDoxX25vdF9wYXlfc2VsbGVyIiwibWVzc2FnZUlkIjoiY2M4YmMyZGY3YzkzNGRmMDg2ZTA1NjdjYjY5ZjE1NzMiLCJtdWx0aUNoYW5uZWwiOnsiaHVhd2VpIjoiRVhQUkVTUyIsInhpYW9taSI6IjEwODAwMCIsIm9wcG8iOiJFWFBSRVNTIiwiaG9ub3IiOiJOT1JNQUwiLCJhZ29vIjoicHJvZHVjdCIsInZpdm8iOiJPUkRFUiJ9LCJjb250ZW50VHlwZSI6IjI2IiwiY29ycmVsYXRpb25Hcm91cElkIjoiM2V4UUpIT1RtUFUxX0ZGcjRHT1NuOE9RbyJ9qHJlY2VpdmVyrTIyMDI2NDA5MTgwNzmrcmVkUmVtaW5kZXKy562J5b6F5Lmw5a625LuY5qy+sHJlZFJlbWluZGVyU3R5bGWhMa9yZW1pbmRlckNvbnRlbnS6W+aIkeW3suaLjeS4i++8jOW+heS7mOasvl2ucmVtaW5kZXJOb3RpY2W75Lmw5a625bey5ouN5LiL77yM5b6F5LuY5qy+rXJlbWluZGVyVGl0bGW75Lmw5a625bey5ouN5LiL77yM5b6F5LuY5qy+q3JlbWluZGVyVXJs2gCaZmxlYW1hcmtldDovL21lc3NhZ2VfY2hhdD9pdGVtSWQ9OTAwMDUyNjQ0Mjc3JnBlZXJVc2VySWQ9MzE0OTYzNzA2MyZwZWVyVXNlck5pY2s955S3KioqeSZzaWQ9NDc5ODMzODkwOTYmbWVzc2FnZUlkPWNjOGJjMmRmN2M5MzRkZjA4NmUwNTY3Y2I2OWYxNTczJmFkdj1ub6xzZW5kZXJVc2VySWSqMzE0OTYzNzA2M65zZW5kZXJVc2VyVHlwZaEwq3Nlc3Npb25UeXBloTGqdXBkYXRlSGVhZKR0cnVlDAEDgahuZWVkUHVzaKR0cnVl"