auto-captcha-solver
Version:
Automatically detect and solve various captcha types in Playwright & Puppeteer with 2Captcha/CapMonster Cloud integration
99 lines • 3.73 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.captchaSolver = captchaSolver;
const captcha_detect_1 = require("../lib/captcha-detect");
const captcha_loading_1 = require("../lib/captcha-loading");
const capmonster_1 = require("../lib/provider/capmonster/capmonster");
const two_captcha_1 = require("../lib/provider/2captcha/two-captcha");
const providerCapabilities = {
capmonster: new Set([
// 'Image To Text',
'reCAPTCHA v2',
'reCAPTCHA v3',
'Cloudflare Turnstile'
// 'GeeTest V4 Captcha'
]),
'2captcha': new Set([
'Image To Text',
'reCAPTCHA v2',
'reCAPTCHA v2 Invisible',
'reCAPTCHA v3',
'reCAPTCHA Enterprise',
'Cloudflare Turnstile',
'Cloudflare CAPTCHA',
// 'GeeTest V4 Captcha',
'Text Captcha',
'hCaptcha',
'MTCaptcha'
])
};
function providerSupportsType(providerName, captchaType) {
return providerCapabilities[providerName]?.has(captchaType) ?? false;
}
async function captchaSolver(page, captchaInfo) {
const captchaData = (await (0, captcha_detect_1.captchaDetect)(page, captchaInfo));
if (!captchaData) {
return { success: false, message: 'No CAPTCHA detected' };
}
// Inject loading spinner on the website
await (0, captcha_loading_1.captchaLoading)(page);
try {
const providers = Array.isArray(captchaInfo.providers)
? captchaInfo.providers
: [
{
name: captchaInfo.providers,
apiKey: captchaInfo.apiKey
}
];
// Filter providers that support the detected type
const supportedProviders = providers.filter((p) => providerSupportsType(p.name, captchaData.type));
if (!supportedProviders.length) {
return { success: false, message: `No providers support ${captchaData.type}` };
}
let lastError = null;
for (const provider of supportedProviders) {
try {
let result;
const providerConfig = { ...captchaInfo, apiKey: provider.apiKey };
switch (provider.name) {
case 'capmonster':
result = await (0, capmonster_1.solveWithCapMonster)(providerConfig, captchaData, page);
break;
case '2captcha':
result = await (0, two_captcha_1.solveWith2Captcha)(providerConfig, captchaData, page);
break;
default:
result = {
success: false,
message: `Unsupported provider: ${provider.name}`
};
}
if (result.success)
return result;
else
lastError = new Error(result.message);
}
catch (error) {
lastError = error instanceof Error ? error : new Error(String(error));
}
}
return {
success: false,
message: `All providers failed: ${lastError?.message || 'Unknown error'}`
};
}
catch (error) {
return { success: false, message: error.message };
}
finally {
// Cleanup loading spinner
await page.evaluate(`(function() {
const loader = document.getElementById('captcha-loading');
const overlay = document.getElementById('captcha-blur-overlay');
loader?.remove();
overlay?.remove();
})();`);
}
}
//# sourceMappingURL=captcha-solver.js.map