| 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("./src/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; |
|
|