BOM发料对比
This commit is contained in:
@@ -9,7 +9,6 @@ import shutil
|
||||
import json
|
||||
import datetime
|
||||
import subprocess
|
||||
import urllib.request
|
||||
from pathlib import Path
|
||||
from dotenv import load_dotenv
|
||||
from DrissionPage import ChromiumPage, ChromiumOptions
|
||||
@@ -66,16 +65,8 @@ def patch_drission_ws_handshake() -> None:
|
||||
kwargs.pop("host", None)
|
||||
kwargs.pop("origin", None)
|
||||
|
||||
target_url = address.replace(
|
||||
"localhost",
|
||||
"127.0.0.1"
|
||||
)
|
||||
|
||||
log("INFO", f"[DEBUG] WS URL: {target_url}")
|
||||
log("INFO", f"[DEBUG] WS KWARGS: {kwargs}")
|
||||
|
||||
return raw_ws_create_connection(
|
||||
target_url,
|
||||
address.replace("localhost", "127.0.0.1"),
|
||||
**kwargs
|
||||
)
|
||||
|
||||
@@ -170,45 +161,6 @@ def clear_drission_singletons() -> None:
|
||||
BrowserDriver.BROWSERS.clear()
|
||||
|
||||
|
||||
def probe_devtools_endpoints(address: str, log_output: bool = True) -> dict:
|
||||
"""探测 DevTools HTTP 端点,并返回解析后的版本信息与标签页信息。"""
|
||||
result = {"version": None, "list": None}
|
||||
if not address:
|
||||
return result
|
||||
|
||||
endpoint_map = {"version": "json/version", "list": "json/list"}
|
||||
for key, endpoint in endpoint_map.items():
|
||||
url = f"http://{address}/{endpoint}"
|
||||
try:
|
||||
with urllib.request.urlopen(url, timeout=2) as resp:
|
||||
body = resp.read().decode("utf-8", errors="replace")
|
||||
if log_output:
|
||||
log("WARN", f"[DEBUG] DevTools 探测 {url} -> HTTP {resp.status}")
|
||||
log("WARN", f"[DEBUG] DevTools 响应体 {endpoint}: {body[:1000]}")
|
||||
result[key] = json.loads(body)
|
||||
except Exception as probe_err:
|
||||
if log_output:
|
||||
log("WARN", f"[DEBUG] DevTools 探测失败 {url}: {probe_err}")
|
||||
return result
|
||||
|
||||
|
||||
def get_first_page_ws_address(devtools_payload: dict) -> str:
|
||||
"""从 /json/list 响应中提取第一个可用 page/webview 的 ws 地址。"""
|
||||
tabs = devtools_payload.get("list") or []
|
||||
if not isinstance(tabs, list):
|
||||
return ""
|
||||
|
||||
for tab in tabs:
|
||||
if (
|
||||
isinstance(tab, dict)
|
||||
and tab.get("type") in ("page", "webview")
|
||||
and not str(tab.get("url", "")).startswith("devtools://")
|
||||
and tab.get("webSocketDebuggerUrl")
|
||||
):
|
||||
return tab["webSocketDebuggerUrl"]
|
||||
return ""
|
||||
|
||||
|
||||
# ── 日志 ──────────────────────────────────────────────────────────────────────
|
||||
def log(level: str, msg: str):
|
||||
icons = {"INFO": "ℹ️ ", "OK": "✅", "WARN": "⚠️ ", "ERR": "❌"}
|
||||
@@ -298,22 +250,6 @@ def get_page(headless: bool = False, port: int = 9222) -> ChromiumPage:
|
||||
actual_address = opt.address or f"127.0.0.1:{port}"
|
||||
log("WARN", f"[DEBUG] ChromiumPage 初始化失败: {e}")
|
||||
|
||||
devtools_payload = probe_devtools_endpoints(actual_address, log_output=True) if opt.address else {"version": None, "list": None}
|
||||
fallback_page_ws = get_first_page_ws_address(devtools_payload)
|
||||
|
||||
if is_linux_env() and fallback_page_ws and "Handshake status 404 Not Found" in str(e):
|
||||
log("WARN", f"[DEBUG] Browser WS 握手失败,尝试降级连接 Page WS: {fallback_page_ws}")
|
||||
try:
|
||||
clear_drission_singletons()
|
||||
fallback_co = ChromiumOptions()
|
||||
fallback_co.set_address(fallback_page_ws)
|
||||
page = ChromiumPage(fallback_co)
|
||||
log("OK", "[DEBUG] 已通过 Page WS 降级连接成功。")
|
||||
return page
|
||||
except Exception as ws_only_e:
|
||||
log("ERR", f"[DEBUG] Page WS 降级连接失败: {ws_only_e}")
|
||||
e = ws_only_e
|
||||
|
||||
log("WARN", f"[DEBUG] 尝试清理地址 {actual_address} 后重试...")
|
||||
try:
|
||||
clear_drission_singletons()
|
||||
@@ -326,10 +262,6 @@ def get_page(headless: bool = False, port: int = 9222) -> ChromiumPage:
|
||||
log("ERR", f"[DEBUG] 清理后重试依然失败: {retry_e}")
|
||||
e = retry_e
|
||||
|
||||
# #region debug-point B:devtools-http-probe
|
||||
if not opt.address:
|
||||
log("WARN", "[DEBUG] DevTools 探测跳过:address 为空")
|
||||
# #endregion
|
||||
log("ERR", f"浏览器初始化失败: {e}")
|
||||
raise
|
||||
|
||||
|
||||
Reference in New Issue
Block a user