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