BOM发料对比
This commit is contained in:
@@ -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 中的临时根目录。
|
||||
|
||||
Reference in New Issue
Block a user