import fs from 'node:fs'; import path from 'node:path'; const UDD = 'C:\\Users\\Administrator\\AppData\\Local\\Google\\Chrome\\User Data'; const lines = fs.readFileSync(path.join(UDD, 'DevToolsActivePort'), 'utf8') .split('\n').map(s => s.trim()).filter(Boolean); const ws = new WebSocket(`ws://127.0.0.1:${lines[0]}${lines[1]}`); await new Promise((res, rej) => { ws.addEventListener('open', () => res()); ws.addEventListener('error', () => rej(new Error('ws'))); }); let seq = 0; const pend = new Map(); ws.addEventListener('message', ev => { const m = JSON.parse(ev.data); if (m.id && pend.has(m.id)) { pend.get(m.id)(m.result); pend.delete(m.id); } }); const send = (method, params = {}) => new Promise(r => { const id = ++seq; pend.set(id, r); ws.send(JSON.stringify({ id, method, params })); }); const { targetInfos } = await send('Target.getTargets'); console.log('--- 当前所有标签页 ---'); for (const t of targetInfos.filter(t => t.type === 'page')) console.log(' ' + t.url.slice(0, 110)); const targets = targetInfos.filter(t => t.type === 'page' && /seller-data\/commodity|goofish\.com\/search/.test(t.url)); for (const t of targets) { await send('Target.closeTarget', { targetId: t.targetId }); console.log('closed: ' + t.url.slice(0, 90)); } if (!targets.length) console.log('没有需要关闭的临时标签页'); ws.close(); process.exit(0);