找到 recaptcha 回调

finding recaptcha callback

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

https://ahrefs.com/backlink-checker

它基本上是一个检查域排名和其他状态的网站,当您输入域并单击检查 Check backlinks 按钮时,它会显示 google 重新验证

我正在使用验证码服务来绕过这个,问题是这个网站在验证码完成时使用回调,当我从我的 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

有什么想法吗?

当我检查 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}")