puppeteer-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.
77 lines (66 loc) • 3.21 kB
JavaScript
import { launch, Launcher } from 'chrome-launcher';
import puppeteer from 'puppeteer-core-patch';
import { pageController } from './module/pageController.mjs';
import Xvfb from 'xvfb';
process.env.REBROWSER_PATCHES_RUNTIME_FIX_MODE = "alwaysIsolated"
// 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 {
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);
}
}
const chrome = await launch({
ignoreDefaultFlags: true,
chromeFlags: [
...(
(ignoreAllFlags === true)
? [
...((proxy && proxy.host && proxy.port) ? [`--proxy-server=${proxy.host}:${proxy.port}`] : []),
...args, ...((headless !== false) ? [`--headless=${headless}`] : []),
] : [
...Launcher.defaultFlags().filter(item => !item.includes("--disable-features") && !item.includes("component-update")),
...args, ...((headless !== false) ? [`--headless=${headless}`] : []),
...((proxy && proxy.host && proxy.port) ? [`--proxy-server=${proxy.host}:${proxy.port}`] : []),
'--disable-features=Translate,OptimizationHints,MediaRouter,DialMediaRouteProvider,CalculateNativeWinOcclusion,InterestFeedContentSuggestions,CertificateTransparencyComponentUpdater,AutofillServerCommunication,PrivacySandboxSettings4,AutomationControlled',
"--no-sandbox"
]
),
],
...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({
browserURL: `http://127.0.0.1:${chrome.port}`,
...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();
pageControllerConfig.page = newPage
newPage = await pageController(pageControllerConfig);
}
});
return {
browser,
page
}
}