初步实现下发需要验证码结构给后端

This commit is contained in:
jjz
2025-09-16 09:05:11 +08:00
parent 78889c89e1
commit faef5d2316
4 changed files with 1942 additions and 229 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -874,12 +874,14 @@ class BackendClient:
data = message.get('data', {}) data = message.get('data', {})
# 判断是拼多多登录参数还是普通Cookie # 判断是拼多多登录参数还是普通Cookie
if platform_name == "拼多多" and content == "pdd_login_params" and data.get('login_params'): if platform_name == "拼多多" and content == "拼多多登录" and data.get('login_params'):
# 拼多多登录参数模式 - 修改为使用硬编码Cookie # 拼多多登录参数模式 - 传递完整的消息JSON给处理器
print(f"收到拼多多登录参数改为使用硬编码Cookie: 平台={platform_name}, 店铺={store_id}") print(f"收到拼多多登录参数: 平台={platform_name}, 店铺={store_id}")
if self.login_callback: if self.login_callback:
# ✨ 传递硬编码Cookie标识而不是实际的登录参数 # 传递完整的JSON消息让拼多多处理器来解析login_params
self.login_callback(platform_name, store_id, "use_hardcoded_cookie") import json
full_message = json.dumps(message)
self.login_callback(platform_name, store_id, full_message)
else: else:
# 普通Cookie模式 # 普通Cookie模式
print(f"收到登录指令: 平台={platform_name}, 店铺={store_id}, cookies_len={len(cookies) if cookies else 0}") print(f"收到登录指令: 平台={platform_name}, 店铺={store_id}, cookies_len={len(cookies) if cookies else 0}")

View File

