undetected-browser
Version:
Puppeteer implementation with more anti-detection methods for interacting with websites
94 lines (89 loc) • 3.41 kB
JavaScript
const fs = require("fs");
class CaptchaTester {
constructor() {}
async checkCaptcha(page) {
const report = {
cloudflare: null,
arkose: {
steps: 0,
objects: 0,
status: "error",
},
};
await page.navigate("https://nopecha.com/demo/turnstile");
await page.sleep(1000);
const checkBox = await page.$$$('input[type="checkbox"]');
await page.simulateMouseClick(checkBox);
let cloudflareResult = null;
while (cloudflareResult == null) {
await page.sleep(500);
const failElementHandle = await page.$$$('div[id="fail"]');
if (await failElementHandle.isVisible()) {
cloudflareResult = "fail";
}
const successElementHandle = await page.$$$('div[id="success"]');
if (await successElementHandle.isVisible()) {
cloudflareResult = "pass";
}
const errorElementHandle = await page.$$$('div[id="challenge-error"]');
if (await errorElementHandle.isVisible()) {
cloudflareResult = "error";
}
}
report.cloudflare = cloudflareResult;
await page.navigate("https://account.microsoft.com/account");
const signInButton = await page.$('a[aria-label="Sign in to your account"]');
signInButton.click();
await page.waitToLoad();
await page.click("#signup");
await page.smartWaitForSelector('input[aria-label="New email"]');
await page.smartWaitForSelector("#liveSwitch");
await page.click("#liveSwitch");
await page.sleep(100);
await page.type('input[aria-label="New email"]', page.makeid(10));
await page.sleep(20);
await page.click("#iSignupAction");
await page.smartWaitForSelector("#PasswordInput");
await page.type("#PasswordInput", page.makeid(10));
await page.click("#iSignupAction");
await page.smartWaitForSelector("#BirthMonth");
await page.select("#BirthMonth", page.getRandomInt(1, 12).toString());
await page.select("#BirthDay", page.getRandomInt(1, 31).toString());
await page.type("#BirthYear", page.getRandomInt(1970, 2000).toString());
await page.click("#iSignupAction");
await page.smartWaitForSelector("#enforcementFrame");
await page.sleep(2000);
const startArkose = await page.$$$('button[data-theme="home.verifyButton"]');
if (startArkose) await page.simulateMouseClick(startArkose);
await page.sleep(3000);
const pipContainer = await page.$$$(".pip-container");
if (pipContainer) {
const steps = await pipContainer.$$("div");
report.arkose.objects = steps.length;
}
const textParrent = await page.$$$('span[role="text"]');
if (textParrent) {
const text = await textParrent.$eval("*", (node) => node.parentElement.innerText);
report.arkose.steps = extractSteps(text);
if (report.arkose.steps <= 5) {
report.arkose.status = "pass";
} else {
report.arkose.status = "fail";
}
}
return report;
}
}
function extractSteps(text) {
// Use a regular expression to match all numbers in the text
const matches = text.match(/\b(\d+)\b/g);
// Check if matches are found
if (matches && matches.length >= 2) {
// Convert the second matched string to a number and return it
return parseInt(matches[1], 10);
} else {
// Return an error value or handle it as per your requirement
return "error"; // for example
}
}
module.exports = CaptchaTester;