From ca65024cd2870aa9421da680952703c28e1dd613 Mon Sep 17 00:00:00 2001 From: haosicheng Date: Sat, 11 Oct 2025 09:55:21 +0800 Subject: [PATCH] =?UTF-8?q?[patch]=20PDD=E7=99=BB=E5=BD=95=E7=8A=B6?= =?UTF-8?q?=E6=80=81GUI=E5=9B=9E=E8=B0=83=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- WebSocket/backend_singleton.py | 42 ++++++++++++++++++++++++++-------- 1 file changed, 32 insertions(+), 10 deletions(-) diff --git a/WebSocket/backend_singleton.py b/WebSocket/backend_singleton.py index 2d42eb9..aa18ae9 100644 --- a/WebSocket/backend_singleton.py +++ b/WebSocket/backend_singleton.py @@ -4,6 +4,8 @@ from typing import Optional, Callable import threading import asyncio from threading import Thread +from PyQt5.QtCore import QObject, pyqtSignal + # 创建新的后端客户端 from WebSocket.BackendClient import BackendClient from Utils.JD.JdUtils import JDListenerForGUI as JDListenerForGUI_WS @@ -11,6 +13,11 @@ from Utils.Dy.DyUtils import DouYinListenerForGUI as DYListenerForGUI_WS from Utils.Pdd.PddUtils import PddListenerForGUI as PDDListenerForGUI_WS from Utils.QianNiu.QianNiuUtils import QianNiuListenerForGUI as QNListenerForGUI_WS + +class PlatformConnectionSignals(QObject): + """平台连接信号(线程安全)""" + platform_connected = pyqtSignal(str, str) # (platform_name, store_id) + _backend_client = None @@ -36,6 +43,11 @@ class WebSocketManager: self.gui_update_callback = None self.platform_listeners = {} # 存储各平台的监听器 self.connected_platforms = [] # 存储已连接的平台列表 # <- 新增 + + # 平台连接信号(线程安全) + self.platform_signals = PlatformConnectionSignals() + self.platform_signals.platform_connected.connect(self._on_platform_signal_received) + self.callbacks = { 'log': None, 'success': None, @@ -65,8 +77,16 @@ class WebSocketManager: else: print(f"[{level}] {message}") + def _on_platform_signal_received(self, platform_name: str, store_id: str): + """接收平台连接信号(在主线程中执行)""" + try: + self._log(f"📡 收到平台连接信号: {platform_name} (店铺:{store_id})", "INFO") + self._notify_platform_connected(platform_name) + except Exception as e: + self._log(f"处理平台连接信号失败: {e}", "ERROR") + def _notify_platform_connected(self, platform_name: str): - """通知GUI平台连接成功""" + """通知GUI平台连接成功(仅在主线程中调用)""" try: if platform_name not in self.connected_platforms: self.connected_platforms.append(platform_name) @@ -325,14 +345,13 @@ class WebSocketManager: result = asyncio.run(listener.start_with_login_params(store_id=store_id, login_params=cookies)) self._log(f"📊 start_with_login_params 执行结果: {result}", "DEBUG") - # 🔥 详细的结果分析(与拼多多完全一致) + # 详细的结果分析(仅日志记录,GUI 已在主线程中通知) if result == "need_verification_code": self._log("✅ [DY] 登录流程正常,已发送验证码需求通知给后端", "SUCCESS") elif result == "verification_code_error": self._log("⚠️ [DY] 验证码错误,已发送错误通知给后端", "WARNING") elif result: self._log("✅ [DY] 登录成功,平台连接已建立", "SUCCESS") - self._notify_platform_connected("抖音") else: self._log("❌ [DY] 登录失败", "ERROR") else: @@ -357,10 +376,9 @@ class WebSocketManager: result = asyncio.run(listener.start_with_cookies(store_id=store_id, cookie_dict=cookie_dict)) self._log(f"📊 start_with_cookies 执行结果: {result}", "DEBUG") - # Cookie启动成功时也要通知GUI + # Cookie启动成功时记录日志(GUI 已在主线程中通知) if result: self._log("✅ [DY] Cookie启动成功,平台连接已建立", "SUCCESS") - self._notify_platform_connected("抖音") # 🔥 移除:不再在backend_singleton中发送connect_message # 抖音的连接状态报告应该在DyUtils中的DyLogin类中发送,与拼多多保持一致 @@ -386,7 +404,10 @@ class WebSocketManager: if f"抖音:{store_id}" in self.platform_listeners: self.platform_listeners[f"抖音:{store_id}"]['status'] = 'success' + # ✅ 临时方案:启动后立即通知(因为 DY 监听器也会阻塞) + # DY 内部会处理验证码流程,失败时会向后端上报相应状态 self._log("已启动抖音平台监听", "SUCCESS") + self._notify_platform_connected("抖音") # ← 立即通知 except Exception as e: self._log(f"启动抖音平台监听失败: {e}", "ERROR") @@ -471,14 +492,13 @@ class WebSocketManager: result = asyncio.run(listener.start_with_login_params(store_id=store_id, login_params=data)) self._log(f"📊 start_with_login_params 执行结果: {result}", "DEBUG") - # 详细的结果分析 + # 详细的结果分析(仅日志记录,GUI 已在主线程中通知) if result == "need_verification_code": self._log("✅ [PDD] 登录流程正常,已发送验证码需求通知给后端", "SUCCESS") elif result == "verification_code_error": self._log("⚠️ [PDD] 验证码错误,已发送错误通知给后端", "WARNING") elif result: self._log("✅ [PDD] 登录成功,平台连接已建立", "SUCCESS") - self._notify_platform_connected("拼多多") else: self._log("❌ [PDD] 登录失败", "ERROR") else: @@ -488,10 +508,9 @@ class WebSocketManager: result = asyncio.run(listener.start_with_cookies(store_id=store_id, cookies=data)) self._log(f"📊 start_with_cookies 执行结果: {result}", "DEBUG") - # Cookie启动成功时也要通知GUI + # Cookie启动成功时记录日志(GUI 已在主线程中通知) if result: self._log("✅ [PDD] Cookie启动成功,平台连接已建立", "SUCCESS") - self._notify_platform_connected("拼多多") # 根据实际登录结果上报状态给后端 if self.backend_client and result not in ["need_verification_code", "verification_code_error", @@ -550,7 +569,10 @@ class WebSocketManager: 'store_id': store_id, } - self._log("拼多多平台监听线程已启动,等待登录结果...", "INFO") + # ✅ 临时方案:启动后立即通知(因为 PDD 监听器会阻塞,无法通过返回值判断) + # PDD 内部会处理验证码流程,失败时会向后端上报 status=False + self._log("已启动拼多多平台监听", "SUCCESS") + self._notify_platform_connected("拼多多") # ← 立即通知 except Exception as e: self._log(f"启动拼多多平台监听失败: {e}", "ERROR")