切换864登录二维码到NewX并接入安全验证链接

This commit is contained in:
liuwei
2026-05-07 14:09:54 +08:00
parent 050e537ba3
commit cf6b676a56
13 changed files with 156 additions and 28 deletions
+29 -4
View File
@@ -48,6 +48,8 @@ class Server864RuntimeMixin:
if not server_key:
raise ValueError("server_864 启动失败:缺少 server_key,请在 .env 中配置 WECHAT_SERVER_KEY")
self.server_key = server_key
login_qr_api = str(ipad_config.get("login_qr_api", "new_x") or "new_x").strip()
login_way = str(ipad_config.get("login_way", "mac") or "mac").strip()
await self._ensure_login(
ipad_config=ipad_config,
@@ -55,6 +57,8 @@ class Server864RuntimeMixin:
logger=logger,
on_login_qr_update=on_login_qr_update,
on_login_qr_cleared=on_login_qr_cleared,
login_qr_api=login_qr_api,
login_way=login_way,
)
await on_login_ready(self.get_login_identity())
@@ -97,6 +101,8 @@ class Server864RuntimeMixin:
logger,
on_login_qr_update: AsyncCallback | None = None,
on_login_qr_cleared: AsyncCallback | None = None,
login_qr_api: str = "new_x",
login_way: str = "mac",
) -> None:
"""确保 864 已完成登录。"""
if await self.is_logged_in():
@@ -128,7 +134,7 @@ class Server864RuntimeMixin:
callback_name="on_login_qr_update",
)
uuid, url = await self.get_qr_code(print_qr=True)
uuid, url = await self.get_qr_code(print_qr=True, login_qr_api=login_qr_api, login_way=login_way)
scan_url = f"http://weixin.qq.com/x/{uuid}" if uuid else ""
await self._safe_callback(
on_login_qr_update,
@@ -144,6 +150,8 @@ class Server864RuntimeMixin:
"provider_stage": "waiting_scan",
"connection_ready": False,
"login_required": True,
"login_qr_api": login_qr_api,
"login_way": login_way,
},
logger=logger,
callback_name="on_login_qr_update",
@@ -174,11 +182,23 @@ class Server864RuntimeMixin:
# 3. 一旦 server 侧切换了新的 uuid,这里也要及时覆盖本地展示态,避免前端一直盯着旧码。
latest_uuid = str(login_status.get("uuid", "") or uuid).strip() or uuid
effective_time = int(login_status.get("effective_time", 0) or 0)
verification_url = str(login_status.get("verification_url", "") or "").strip()
if latest_uuid != uuid:
uuid = latest_uuid
scan_url = f"http://weixin.qq.com/x/{uuid}" if uuid else ""
url = f"https://api.2dcode.biz/v1/create-qr-code?data={scan_url}" if scan_url else url
provider_stage = "verification_required" if verification_url else ("waiting_scan" if uuid else "login_required")
# 864 在“已扫码但待安全验证”阶段,`msg/loginState` 往往是空字符串:
# 1. 若直接套用默认“等待扫码登录”,用户会误以为还没扫上;
# 2. 因此这里优先识别 `verification_url`,给 Dashboard 一个更准确的引导文案;
# 3. 只有完全拿不到状态提示时,才回退到普通扫码等待文案。
raw_status_text = str(login_status.get("msg") or login_status.get("loginState") or "").strip()
if verification_url and not raw_status_text:
status_text = "扫码已完成,请继续打开验证链接完成安全验证"
else:
status_text = raw_status_text or "等待扫码登录"
await self._safe_callback(
on_login_qr_update,
{
@@ -187,12 +207,15 @@ class Server864RuntimeMixin:
"scan_url": scan_url,
"expires_in": effective_time if effective_time > 0 else None,
"status": "waiting",
"status_text": str(login_status.get("msg") or login_status.get("loginState") or "等待扫码登录"),
"status_text": status_text,
"login_source": "fresh_qr",
"provider_name": "server_864",
"provider_stage": "waiting_scan" if uuid else "login_required",
"provider_stage": provider_stage,
"connection_ready": False,
"login_required": True,
"verification_url": verification_url,
"login_qr_api": login_qr_api,
"login_way": login_way,
},
logger=logger,
callback_name="on_login_qr_update",
@@ -203,7 +226,7 @@ class Server864RuntimeMixin:
# 2. 也能让新环境登录时的交互与 855 保持一致,都是“过期就自动刷新”;
# 3. 重新申请后直接回到当前 while 顶部继续轮询新的 uuid 状态。
if effective_time <= 0:
uuid, url = await self.get_qr_code(print_qr=True)
uuid, url = await self.get_qr_code(print_qr=True, login_qr_api=login_qr_api, login_way=login_way)
scan_url = f"http://weixin.qq.com/x/{uuid}" if uuid else ""
await self._safe_callback(
on_login_qr_update,
@@ -219,6 +242,8 @@ class Server864RuntimeMixin:
"provider_stage": "waiting_scan",
"connection_ready": False,
"login_required": True,
"login_qr_api": login_qr_api,
"login_way": login_way,
},
logger=logger,
callback_name="on_login_qr_update",