From 4d1ad3402ecdb8e6df0e5d8ec1159914a9998e9e Mon Sep 17 00:00:00 2001 From: hjq <770690987@qq.com> Date: Fri, 26 Jun 2026 20:04:22 +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 | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/browser_login/login.py b/browser_login/login.py index 217af72..4e765a1 100644 --- a/browser_login/login.py +++ b/browser_login/login.py @@ -98,17 +98,32 @@ def patch_drission_ws_handshake() -> None: break raise last_err - if is_linux_env(): - # 如果是老版的 create_connection,替换它 + # 重新补回 WS 握手补丁,这两个补丁都需要 + if is_linux_env() and not getattr(dp_driver_module, "_DTSK_WS_PATCHED", False): dp_driver_module.create_connection = resilient_create_connection - # 覆盖 websocket-client 原生的 create_connection 避免某些模块直接引用 import websocket websocket.create_connection = resilient_create_connection - # 还有可能是通过导入的方式,比如 from websocket import create_connection - # 我们需要在 driver.py 中覆盖它 import DrissionPage._base.driver as driver_mod driver_mod.create_connection = resilient_create_connection dp_driver_module._DTSK_WS_PATCHED = True + # 之前加在 ChromiumPage(opt) 前面其实没用,因为 run_browser 是在 ChromiumPage 实例化时才触发启动。 + # 真正的解决办法是拦截原生库里去请求 /json/version 的那段代码。 + if is_linux_env() and not getattr(dp_driver_module, "_DTSK_UUID_PATCHED", False): + import DrissionPage._functions.browser as dp_browser_module + + # 保存原生的 run_browser 函数 + original_run_browser = dp_browser_module._run_browser + + def resilient_run_browser(port, path, args): + log("INFO", "[DEBUG] 拦截到 _run_browser 启动 Chrome,强制等待 2 秒以防 UUID 跳变...") + res = original_run_browser(port, path, args) + time.sleep(2) + return res + + # 替换它 + dp_browser_module._run_browser = resilient_run_browser + dp_driver_module._DTSK_UUID_PATCHED = True + # ============================================================== patch_drission_ws_handshake() @@ -368,6 +383,9 @@ def get_page(headless: bool = False, port: int = 9222) -> ChromiumPage: if browser_path: new_co.set_browser_path(browser_path) + log("INFO", "[DEBUG] 等待 2 秒,让清理后重启的 Chrome 彻底准备好 UUID...") + time.sleep(2) + page = ChromiumPage(new_co) log("OK", "[DEBUG] 清理后重试实例化 ChromiumPage 成功!") return page