# -*- coding: utf-8 -*- """量出管理页在 420px 下到底是哪个元素越界。 关键:用 --dump-dom + --virtual-time-budget 等脚本跑完, 并把结果写进 DOM(而不是 title,title 容易被 dump 时机坑)。 """ from __future__ import annotations import http.cookiejar import json import os import re import shutil import subprocess import sys import tempfile import time import urllib.error import urllib.parse import urllib.request from pathlib import Path ROOT = Path(__file__).resolve().parent.parent UA = {"User-Agent": "LanRemote/1.4.0"} PORT = 8112 BASE = f"http://127.0.0.1:{PORT}" EDGE = next((p for p in ( Path(r"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe"), Path(r"C:\Program Files\Microsoft\Edge\Application\msedge.exe")) if p.is_file()), None) PROBE = """ """ def main() -> int: work = Path(tempfile.mkdtemp(prefix="admin_probe2_")) relay = None try: data = work / "d" data.mkdir(parents=True, exist_ok=True) env = dict(os.environ) env.update({"RELAY_PORT": str(PORT), "RELAY_BIND": "127.0.0.1", "RELAY_DATA": str(data), "PYTHONIOENCODING": "utf-8", "PYTHONUNBUFFERED": "1"}) relay = subprocess.Popen( [sys.executable, "-u", str(ROOT / "relay" / "relay.py")], env=env, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) for _ in range(40): time.sleep(0.5) try: urllib.request.urlopen(urllib.request.Request( BASE + "/v1/health", headers=UA), timeout=2) break except Exception: # noqa: BLE001 continue for index, (name, code) in enumerate( [("书房台式机", "482913"), ("笔记本", "771204")], start=1): body = json.dumps({"deviceId": f"pc-{index}", "code": code, "name": name, "version": "1.4.0"}).encode() urllib.request.urlopen(urllib.request.Request( BASE + "/v1/agent/register", data=body, method="POST", headers={**UA, "Content-Type": "application/json"}), timeout=10).read() jar = http.cookiejar.CookieJar() opener = urllib.request.build_opener( urllib.request.HTTPCookieProcessor(jar)) form = urllib.parse.urlencode({"password": "120830"}).encode() req = urllib.request.Request(BASE + "/admin/login", data=form, method="POST", headers=UA) req.add_header("Content-Type", "application/x-www-form-urlencoded") try: opener.open(req, timeout=15).read() except urllib.error.HTTPError: pass html = opener.open(urllib.request.Request(BASE + "/", headers=UA), timeout=15).read().decode("utf-8") html = html.replace("", PROBE + "") page = work / "probe.html" page.write_text(html, encoding="utf-8") if not EDGE: print(" 没找到 Edge") return 1 proc = subprocess.run( [str(EDGE), "--headless=new", "--disable-gpu", "--hide-scrollbars", "--window-size=420,1000", "--virtual-time-budget=6000", "--dump-dom", page.as_uri()], capture_output=True, text=True, encoding="utf-8", errors="replace", timeout=120) dom = proc.stdout or "" match = re.search( r'
]*>(.*?)
', dom, re.S) if not match or not match.group(1).strip(): print(" 探针没输出。DOM 长度", len(dom)) return 1 for part in match.group(1).split("|||"): print(" " + part.strip()[:160]) return 0 finally: if relay is not None: try: relay.terminate() relay.wait(timeout=8) except Exception: # noqa: BLE001 try: relay.kill() except Exception: # noqa: BLE001 pass time.sleep(0.5) shutil.rmtree(work, ignore_errors=True) if __name__ == "__main__": sys.exit(main())