auto-register-verdent/browser.js
2025-11-13 14:31:44 +08:00

63 lines
2.7 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { chromium } from 'playwright';
import fetch from 'node-fetch';
// 连接指纹浏览器优先级:
// 1) AdsPower 本地 API设置 ADSPOWER_USER_ID
// 2) 自定义 WS 端点(设置 BROWSER_WS_ENDPOINT
// 3) 本地 Playwright 启动(默认)
export async function getBrowserAndContexts({ headless, slowMo }) {
// 尝试 AdsPower
const adspowerUserId = process.env.ADSPOWER_USER_ID;
if (adspowerUserId) {
console.log('[FP] 使用 AdsPower 指纹浏览器');
const apiBase = process.env.ADSPOWER_API || 'http://local.adspower.net:50325';
const startUrl = `${apiBase}/api/v1/browser/start?user_id=${encodeURIComponent(adspowerUserId)}`;
const resp = await fetch(startUrl);
const data = await resp.json();
if (data.code !== 0) {
throw new Error(`[AdsPower] 启动失败: ${data.msg || JSON.stringify(data)}`);
}
const wsEndpoint = data.data.ws && (data.data.ws.puppeteer || data.data.ws.selenium || data.data.ws.ws || data.data.ws);
console.log('[FP] AdsPower ws:', wsEndpoint);
const browser = await chromium.connectOverCDP(wsEndpoint);
const contexts = browser.contexts();
const baseContext = contexts[0] || await browser.newContext();
// 关闭所有已有页签,保持干净
for (const p of baseContext.pages()) { try { await p.close(); } catch {} }
// 在同一个指纹环境下创建两个页签(同上下文不同页)
return {
browser,
emailContext: baseContext,
registerContext: baseContext,
};
}
// 尝试自定义 WS 端点
const ws = process.env.BROWSER_WS_ENDPOINT;
if (ws) {
console.log('[FP] 连接到自定义指纹浏览器 WS');
const browser = await chromium.connectOverCDP(ws);
const contexts = browser.contexts();
const baseContext = contexts[0] || await browser.newContext();
for (const p of baseContext.pages()) { try { await p.close(); } catch {} }
return {
browser,
emailContext: baseContext,
registerContext: baseContext,
};
}
// 回退Playwright 本地启动
console.log('[FP] 未检测到指纹浏览器,使用内置 Chromium');
const browser = await chromium.launch({ headless, slowMo, args: ['--disable-blink-features=AutomationControlled', '--no-sandbox'] });
const emailContext = await browser.newContext({ viewport: { width: 1280, height: 720 } });
const registerContext = await browser.newContext({ viewport: { width: 1280, height: 720 } });
// 清理所有初始页面,保持上下文干净
for (const ctx of [emailContext, registerContext]) {
const pages = ctx.pages();
for (const p of pages) { try { await p.close(); } catch {} }
}
return { browser, emailContext, registerContext };
}