UNPKG

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
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 }