| | function solveTurnstileMin({ url, proxy, siteKey }) { |
| | return new Promise(async (resolve, reject) => { |
| | if (!url) return reject("Missing url parameter"); |
| | if (!siteKey) return reject("Missing siteKey parameter"); |
| |
|
| | const context = await global.browser |
| | .createBrowserContext({ |
| | proxyServer: proxy ? `http://${proxy.host}:${proxy.port}` : undefined, |
| | }) |
| | .catch(() => null); |
| | if (!context) return reject("Failed to create browser context"); |
| |
|
| | let isResolved = false; |
| |
|
| | var cl = setTimeout(async () => { |
| | if (!isResolved) { |
| | await context.close(); |
| | reject("Timeout Error"); |
| | } |
| | }, global.timeOut || 60000); |
| |
|
| | try { |
| | const page = await context.newPage(); |
| |
|
| | if (proxy?.username && proxy?.password) |
| | await page.authenticate({ |
| | username: proxy.username, |
| | password: proxy.password, |
| | }); |
| |
|
| | await page.setRequestInterception(true); |
| |
|
| | page.on("request", async (request) => { |
| | if ( |
| | [url, url + "/"].includes(request.url()) && |
| | request.resourceType() === "document" |
| | ) { |
| | const response = await request.respond({ |
| | status: 200, |
| | contentType: "text/html", |
| | body: String( |
| | require("fs").readFileSync("./data/fakePage.html") |
| | ).replace(/<site-key>/g, siteKey), |
| | }); |
| | } else { |
| | await request.continue(); |
| | } |
| | }); |
| |
|
| | await page.goto(url, { |
| | waitUntil: "domcontentloaded", |
| | }); |
| |
|
| | await page.waitForSelector('[name="cf-response"]', { |
| | timeout: 60000, |
| | }); |
| |
|
| | const token = await page.evaluate(() => { |
| | try { |
| | return document.querySelector('[name="cf-response"]').value; |
| | } catch (e) { |
| | return null; |
| | } |
| | }); |
| |
|
| | isResolved = true; |
| | clearInterval(cl); |
| | await context.close(); |
| | if (!token || token.length < 10) return reject("Failed to get token"); |
| | return resolve(token); |
| | } catch (e) { |
| | if (!isResolved) { |
| | await context.close(); |
| | clearInterval(cl); |
| | reject(e.message); |
| | } |
| | } |
| | }); |
| | } |
| | module.exports = solveTurnstileMin; |
| |
|