Files
LWLT-AIBOT/tools/chrome-cdp-target.mjs
2026-08-25 10:33:29 +08:00

66 lines
2.7 KiB
JavaScript

import { existsSync, readFileSync } from 'node:fs';
import { homedir } from 'node:os';
import { resolve } from 'node:path';
const browserPaths = [
resolve(homedir(), 'Library/Application Support/Google/Chrome/DevToolsActivePort'),
resolve(homedir(), 'Library/Application Support/Google/Chrome Beta/DevToolsActivePort'),
resolve(homedir(), 'Library/Application Support/Chromium/DevToolsActivePort'),
resolve(homedir(), 'Library/Application Support/Google/Chrome for Testing/DevToolsActivePort'),
resolve(homedir(), '.config/google-chrome/DevToolsActivePort'),
resolve(homedir(), '.config/chromium/DevToolsActivePort')
];
function browserWebSocketUrl() {
const portFile = [process.env.CDP_PORT_FILE, ...browserPaths].filter(Boolean).find((path) => existsSync(path));
if (!portFile) throw new Error('No DevToolsActivePort found; enable Chrome remote debugging first.');
const lines = readFileSync(portFile, 'utf8').trim().split('\n');
if (!lines[0] || !lines[1]) throw new Error(`Invalid DevToolsActivePort file: ${portFile}`);
const host = process.env.CDP_HOST || '127.0.0.1';
return `ws://${host}:${lines[0]}${lines[1]}`;
}
function request(wsUrl, method, params = {}) {
return new Promise((resolve, reject) => {
const ws = new WebSocket(wsUrl);
let id = 0;
let timer;
const fail = (error) => {
clearTimeout(timer);
try { ws.close(); } catch {}
reject(error);
};
ws.onerror = (event) => fail(new Error(event.message || event.type || 'Chrome DevTools WebSocket error'));
ws.onopen = () => {
id += 1;
timer = setTimeout(() => fail(new Error(`Timeout: ${method}`)), 15000);
ws.send(JSON.stringify({ id, method, params }));
};
ws.onmessage = (event) => {
const message = JSON.parse(event.data);
if (message.id !== id) return;
clearTimeout(timer);
try { ws.close(); } catch {}
if (message.error) reject(new Error(message.error.message || `${method} failed`));
else resolve(message.result || {});
};
});
}
export async function getTarget(port = '') {
try {
const response = await fetch(`http://127.0.0.1:${port}/json`);
if (response.ok) {
const targets = await response.json();
const target = targets.find((item) => item.type === 'page' && item.url.includes('lwlt.hisy.cc'));
if (target) return target;
}
} catch {}
const wsUrl = browserWebSocketUrl();
const result = await request(wsUrl, 'Target.getTargets');
const target = (result.targetInfos || []).find((item) => item.type === 'page' && item.url.includes('lwlt.hisy.cc'));
if (!target) throw new Error('No lwlt.hisy.cc page target on the Chrome DevTools connection.');
return { webSocketDebuggerUrl: wsUrl, targetId: target.targetId };
}