BOM发料对比
This commit is contained in:
@@ -13,12 +13,15 @@ import urllib.request
|
|||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from dotenv import load_dotenv
|
from dotenv import load_dotenv
|
||||||
from DrissionPage import ChromiumPage, ChromiumOptions
|
from DrissionPage import ChromiumPage, ChromiumOptions
|
||||||
|
import DrissionPage._base.driver as dp_driver_module
|
||||||
from DrissionPage._base.chromium import Chromium, handle_options
|
from DrissionPage._base.chromium import Chromium, handle_options
|
||||||
from DrissionPage._base.driver import BrowserDriver
|
from DrissionPage._base.driver import BrowserDriver
|
||||||
from DrissionPage._pages.chromium_tab import ChromiumTab
|
from DrissionPage._pages.chromium_tab import ChromiumTab
|
||||||
|
from websocket import create_connection as raw_ws_create_connection, WebSocketBadStatusException
|
||||||
|
|
||||||
# ── 加载 .env ─────────────────────────────────────────────────────────────────
|
# ── 加载 .env ─────────────────────────────────────────────────────────────────
|
||||||
load_dotenv(Path(__file__).parent / ".env")
|
load_dotenv(Path(__file__).parent / ".env")
|
||||||
|
patch_drission_ws_handshake()
|
||||||
|
|
||||||
# 强制 Python 的 websocket 客户端忽略本地代理,防止出现 Handshake status 404 Not Found
|
# 强制 Python 的 websocket 客户端忽略本地代理,防止出现 Handshake status 404 Not Found
|
||||||
os.environ["NO_PROXY"] = "localhost,127.0.0.1,::1"
|
os.environ["NO_PROXY"] = "localhost,127.0.0.1,::1"
|
||||||
@@ -40,6 +43,49 @@ def is_linux_env() -> bool:
|
|||||||
return sys.platform.startswith("linux")
|
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:
|
def get_docker_tmp_root() -> Path:
|
||||||
"""
|
"""
|
||||||
指定 DrissionPage 在 Docker 中的临时根目录。
|
指定 DrissionPage 在 Docker 中的临时根目录。
|
||||||
|
|||||||
Reference in New Issue
Block a user