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