auto-captcha-solver
Version:
Automatically detect and solve various captcha types in Playwright & Puppeteer with 2Captcha/CapMonster Cloud integration
142 lines (141 loc) • 6.02 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.injectTokenResponse = injectTokenResponse;
exports.injectReCaptchaV3Response = injectReCaptchaV3Response;
exports.injectGeeTestV4Solution = injectGeeTestV4Solution;
/**
* Injects the CAPTCHA solution into the relevant input field and verifies the injection.
* @param page Playwright Page instance
* @param selector The selector of the CAPTCHA response input field
* @param token The CAPTCHA solution token to inject
* @returns {Promise<boolean>} - Returns `true` if the token was successfully injected, otherwise `false`
*/
async function injectTokenResponse(page, selector, token) {
const script = `
(function() {
const input = document.querySelector('${selector}');
if (input) {
input.value = '${token}';
return input.value === '${token}';
}
return false;
})();
`;
return await page.evaluate(script);
}
async function injectReCaptchaV3Response(page, token) {
const script = `(function() {
document.dispatchEvent(new CustomEvent('recaptchaTokenReceived', { detail: '${token}' }));
const textarea = document.querySelector(
'textarea[name="g-recaptcha-response"]'
);
if (textarea) {
textarea.value = '${token}';
return true;
} else {
return false;
}
})()`;
return await page.evaluate(script);
}
async function injectGeeTestV4Solution(page, solution) {
try {
const result = await page.evaluate((sol) => {
try {
// Find the main GeeTest container
const mainContainer = document.querySelector('[class^="geetest_captcha_"].geetest_captcha');
if (!mainContainer) {
console.error('Main GeeTest container not found');
return { success: false };
}
// // Prevent duplicate injection
if (mainContainer.querySelector('.geetest_detect')) {
console.warn('GeeTest solution holder already exists.');
return { success: true };
}
// Create the solution holder div
const holder = document.createElement('div');
holder.className = 'geetest_holder geetest_wind geetest_detect';
holder.style.display = 'none';
// Helper function to create hidden inputs
const createSolutionInput = (name, value) => {
const input = document.createElement('input');
input.type = 'hidden';
input.name = name;
input.value = value;
return input;
};
// Add hidden input fields
[
'captcha_id',
'lot_number',
'pass_token',
'gen_time',
'captcha_output'
].forEach((key) => {
holder.appendChild(createSolutionInput(key, sol[key] || ''));
});
// Append the solution holder to the container
mainContainer.appendChild(holder);
// Trigger the success callback
const triggerSuccess = () => {
if (typeof window.gt4SuccessHandler === 'function') {
window.gt4SuccessHandler();
return true;
}
if (window.captchaObjEventsV4?.onSuccess) {
window.captchaObjEventsV4.onSuccess();
return true;
}
return false;
};
let successTriggered = triggerSuccess();
if (!successTriggered) {
setTimeout(() => {
successTriggered = triggerSuccess();
}, 50);
}
return {
success: successTriggered,
holderAdded: !!mainContainer.querySelector('.geetest_holder'),
inputs: Array.from(holder.querySelectorAll('input')).map((input) => ({
name: input.name,
value: input.value,
style: input.style.cssText
}))
};
}
catch (error) {
console.error('Injection error:', error);
return { success: false };
}
}, solution);
// Ensure the element appears
try {
await page.waitForSelector('[class^="geetest_captcha_"] .geetest_holder.geetest_wind.geetest_detect', { timeout: 15000 });
}
catch {
console.warn('GeeTest solution holder did not appear in time.');
}
// Ensure all inputs are correctly added
try {
await page.waitForFunction(() => {
const holder = document.querySelector('.geetest_holder.geetest_wind.geetest_detect');
return (holder &&
holder.querySelectorAll('input[type="hidden"]').length === 5 &&
Array.from(holder.querySelectorAll('input')).every((input) => input.style.fontFamily.includes('Bangla658') &&
input.value.length > 0));
}, { timeout: 10000 });
}
catch {
console.warn('GeeTest input fields not properly populated.');
}
return result.success;
}
catch (error) {
console.error('GeeTest V4 injection failed:', error);
await page.screenshot({ path: 'geetest-error.png', fullPage: true });
return false;
}
}
//# sourceMappingURL=injectCaptchaResponse.js.map