Files
cf-bypass-fast/endpoints/turnstile.js
2025-09-23 15:52:41 +05:30

85 lines
2.2 KiB
JavaScript

async function turnstile({ domain, proxy, siteKey }, page) {
if (!domain) throw new Error("Missing domain parameter");
if (!siteKey) throw new Error("Missing siteKey parameter");
const timeout = global.timeOut || 60000;
let isResolved = false;
const cl = setTimeout(async () => {
if (!isResolved) {
throw new Error("Timeout Error");
}
}, timeout);
try {
if (proxy?.username && proxy?.password) {
await page.authenticate({
username: proxy.username,
password: proxy.password,
});
}
const htmlContent = `
<!DOCTYPE html>
<html lang="en">
<body>
<div class="turnstile"></div>
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js?onload=onloadTurnstileCallback" defer></script>
<script>
window.onloadTurnstileCallback = function () {
turnstile.render('.turnstile', {
sitekey: '${siteKey}',
callback: function (token) {
var c = document.createElement('input');
c.type = 'hidden';
c.name = 'cf-response';
c.value = token;
document.body.appendChild(c);
},
});
};
</script>
</body>
</html>
`;
await page.setRequestInterception(true);
page.removeAllListeners("request");
page.on("request", async (request) => {
if ([domain, domain + "/"].includes(request.url()) && request.resourceType() === "document") {
await request.respond({
status: 200,
contentType: "text/html",
body: htmlContent,
});
} else {
await request.continue();
}
});
await page.goto(domain, { waitUntil: "domcontentloaded" });
await page.waitForSelector('[name="cf-response"]', { timeout });
const token = await page.evaluate(() => {
try {
return document.querySelector('[name="cf-response"]').value;
} catch {
return null;
}
});
isResolved = true;
clearTimeout(cl);
if (!token || token.length < 10) throw new Error("Failed to get token");
return token;
} catch (e) {
clearTimeout(cl);
throw e;
}
}
module.exports = turnstile;