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.
90 lines (77 loc) • 2.22 kB
JavaScript
import { createCursor } from "ghost-cursor";
import { checkTurnstile } from "./turnstile.mjs";
import kill from "tree-kill";
function getRandomInt(min, max) {
min = Math.ceil(min);
max = Math.floor(max);
return Math.floor(Math.random() * (max - min + 1)) + min;
}
export 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;
}