首页 > 解决方案 > puppeteer - 识别 reCaptcha 挑战何时变为活动/可见

问题描述

使用这个 reCaptcha 演示页面:https ://recaptcha-demo.appspot.com/recaptcha-v2-invisible.php

使用 puppeteer,我的目标是等待并确定挑战(必须从网格中选择特定图像)何时在页面上可见。我不是在问如何绕过或解决 reCaptcha,只是想知道它何时处于活动状态并准备好被解决。

通过 DevTools,我发现了代表可见 reCaptcha 挑战的 HTML 元素: recaptcha 元素树

不幸的是,我一直无法让 puppeteer “找到”特定元素。即使 reCaptcha 在浏览器中清晰可见并且#rc-imageselect元素在元素树中可见,以下代码将始终打印“未找到”。我已经尝试过主框架、子框架等,但无法让 puppeteer 找到 reCaptcha 元素。

let recap = await myframe.$("body #rc-imageselect")  //.rc-imageselect-payload") // #rc-imageselect
if (recap == null) {
  console.log("imageselect NOT found")
} else {
  console.log("imageselect found")
}

为什么这是必要的?在真实世界的页面(不是这个演示页面)上,reCaptcha 挑战不会为某些用户触发,只会为某些用户弹出。我的目标是确定它何时弹出,然后选择如何处理 reCaptcha,或者通过解决(单独,手动)、后退或完全放弃。

任何有关 puppeteer 代码以查找 reCaptcha 元素的帮助都将受到欢迎。谢谢你。

标签: node.jspuppeteerrecaptchachromiuminvisible-recaptcha

解决方案


有一些错误永远不会进入控制台,因此仍然无法识别,并且是由 iframe 内部的安全问题引起的(这始终是 Chrome/Chromium 浏览器的一个关键点)。您将需要以下安全禁用参数来启动 puppeteer,因为由于同源策略默认情况下不允许您进入 iframe。

const browser = await puppeteer.launch({
    headless: true, args: ['--disable-web-security', '--disable-features=IsolateOrigins,site-per-process']
})

在 reCaptcha 场景中将始终需要这些参数。


推荐阅读