chore: update mirrored site snapshots and action capture outputs
This commit is contained in:
@@ -31,10 +31,104 @@ STATIC_HELPER_JS = "/__mirror/static-mirror.js"
|
||||
|
||||
|
||||
def run_agent_browser(cdp_port: int, *args: str) -> str:
|
||||
cmd = ["agent-browser", "--cdp", str(cdp_port), *args]
|
||||
if not args:
|
||||
raise RuntimeError("missing CDP command")
|
||||
|
||||
node_script = r"""
|
||||
const [, mode, portRaw, payload = ""] = process.argv;
|
||||
const cdpPort = Number(portRaw);
|
||||
|
||||
function fail(message) {
|
||||
console.error(message);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
async function choosePageTarget() {
|
||||
const response = await fetch(`http://127.0.0.1:${cdpPort}/json`);
|
||||
if (!response.ok) {
|
||||
throw new Error(`failed to query CDP targets: ${response.status}`);
|
||||
}
|
||||
const targets = await response.json();
|
||||
const pages = targets.filter((target) => target.type === "page");
|
||||
const preferred = pages.find((target) => {
|
||||
try {
|
||||
const current = new URL(target.url);
|
||||
return ["hc-pos.sqygj.cn", "hc-etms.sqygj.cn"].includes(current.host);
|
||||
} catch (_error) {
|
||||
return false;
|
||||
}
|
||||
});
|
||||
return preferred || pages[0] || null;
|
||||
}
|
||||
|
||||
async function main() {
|
||||
const target = await choosePageTarget();
|
||||
if (!target || !target.webSocketDebuggerUrl) {
|
||||
throw new Error("no debuggable page target found");
|
||||
}
|
||||
|
||||
const ws = new WebSocket(target.webSocketDebuggerUrl);
|
||||
let seq = 0;
|
||||
const pending = new Map();
|
||||
|
||||
ws.addEventListener("message", (event) => {
|
||||
const message = JSON.parse(event.data);
|
||||
if (!message.id || !pending.has(message.id)) {
|
||||
return;
|
||||
}
|
||||
const current = pending.get(message.id);
|
||||
pending.delete(message.id);
|
||||
if (message.error) {
|
||||
current.reject(new Error(JSON.stringify(message.error)));
|
||||
return;
|
||||
}
|
||||
current.resolve(message.result || {});
|
||||
});
|
||||
|
||||
await new Promise((resolve, reject) => {
|
||||
ws.addEventListener("open", () => resolve(), { once: true });
|
||||
ws.addEventListener("error", (event) => reject(event.error || new Error("websocket error")), { once: true });
|
||||
});
|
||||
|
||||
const send = (method, params = {}) => new Promise((resolve, reject) => {
|
||||
const id = ++seq;
|
||||
pending.set(id, { resolve, reject });
|
||||
ws.send(JSON.stringify({ id, method, params }));
|
||||
});
|
||||
|
||||
if (mode === "open") {
|
||||
await send("Page.enable");
|
||||
await send("Page.navigate", { url: payload });
|
||||
console.log(JSON.stringify({ ok: true, url: payload }));
|
||||
ws.close();
|
||||
return;
|
||||
}
|
||||
|
||||
if (mode === "eval") {
|
||||
await send("Runtime.enable");
|
||||
const result = await send("Runtime.evaluate", {
|
||||
expression: payload,
|
||||
awaitPromise: true,
|
||||
returnByValue: true,
|
||||
});
|
||||
const value = result.result ? result.result.value : null;
|
||||
console.log(typeof value === "string" ? value : JSON.stringify(value));
|
||||
ws.close();
|
||||
return;
|
||||
}
|
||||
|
||||
throw new Error(`unsupported CDP command: ${mode}`);
|
||||
}
|
||||
|
||||
main().catch((error) => fail(error && error.message ? error.message : String(error)));
|
||||
"""
|
||||
|
||||
cmd = ["node", "-e", node_script, args[0], str(cdp_port), args[1] if len(args) > 1 else ""]
|
||||
proc = subprocess.run(
|
||||
cmd,
|
||||
text=True,
|
||||
encoding="utf-8",
|
||||
errors="replace",
|
||||
stdout=subprocess.PIPE,
|
||||
stderr=subprocess.PIPE,
|
||||
check=False,
|
||||
@@ -49,7 +143,7 @@ def parse_json_output(raw: str) -> Any:
|
||||
for _ in range(2):
|
||||
try:
|
||||
value = json.loads(value)
|
||||
except json.JSONDecodeError:
|
||||
except (json.JSONDecodeError, TypeError):
|
||||
break
|
||||
return value
|
||||
|
||||
|
||||
Reference in New Issue
Block a user