[patch] 因pdd内部回复消息接口与登录接口不同步导致监听过程中发送消息接口返回会话过期处理优化逻辑 并设计开发提示用户 并提供用户是否重新发送会话过期消息体按钮

This commit is contained in:
2025-10-24 17:47:28 +08:00
parent 9effc859ac
commit 7a1ad47439
3 changed files with 393 additions and 50 deletions

74
main.py
View File

@@ -38,6 +38,12 @@ class BalanceInsufficientSignals(QObject):
balance_insufficient = pyqtSignal(str) # (balance_message)
# 新增: 会话超时信号类(用于线程安全的超时重试提示)
class SessionTimeoutSignals(QObject):
"""会话超时信号"""
session_timeout = pyqtSignal(dict) # (retry_info)
# 新增: 用户名密码输入对话框类
class LoginWindow(QMainWindow):
def __init__(self):
@@ -71,6 +77,10 @@ class LoginWindow(QMainWindow):
self.balance_insufficient_signals = BalanceInsufficientSignals()
self.balance_insufficient_signals.balance_insufficient.connect(self._show_balance_insufficient_dialog)
# 创建会话超时信号对象(线程安全)
self.session_timeout_signals = SessionTimeoutSignals()
self.session_timeout_signals.session_timeout.connect(self._show_session_timeout_dialog)
# 横幅相关
self.promo_banner = None
self.banner_shadow = None # 阴影效果引用
@@ -735,6 +745,67 @@ class LoginWindow(QMainWindow):
import traceback
self.add_log(f"详细错误: {traceback.format_exc()}", "ERROR")
def _show_session_timeout_dialog(self, retry_info: dict):
"""显示会话超时重试对话框(信号槽函数,始终在主线程中执行)"""
try:
elapsed_time = retry_info.get('elapsed_time', 0)
store_id = retry_info.get('store_id', 'unknown')
pdd_instance = retry_info.get('pdd_instance')
self.add_log(f"🎯 主线程收到会话超时信号: 已等待{elapsed_time}", "INFO")
# 显示重试对话框
reply = QMessageBox.question(
self,
"拼多多会话过期",
f"拼多多会话已过期,等待后端处理超时(已等待{elapsed_time}秒)。\n\n"
f"可能原因:\n"
f"1. 后端正在处理验证码,需要更多时间\n"
f"2. 网络连接问题\n"
f"3. 后端服务异常\n\n"
f"是否重新发送通知给后端?",
QMessageBox.Yes | QMessageBox.No,
QMessageBox.Yes
)
if reply == QMessageBox.Yes:
self.add_log("✅ [GUI] 用户选择重试", "INFO")
# 调用重试方法
if pdd_instance and hasattr(pdd_instance, 'retry_session_recovery'):
try:
# 在pdd_instance的事件循环中执行重试
import asyncio
import threading
def retry_in_thread():
try:
# 创建新的事件循环或使用现有的
try:
loop = asyncio.get_event_loop()
except RuntimeError:
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
# 执行重试
loop.run_until_complete(pdd_instance.retry_session_recovery())
self.add_log("✅ [GUI] 重试请求已发送", "SUCCESS")
except Exception as e:
self.add_log(f"❌ [GUI] 执行重试失败: {e}", "ERROR")
# 在新线程中执行异步操作
retry_thread = threading.Thread(target=retry_in_thread, daemon=True)
retry_thread.start()
except Exception as e:
self.add_log(f"❌ [GUI] 启动重试失败: {e}", "ERROR")
else:
self.add_log(" [GUI] 用户取消重试", "INFO")
except Exception as e:
self.add_log(f"❌ 显示会话超时对话框失败: {e}", "ERROR")
import traceback
self.add_log(f"详细错误: {traceback.format_exc()}", "ERROR")
def _show_balance_insufficient_dialog(self, balance_msg: str):
"""显示余额不足提示框(信号槽函数,始终在主线程中执行)"""
try:
@@ -1071,6 +1142,9 @@ class LoginWindow(QMainWindow):
disconnect=self.on_disconnect, # 新增:被踢下线回调
balance_insufficient=self.on_balance_insufficient # 新增:余额不足回调
)
# 🔥 设置会话超时信号(用于拼多多会话过期重试)
ws_manager.session_timeout_signal = self.session_timeout_signals.session_timeout
# 连接后端
success = ws_manager.connect_backend(token)