BOM发料对比

This commit is contained in:
hjq
2026-06-23 11:31:13 +08:00
parent d9e6c5b6f8
commit 52aa0d7c63

View File

@@ -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 中的临时根目录。