Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 不使用表单提交/按钮单击解决recaptcha(使用回调)_Javascript_Node.js_Recaptcha_Puppeteer - Fatal编程技术网

Javascript 不使用表单提交/按钮单击解决recaptcha(使用回调)

Javascript 不使用表单提交/按钮单击解决recaptcha(使用回调),javascript,node.js,recaptcha,puppeteer,Javascript,Node.js,Recaptcha,Puppeteer,我想从一个网站上解决一个问题 通常它的工作方式是,验证码在表单中,我将验证码数据发送到解决验证码api(im使用DBC),它们返回一个令牌 我将令牌放入验证码输入(#g-recaptcha-response),即使在我提交表单时没有显示绿色复选框,它也会被接受 但是这个网站会自动显示我想要的信息,一旦验证码以另一种方式解决了,当绿色的验证码检查出现时,页面就会用新信息更新 所以我的问题是,当我把令牌放在captcha输入中时,是否有任何方法可以在不提交表单的情况下触发captcha已解决事件(或

我想从一个网站上解决一个问题

通常它的工作方式是,验证码在表单中,我将验证码数据发送到解决验证码api(im使用DBC),它们返回一个令牌

我将令牌放入验证码输入
(#g-recaptcha-response)
,即使在我提交表单时没有显示绿色复选框,它也会被接受

但是这个网站会自动显示我想要的信息,一旦验证码以另一种方式解决了,当绿色的验证码检查出现时,页面就会用新信息更新

所以我的问题是,当我把令牌放在captcha输入中时,是否有任何方法可以在不提交表单的情况下触发captcha已解决事件(或者绿色检查出现时发生的任何事情..我猜是某种回调)

编辑:

通过探索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();

    }
}

我找到了答案,以防有人在你的浏览器控制台中遇到这个问题。玩这个对象
\uuuuuuu grecaptcha\u 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);

我不确定您是如何绕过reCAPTCHA的,但是如果完全自动化不是“必须”的,那么您可以始终通过使用“headless”参数与浏览器交互:const browser=wait puppeter.launch({headless:false})那样,您可以手动填充它,然后继续使用您的抓取脚本。您是genius@hretic->您是如何知道如何查看
\uuuuuuuu grecaptcha\ucfg
。对我来说,它也在
\uuuuu grecaptcha\u cfg.clients[0].D.callback()中