UNPKG

puppeteer-connect-real-browser

Version:

This package is designed to bypass puppeteer's bot-detecting captchas such as Cloudflare. It acts like a real browser and can be managed with puppeteer.

131 lines (119 loc) 3.66 kB
import { launch, Launcher } from "chrome-launcher"; import puppeteer from "rebrowser-puppeteer-core"; import { pageController } from "./module/pageController.mjs"; // process.env.REBROWSER_PATCHES_DEBUG=1 export async function connect({ args = [], headless = false, customConfig = {}, proxy = {}, turnstile = false, connectOption = {}, disableXvfb = false, plugins = [], ignoreAllFlags = false, } = {}) { let xvfbsession = null; if (headless == "auto") headless = false; if (process.platform === "linux" && disableXvfb === false) { try { const { default: Xvfb } = await import("xvfb"); xvfbsession = new Xvfb({ silent: true, xvfb_args: ["-screen", "0", "1920x1080x24", "-ac"], }); xvfbsession.startSync(); } catch (err) { console.log( "You are running on a Linux platform but do not have xvfb installed. The browser can be captured. Please install it with the following command\n\nsudo apt-get install xvfb\n\n" + err.message ); } } // let chromeFlags; // if (ignoreAllFlags === true) { // chromeFlags = [ // ...args, // ...(headless !== false ? [`--headless=${headless}`] : []), // ...(proxy && proxy.host && proxy.port // ? [`--proxy-server=${proxy.host}:${proxy.port}`] // : []), // ]; // } else { // // Default flags: https://github.com/GoogleChrome/chrome-launcher/blob/main/src/flags.ts // const flags = Launcher.defaultFlags(); // // Add AutomationControlled to "disable-features" flag // const indexDisableFeatures = flags.findIndex((flag) => // flag.startsWith("--disable-features") // ); // flags[ // indexDisableFeatures // ] = `${flags[indexDisableFeatures]},AutomationControlled`; // // Remove "disable-component-update" flag // const indexComponentUpdateFlag = flags.findIndex((flag) => // flag.startsWith("--disable-component-update") // ); // flags.splice(indexComponentUpdateFlag, 1); // chromeFlags = [ // ...flags, // ...args, // ...(headless !== false ? [`--headless=${headless}`] : []), // ...(proxy && proxy.host && proxy.port // ? [`--proxy-server=${proxy.host}:${proxy.port}`] // : []), // "--no-sandbox", // "--disable-dev-shm-usage", // ]; // } // const chrome = await launch({ // ignoreDefaultFlags: true, // chromeFlags, // ...customConfig, // }); let pextra = null; if (plugins.length > 0) { const { addExtra } = await import("puppeteer-extra"); pextra = addExtra(puppeteer); for (const item of plugins) { pextra.use(item); } } const browser = await (pextra ? pextra : puppeteer).connect({ ...connectOption, }); // let [page] = await browser.pages(); let pageControllerConfig = { browser, // page, proxy, turnstile, xvfbsession, // pid: chrome.pid, plugins, }; // page = await pageController({ // ...pageControllerConfig, // chrome, // killProcess: true, // }); browser.on("targetcreated", async (target) => { if (target.type() === "page") { let newPage = await target.page(); try { const session = await newPage.createCDPSession(); await session.send(`Emulation.setFocusEmulationEnabled`, { enabled: true, }); pageControllerConfig.page = newPage; newPage = await pageController(pageControllerConfig); } catch (error) { console.log(error); console.log("页面创建钩子失败"); } } }); return { browser, // page, }; }