无需提交表单/点击按钮即可解决reCAPTCHA(使用回调函数)

4

我正在尝试解决一个网站的reCAPTCHA以便进行爬取。

通常情况下,验证码嵌入在一个表单中,我会将验证码数据发送到一个验证码解决API(我使用DBC),他们会返回令牌。

我将令牌放入验证码输入(#g-recaptcha-response),即使绿色勾号没有显示出来,当我提交表单时,它也会被接受。

但是,当验证码的绿色勾号出现时,该网站会自动显示我要爬取的信息。如果以其他方式解决验证码,页面将被更新为新信息。

所以我的问题是,当我将令牌放入验证码输入时,是否有任何方法可以触发已解决验证码的事件(或者当绿色勾号出现时会发生什么...我猜是某种回调),而不提交表单?

编辑:

在探索reCAPTCHA配置时,我发现了这个:

___grecaptcha_cfg.clients[0].L.L.callback

指向这个的

function verifyCallback(e)

但我不确定如何调用它。

async function init_puppeteer() {

    const global_browser = await puppeteer.launch({headless: false     , slowMo : 10 ,  args: ['--no-sandbox', '--disable-setuid-sandbox' , ]});
    const page = await global_browser.newPage();
    await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36');
    await page.setViewport({width: 1200, height: 1500});

    try {


        await page.goto('https://example.com', {timeout: 60000})
            .catch(function (error) {
                throw new Error('TimeoutBrows');
            });

        await page.waitForSelector('input[name="url"]');
        await page.type('input[name="url"]', 'example.com' , {delay: 10})
        await page.click('button.css-117i75i-button');
        await page.waitForSelector('#g-recaptcha' ,{visible : true });
        const datakey = await page.$eval('#g-recaptcha' , el => el.getAttribute('data-sitekey'));
        const cap = await solvecaptcha(datakey ,page.url() );

        await page.$eval('#g-recaptcha-response', (el  , cap ) => el.value = cap , cap );
        console.log('done!');


    }
    catch(e)
    {
        console.log('--------ERRRO--------------------------');
        console.log(e);
        await  page.close();

    }
}

我不确定你是如何绕过reCAPTCHA的,但如果完全自动化不是“必须”的话,你可以使用“headless”参数与浏览器进行交互:const browser = await puppeteer.launch({ headless: false })这样,你就可以手动填写它,然后继续你的爬虫脚本。 - charly rl
1个回答

4

我找到了答案,以防万一有人遇到这个问题,请在您的浏览器控制台中操作这个对象___grecaptcha_cfg以查找回调函数,我的就在这里。

___grecaptcha_cfg.clients[0].L.L.callback

但对于其他网站,它的结构可能有所不同。

因此,基本上在我收到令牌并将其放入 #g-recaptcha-response 后,我调用了这个函数并将令牌作为参数传递。

    let js = `___grecaptcha_cfg.clients[0].L.L.callback("${cap}")`;
    await page.evaluate(js);

你真是个天才 @hretic -> 你怎么知道要查看 ___grecaptcha_cfg。对我来说,它在 ___grecaptcha_cfg.clients[0].D.D.callback() 中。 - NemyaNation

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接