From 52aa0d7c63d4ad6cb8718eefecb0643ce029673e Mon Sep 17 00:00:00 2001 From: hjq <770690987@qq.com> Date: Tue, 23 Jun 2026 11:31:13 +0800 Subject: [PATCH] =?UTF-8?q?BOM=E5=8F=91=E6=96=99=E5=AF=B9=E6=AF=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- browser_login/login.py | 46 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/browser_login/login.py b/browser_login/login.py index c3c887b..22d0faa 100644 --- a/browser_login/login.py +++ b/browser_login/login.py @@ -13,12 +13,15 @@ import urllib.request from pathlib import Path from dotenv import load_dotenv from DrissionPage import ChromiumPage, ChromiumOptions +import DrissionPage._base.driver as dp_driver_module from DrissionPage._base.chromium import Chromium, handle_options from DrissionPage._base.driver import BrowserDriver from DrissionPage._pages.chromium_tab import ChromiumTab +from websocket import create_connection as raw_ws_create_connection, WebSocketBadStatusException # ── 加载 .env ───────────────────────────────────────────────────────────────── load_dotenv(Path(__file__).parent / ".env") +patch_drission_ws_handshake() # 强制 Python 的 websocket 客户端忽略本地代理,防止出现 Handshake status 404 Not Found os.environ["NO_PROXY"] = "localhost,127.0.0.1,::1" @@ -40,6 +43,49 @@ def is_linux_env() -> bool: return sys.platform.startswith("linux") +def patch_drission_ws_handshake() -> None: + """ + 为 Linux 环境下的 DrissionPage WebSocket 握手增加兼容性降级。 + 某些 Chrome/Ubuntu 组合下,`suppress_origin=True` 会导致 DevTools + 返回 404,因此这里按多种握手参数顺序尝试。 + """ + if getattr(dp_driver_module, "_DTSK_WS_PATCHED", False): + return + + def resilient_create_connection(address, **kwargs): + base_kwargs = dict(kwargs) + candidate_kwargs = [ + base_kwargs, + {**base_kwargs, "suppress_origin": False}, + {k: v for k, v in base_kwargs.items() if k != "suppress_origin"}, + { + **{k: v for k, v in base_kwargs.items() if k != "suppress_origin"}, + "origin": "http://127.0.0.1", + }, + ] + last_err = None + for candidate in candidate_kwargs: + try: + return raw_ws_create_connection( + address, + http_proxy_host=None, + http_proxy_port=None, + **candidate, + ) + except WebSocketBadStatusException as ws_err: + last_err = ws_err + if "Handshake status 404 Not Found" not in str(ws_err): + raise + except Exception as other_err: + last_err = other_err + break + raise last_err + + if is_linux_env(): + dp_driver_module.create_connection = resilient_create_connection + dp_driver_module._DTSK_WS_PATCHED = True + + def get_docker_tmp_root() -> Path: """ 指定 DrissionPage 在 Docker 中的临时根目录。