UNPKG

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
"use strict"; 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