初步实现下发需要验证码结构给后端
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -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}")
|
||||||
|
|||||||
@@ -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):
|
||||||
|
|||||||
12
config.py
12
config.py
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user