【问题标题】:solving recaptcha without a form submit/ button click ( uses callback )在没有表单提交/按钮单击的情况下解决 recaptcha(使用回调)
【发布时间】:2020-04-24 18:14:21
【问题描述】:

我试图从一个我试图抓取的网站上解决一个 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 }) 这样,您可以手动填充它,然后继续您的抓取脚本。

标签: javascript node.js recaptcha puppeteer


【解决方案1】:

我找到了答案,以防万一有人在您的浏览器控制台中遇到此问题 使用此对象___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()
猜你喜欢
  • 2011-12-04
  • 1970-01-01
  • 1970-01-01
  • 2018-09-04
  • 2016-08-29
  • 2021-12-20
  • 2011-04-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多