/
如何查找 reCaptcha 系列的回调函数

如何查找 reCaptcha 系列的回调函数

每个网站都不一样,如果以下方式都不能解决问题,烦请您自己多研究研究,您可以的。

 

通过API获取到识别成功的gRecaptchaResponse值之后,如果你是使用模拟类的软件,如selenium,则需要执行回调函数,来告诉网页我们已经识别成功了,那么我们来了解如何查找到这个函数:

注意:有某些情况下,确实是没有回调函数,这种可以直接给g-recaptcha-response容器赋值然后提交表单即可。

方法一:通过控制台Elements进行搜索

打开显示的页面,按F12进入控制台,在Elements处按Ctrl+F进行搜索,搜索关键词:data-callback

可以看到,这里我们的回调函数就是onSuccess,接下来在selenium里面只需要执行这个函数就可以了

如果找不到,可能是被混肴或者其他情况,可以尝试其他方法

driver.execute_script(f'onSuccess("{gRecaptchaResponse}")')

 

方法二:适用于reCaptcha V3系列

与方法一类似,搜索关键词:grecaptcha.render

找到类似的代码,其中的callback就是回调函数

grecaptcha.render('example', { 'sitekey' : 'someSitekey', 'callback' : myCallbackFunction, 'theme' : 'dark' });

 

方法三:通过控制台Console查找

按F12,进入console, 输入 ___grecaptcha_cfg.clients,如果报错,则这个网页没有加载reCaptcha

通常有很多节点,需要注意区别,这里onSuccess就是我们要找的回调函数

 

方法四:通过自动查找函数查找

如果以上方法执行都有困难,可以尝试这种通过定义自动查找函数的方式查找

按F12,进入console, 输入自动定义函数findRecaptchaClients()

function findRecaptchaClients() { // eslint-disable-next-line camelcase if (typeof (___grecaptcha_cfg) !== 'undefined') { // eslint-disable-next-line camelcase, no-undef return Object.entries(___grecaptcha_cfg.clients).map(([cid, client]) => { const data = { id: cid, version: cid >= 10000 ? 'V3' : 'V2' }; const objects = Object.entries(client).filter(([_, value]) => value && typeof value === 'object'); objects.forEach(([toplevelKey, toplevel]) => { const found = Object.entries(toplevel).find(([_, value]) => ( value && typeof value === 'object' && 'sitekey' in value && 'size' in value )); if (typeof toplevel === 'object' && toplevel instanceof HTMLElement && toplevel['tagName'] === 'DIV'){ data.pageurl = toplevel.baseURI; } if (found) { const [sublevelKey, sublevel] = found; data.sitekey = sublevel.sitekey; const callbackKey = data.version === 'V2' ? 'callback' : 'promise-callback'; const callback = sublevel[callbackKey]; if (!callback) { data.callback = null; data.function = null; } else { data.function = callback; const keys = [cid, toplevelKey, sublevelKey, callbackKey].map((key) => `['${key}']`).join(''); data.callback = `___grecaptcha_cfg.clients${keys}`; } } }); return data; }); } return []; }

然后在consolse执行这个函数findRecaptchaClients() 即可找到出对应的函数

如下图

 

reCaptcha 匿名函数怎么调用?

注意:有时候找到的回调函数是一个函数名,比如上面提到的onSuccess,调用时直接onSuccess(gRecaptchaResponse) ,但有时候查到是一个匿名函数,匿名函数的意思就是没有函数名,比如下面这种:

这种匿名函数,我们只需要按照刚才查找的完整路径去执行,效果是一样的,比如:

我们举一个例子,以这个网站为例, 输入 ___grecaptcha_cfg.clients展开查找之后,可以看到这里的回调函数promise-callback是一个匿名函数 f(token)

我们可以在上面按右键,点击Copy property path复制这个节点路径

再加上刚才输入的___grecaptcha_cfg.clients,就可以得到这个函数的完整路径

最后和前面提到的执行方式一样,当成普通函数执行即可

 

方法五:全类型自动注入 (测试)

Related content

Python DEMO:selenium模拟提交 demo_selenium.py
Python DEMO:selenium模拟提交 demo_selenium.py
More like this
如何找到 reCaptcha 需要的各项参数
如何找到 reCaptcha 需要的各项参数
More like this
如何判断 reCaptcha 是什么版本
如何判断 reCaptcha 是什么版本
Read with this
如何通过API来通过 reCaptcha
如何通过API来通过 reCaptcha
More like this
如何找reCaptchaV3的action值
如何找reCaptchaV3的action值
Read with this
How to locate the callback functions for the reCaptcha series
How to locate the callback functions for the reCaptcha series
More like this