转至元数据结尾
转至元数据起始

正在查看旧版本。 查看 当前版本.

与当前比较 查看页面历史

« 上一页 版本 10 当前的 »

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

通过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() 即可找到出对应的函数

[
    {
        "id": "0",
        "version": "V2",
        "sitekey": "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-",
        "function": "onSuccess",
        "callback": "___grecaptcha_cfg.clients['0']['l']['l']['callback']",
        "pageurl": "https://www.google.com/recaptcha/api2/demo"
    }
]

如下图

reCaptcha 匿名函数怎么调用?

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

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

___grecaptcha_cfg.clients.xxxxxxxxx.xxxxx.xxxxx.callback(gRecaptchaResponse)

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

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

[100000].l.l["promise-callback"]("gRecaptchaResponse")

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

___grecaptcha_cfg.clients[100000].l.l["promise-callback"]

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

___grecaptcha_cfg.clients[100000].l.l["promise-callback"](gRecaptchaResponse)

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

(function (response) {
  const ele = document.getElementById("g-recaptcha-response");
  if (ele) {
    ele.innerHTML = response;
    ele.text = response;
  }

  const base = Object.values(___grecaptcha_cfg.clients)[0];
  for (let k0 of Object.keys(base)) {
    for (let k1 of Object.keys(base[k0])) {
        if (base[k0][k1] && base[k0][k1].callback && typeof base[k0][k1].callback === 'function') {
          base[k0][k1].callback(response);
          return true;
        }
    }
  }
  return false;
})('你在平台获取的RESPONSE');
  • 无标签