【问题标题】:finding recaptcha callback寻找recaptcha回调
【发布时间】:2020-05-12 18:43:40
【问题描述】:

我正在尝试从此页面获取数据

https://ahrefs.com/backlink-checker

它基本上是一个检查域排名和其他状态的网站,当你输入域并单击检查Check backlinks 按钮时,它会显示一个谷歌recaptcha

我使用验证码服务绕过此问题,问题是此站点在验证码完成时使用回调,当我从我的 api 接收令牌并将其放入 #g-recaptcha-response 时,我必须调用回调才能继续前进是没有提交按钮

我曾经在这个对象中找到回调

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

就这样称呼它

page.evaluate(`___grecaptcha_cfg.clients[0].L.L.callback("${cap}")`)

但最近这个对象无处可寻

我明白了 Evaluation failed: TypeError: Cannot read property 'L' of undefined

有什么想法吗?

【问题讨论】:

  • 我正在查看该页面,但验证码不存在。
  • @pguardiario 你必须点击橙色按钮才能显示验证码
  • 这个forum帮了很多忙

标签: javascript node.js puppeteer recaptcha captcha


【解决方案1】:

当我检查该 url 并且验证码出现在屏幕上时,___grecaptcha_cfg.clients[0] 中可用回调的对象是不同的,即 L 在 ___grecaptcha_cfg.clients[0] 上不存在,这就是你可能得到的原因错误。于是想到了根据类型导航到callback对象,而不是直接访问。

const client = ___grecaptcha_cfg.clients[0]
const keys = Object.keys(client)
const requiredKey = keys.find(key => client[key].constructor.name === "VK");

const requiredObj = client[requiredKey];

const callbackObjKey = Object.keys(requiredObj).find(key => requiredObj[key].callback);
requiredObj[callbackObjKey].callback("${cap}")

希望这会有所帮助。

我已经修改了代码并使用下面的方法来查找callback 对象,虽然这种方法没有那么优化,但这是我想找出callback 方法的方式

const reduceObjectToArray = (obj) => Object.keys(obj).reduce(function (r, k) {
        return r.concat(k, obj[k]);
}, []);

const client = ___grecaptcha_cfg.clients[0]
let result = [];
result = reduceObjectToArray(client).filter(c => Object.prototype.toString.call(c) === "[object Object]")

result = result.flatMap(r => {
    return reduceObjectToArray(r)
})

result = result.filter(c => Object.prototype.toString.call(c) === "[object Object]")

const reqObj = result.find( r => r.callback)
reqObj.callback("${cap}")

【讨论】:

  • 谢谢,如果我可以在对象中搜索回调,那就太好了,但它似乎不起作用......我得到VM531:5 Uncaught ReferenceError: key is not defined也许你打算写const requiredObj = client[requiredKey ]?但是当我 console.log requiredKey
  • 是的。我的意思是。对不起,这是一个错字。我已经更新了我的答案。谢谢你的暗示。哦,对我来说它正在工作,我已经在 Chrome 和 Safari 中检查过。这里要注意的一点是,只有当验证码在屏幕上可用时,您才会获得该值。否则___grecaptcha_cfg.clients[0] 将是undefined
  • console.log(requiredKey) 有什么用?它应该是一个字符串...键的名称对吗?我得到undefined,我认为这就是没有钥匙没有对象的问题......我已经在我的问题中添加了一张图片,请看一下
  • 哦。看起来很奇怪,我已经在不同的浏览器中对此进行了测试,当我做console.log(requiredKey) 时仍然得到字符串,我已经用截图更新了答案。我想知道的是对象的类型对你和我来说也发生了变化或不同?
  • 用另一种方法修改了我的答案,我知道它不是那么优化的解决方案。但我希望这没有任何问题。请尝试一次。
猜你喜欢
  • 2018-08-05
  • 2017-10-08
  • 1970-01-01
  • 1970-01-01
  • 2019-02-19
  • 2021-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多