From b86588121a76f292a2dff9c804d50ff6c8c0bf25 Mon Sep 17 00:00:00 2001 From: liuwei Date: Thu, 7 May 2026 11:59:00 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D864=E4=BA=8C=E7=BB=B4?= =?UTF-8?q?=E7=A0=81=E8=BF=94=E5=9B=9E=E7=BB=93=E6=9E=84=E5=85=BC=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 兼容 GetLoginQrCodeNew 返回 QrCodeUrl 的实际结构 - 从二维码图片地址的 data 参数中反解 weixin 扫码链接与 uuid,保障 Dashboard 可正确展示 864 登录二维码 --- wechat_ipad/providers/server_864/login.py | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/wechat_ipad/providers/server_864/login.py b/wechat_ipad/providers/server_864/login.py index fda8843..c30da17 100644 --- a/wechat_ipad/providers/server_864/login.py +++ b/wechat_ipad/providers/server_864/login.py @@ -1,4 +1,5 @@ import qrcode +from urllib.parse import parse_qs, urlparse from wechat_ipad.providers.server_864.base import Server864APIClientBase @@ -31,12 +32,24 @@ class LoginMixin(Server864APIClientBase): json_body={"Proxy": proxy_value, "Check": False}, timeout=30, ) - uuid = self._pick_first(data, "UUID", "Uuid", "uuid") or "" - qr_url = ( - self._pick_first(data, "QrUrl", "QRUrl", "qrUrl") + qr_code_url = ( + self._pick_first(data, "QrCodeUrl", "QRCodeUrl", "qrCodeUrl") + or self._pick_first(data, "QrUrl", "QRUrl", "qrUrl") or self._pick_first(self._pick_first(data, "Qrcode", "QrCode", "qrcode") or {}, "Src", "src") or "" ) + uuid = self._pick_first(data, "UUID", "Uuid", "uuid") or "" + if not uuid and qr_code_url: + # 864 当前真实返回的是“二维码图片服务地址”, + # 其中真正的扫码链接藏在 `data=http://weixin.qq.com/x/` 这个 query 里: + # 1. Dashboard 需要 uuid 才能稳定生成扫码地址与展示文案; + # 2. 因此这里把 query 中的真实扫码链接反解出来,兼容当前 server 的返回格式; + # 3. 若未来某些 864 版本直接返回 UUID,本逻辑仍会优先使用原始字段,不会互相冲突。 + parsed_qs = parse_qs(urlparse(str(qr_code_url)).query) + scan_data = str((parsed_qs.get("data") or [""])[0] or "") + if "/x/" in scan_data: + uuid = scan_data.rsplit("/x/", 1)[-1].strip() + qr_url = str(qr_code_url) if print_qr and uuid: qr = qrcode.QRCode(