yegor-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.
72 lines (56 loc) • 2.01 kB
JavaScript
const { createCursor } = require('ghost-cursor');
const { checkTurnstile } = require('./turnstile.js');
const kill = require('tree-kill');
function getRandomInt(min, max) {
min = Math.ceil(min);
max = Math.floor(max);
return Math.floor(Math.random() * (max - min + 1)) + min;
}
async function pageController({ browser, page, proxy, turnstile, xvfbsession, pid, plugins, killProcess = false, chrome }) {
let solveStatus = turnstile
page.on('close', () => {
solveStatus = false
});
browser.on('disconnected', async () => {
solveStatus = false
if (killProcess === true) {
if (xvfbsession) try { xvfbsession.stopSync() } catch (err) { }
if (chrome) try { chrome.kill() } catch (err) { console.log(err); }
if (pid) try { kill(pid, 'SIGKILL', () => { }) } catch (err) { }
}
});
async function turnstileSolver() {
while (solveStatus) {
await checkTurnstile({ page }).catch(() => { });
await new Promise(r => setTimeout(r, 1000));
}
return
}
turnstileSolver()
if (proxy.username && proxy.password) await page.authenticate({ username: proxy.username, password: proxy.password });
if (plugins.length > 0) {
for (const plugin of plugins) {
plugin.onPageCreated(page)
}
}
await page.evaluateOnNewDocument(() => {
Object.defineProperty(MouseEvent.prototype, 'screenX', {
get: function () {
return this.clientX + window.screenX;
}
});
Object.defineProperty(MouseEvent.prototype, 'screenY', {
get: function () {
return this.clientY + window.screenY;
}
});
});
const cursor = createCursor(page);
page.realCursor = cursor
page.realClick = cursor.click
page.disableTurnstileSolver = () => {
solveStatus = false;
};
return page
}
module.exports = { pageController }