@@ -342,29 +342,72 @@ class WebSocketManager:
def _start_pdd_listener(self, store_id: str, data: str): def _start_pdd_listener(self, store_id: str, data: str):
"""启动拼多多平台监听""" """启动拼多多平台监听"""
try: try:
# ✨ 硬编码的Cookie用于测试当被风控时使用
HARDCODED_PDD_COOKIES = "api_uid=CiDokWi36GiOnwCiu5avAg==; _nano_fp=Xpmyn5CJXq9YnqdqXC_Ly~7gxE5k6VgTed8man~4; rckk=B73W46PsHlKfDlYcQnDDh3VH6AR0y5pD; _bee=B73W46PsHlKfDlYcQnDDh3VH6AR0y5pD; ru1k=9579959b-bb08-4a69-8d4c-80e676165fb8; _f77=9579959b-bb08-4a69-8d4c-80e676165fb8; ru2k=d8fdc7ca-cdfe-4ac1-ae4b-4951a8b6c0ab; _a42=d8fdc7ca-cdfe-4ac1-ae4b-4951a8b6c0ab; newUserTag171811253=1; mms_b84d1838=3616,3523,3660,3614,3599,3621,3588,3254,3532,3642,3474,3475,3477,3479,3482,1202,1203,1204,1205,3417; windows_app_shop_token_23=eyJ0IjoiYmR3aXYxZXdBTmNta2FvZDN2Z1VQNFNOZU9wUDBDZkpTcG9Ma3hobXI2L3Urc3gxQmNXTXROQmVCTkZVWlR1QSIsInYiOjEsInMiOjIzLCJtIjoxMDk5MDk5NjksInUiOjE3MTcxODYxOH0; PASS_ID=1-peFP+4sYgkULHQrtW2LfnT4LZed0EiOrHLkU0toMWbW2brIU6TD3GNe2ilb2IhsBl0j3jVDrTV7tvU3V+mTxAQ_109909969_171718618; x-visit-time=1757922212039; JSESSIONID=E6DAF348C24B047239E896D07A1BE141"
def _runner(): def _runner():
try: try:
self._log("🚀 开始创建拼多多监听器实例", "DEBUG")
listener = PDDListenerForGUI_WS(log_callback=self._log) listener = PDDListenerForGUI_WS(log_callback=self._log)
self._log("✅ 拼多多监听器实例创建成功", "DEBUG")
# ✨ 检查是否需要使用硬编码Cookie特殊标识data包含"use_hardcoded_cookie"
if "use_hardcoded_cookie" in data.lower():
self._log("🔧 检测到硬编码Cookie标识使用预设Cookie进行拼多多登录跳过风控", "INFO")
result = asyncio.run(listener.start_with_cookies(store_id=store_id, cookies=HARDCODED_PDD_COOKIES))
# 判断是登录参数还是Cookie # 判断是登录参数还是Cookie
elif self._is_pdd_login_params(data): if self._is_pdd_login_params(data):
# 使用登录参数启动 # 使用登录参数启动
self._log("📋 使用登录参数启动拼多多监听器", "INFO") self._log("📋 使用登录参数启动拼多多监听器", "INFO")
self._log("🔄 开始执行 start_with_login_params", "DEBUG")
result = asyncio.run(listener.start_with_login_params(store_id=store_id, login_params=data)) result = asyncio.run(listener.start_with_login_params(store_id=store_id, login_params=data))
self._log(f"📊 start_with_login_params 执行结果: {result}", "DEBUG")
# 详细的结果分析
if result == "need_verification_code":
self._log("✅ [PDD] 登录流程正常,已发送验证码需求通知给后端", "SUCCESS")
elif result:
self._log("✅ [PDD] 登录成功,平台连接已建立", "SUCCESS")
else:
self._log("❌ [PDD] 登录失败", "ERROR")
else: else:
# 使用Cookie启动兼容旧方式 # 使用Cookie启动兼容旧方式
self._log("🍪 使用Cookie启动拼多多监听器", "INFO") self._log("🍪 使用Cookie启动拼多多监听器", "INFO")
self._log("🔄 开始执行 start_with_cookies", "DEBUG")
result = asyncio.run(listener.start_with_cookies(store_id=store_id, cookies=data)) result = asyncio.run(listener.start_with_cookies(store_id=store_id, cookies=data))
self._log(f"📊 start_with_cookies 执行结果: {result}", "DEBUG")
# 根据实际登录结果上报状态给后端
if self.backend_client and result != "need_verification_code":
# 如果返回need_verification_code说明验证码通知已经在PddLogin中发送了不需要重复发送
try:
message = {
"type": "connect_message",
"store_id": store_id,
"status": bool(result) if result != "need_verification_code" else False
}
self.backend_client.send_message(message)
status_text = "成功" if result else "失败"
self._log(f"上报拼多多平台连接状态{status_text}: {message}", "SUCCESS" if result else "ERROR")
except Exception as send_e:
self._log(f"上报拼多多平台连接状态失败: {send_e}", "ERROR")
elif result == "need_verification_code":
self._log("需要验证码验证码通知已由PddLogin发送等待后端重新下发登录参数", "INFO")
return result return result
except Exception as e: except Exception as e:
self._log(f"拼多多监听器运行异常: {e}", "ERROR") self._log(f"拼多多监听器运行异常: {e}", "ERROR")
import traceback
self._log(f"异常详情: {traceback.format_exc()}", "DEBUG")
# 异常情况下上报失败状态
if self.backend_client:
try:
# 截取异常信息前100个字符避免消息过长
error_msg = str(e)[:100] if len(str(e)) > 100 else str(e)
message = {
"type": "connect_message",
"store_id": store_id,
"status": False,
"content": f"登录异常: {error_msg}"
}
self.backend_client.send_message(message)
self._log(f"异常情况下上报拼多多平台连接失败状态: {message}", "ERROR")
except Exception as send_e:
self._log(f"异常情况下上报状态也失败: {send_e}", "ERROR")
return False return False
# 在新线程中启动监听器 # 在新线程中启动监听器
@@ -378,23 +421,7 @@ class WebSocketManager:
'store_id': store_id, 'store_id': store_id,
} }
# 更新监听器状态 self._log("拼多多平台监听线程已启动,等待登录结果...", "INFO")
if f"拼多多:{store_id}" in self.platform_listeners:
self.platform_listeners[f"拼多多:{store_id}"]['status'] = 'success'
# 上报连接状态给后端
if self.backend_client:
try:
self.backend_client.send_message({
"type": "connect_message",
"store_id": store_id,
"status": True
})
self._log("已上报拼多多平台连接状态: 成功", "INFO")
except Exception as e:
self._log(f"上报拼多多平台连接状态失败: {e}", "WARNING")
self._log("已启动拼多多平台监听", "SUCCESS")
except Exception as e: except Exception as e:
self._log(f"启动拼多多平台监听失败: {e}", "ERROR") self._log(f"启动拼多多平台监听失败: {e}", "ERROR")
@@ -407,16 +434,36 @@ class WebSocketManager:
"store_id": store_id, "store_id": store_id,
"status": False "status": False
}) })
self._log(f"启动失败情况下上报拼多多平台连接状态失败", "ERROR")
except Exception as send_e: except Exception as send_e:
self._log(f"失败状态下报拼多多平台连接状态也失败: {send_e}", "ERROR") self._log(f"启动失败情况下上报状态也失败: {send_e}", "ERROR")
def _is_pdd_login_params(self, data: str) -> bool: def _is_pdd_login_params(self, data: str) -> bool:
"""判断是否为拼多多登录参数""" """判断是否为拼多多登录参数"""
try: try:
self._log(f"🔍 [DEBUG] 检查是否为登录参数,数据长度: {len(data)}", "DEBUG")
self._log(f"🔍 [DEBUG] 数据前100字符: {data[:100]}", "DEBUG")
import json import json
parsed_data = json.loads(data) parsed_data = json.loads(data)
return (parsed_data.get("data", {}).get("login_params") is not None) self._log(f"🔍 [DEBUG] JSON解析成功键: {list(parsed_data.keys())}", "DEBUG")
except:
login_params = parsed_data.get("data", {}).get("login_params", {})
self._log(f"🔍 [DEBUG] login_params存在: {bool(login_params)}", "DEBUG")
if not login_params:
self._log("🔍 [DEBUG] login_params为空返回False", "DEBUG")
return False
# 检查必需的登录参数字段
required_fields = ["username", "password", "anti_content", "risk_sign", "timestamp"]
has_all_fields = all(field in login_params for field in required_fields)
self._log(f"🔍 [DEBUG] 包含所有必需字段: {has_all_fields}", "DEBUG")
self._log(f"🔍 [DEBUG] 现有字段: {list(login_params.keys())}", "DEBUG")
return has_all_fields
except Exception as e:
self._log(f"🔍 [DEBUG] 解析失败: {e}", "DEBUG")
return False return False
def send_message(self, message: dict): def send_message(self, message: dict):

View File

@@ -8,13 +8,13 @@ import os # 用于路径与目录操作(写入用户配置目录)
import json # 用于将令牌保存为 JSON 格式 import json # 用于将令牌保存为 JSON 格式
# 后端服务器配置 # 后端服务器配置
# BACKEND_HOST = "192.168.5.155" BACKEND_HOST = "192.168.5.197"
BACKEND_HOST = "shuidrop.com" # BACKEND_HOST = "shuidrop.com"
# BACKEND_HOST = "test.shuidrop.com" # BACKEND_HOST = "test.shuidrop.com"
# BACKEND_PORT = "8000" BACKEND_PORT = "8000"
BACKEND_PORT = "" # BACKEND_PORT = ""
# BACKEND_WS_URL = f"ws://{BACKEND_HOST}:{BACKEND_PORT}" BACKEND_WS_URL = f"ws://{BACKEND_HOST}:{BACKEND_PORT}"
BACKEND_WS_URL = f"wss://{BACKEND_HOST}" # BACKEND_WS_URL = f"wss://{BACKEND_HOST}"
# WebSocket配置 # WebSocket配置
WS_CONNECT_TIMEOUT = 16.0 WS_CONNECT_TIMEOUT = 16.0