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
JavaScript
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,
};
}