Blog
Cómo encontrar la función de devolución de llamada de cada versión de reCaptcha

Cómo encontrar la función de devolución de llamada de cada versión de reCaptcha

WARNING

Cada sitio web es diferente, si ninguno de los siguientes métodos puede resolver el problema.

Por favor, investiga más por ti mismo.

Después de obtener con éxito el valor gRecaptchaResponse reconocido a través de la API, si estás utilizando software de simulación, como Selenium, necesitas ejecutar una función de devolución de llamada para informar a la página web que hemos reconocido con éxito. Aprendamos cómo encontrar esta función:

Nota: En algunos casos, realmente no hay una función de devolución de llamada. En este caso, puedes asignar valores directamente al contenedor g-recaptcha-response y enviar el formulario.

Método 1: Buscar a través del elemento de la consola

Abre la página que se muestra, presiona F12 para entrar en la consola, presiona Ctrl+F en “Elements” para buscar, busca la palabra clave: data-callback

Como puedes ver, nuestra función de devolución de llamada aquí es onSuccess, y luego solo necesitamos ejecutar esta función en Selenium

Si no puedes encontrarlo, puede estar confundido u otras circunstancias, puedes intentar otros métodos

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

img.png

Método 2: Aplicable a la serie reCaptcha V3

Similar al método 1, busca la palabra clave: grecaptcha.render

Encuentra código similar, donde callback es la función de devolución de llamada

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

Método 3: Buscar a través de la Consola

Presiona F12 para entrar en la consola, ingresa ___grecaptcha_cfg.clients, si se informa un error, la página web no ha cargado reCaptcha

Por lo general, hay muchos nodos, debemos prestar atención a la diferencia, aquí onSuccess es la función de devolución de llamada que estamos buscando

img.png

Método 4: Buscar mediante una función de búsqueda automática

Si es difícil ejecutar los métodos anteriores, puedes intentar encontrarlos definiendo una función de búsqueda automática

Presiona F12 para entrar en la consola e ingresa la siguiente función autodefinida 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 []
}
 
findRecaptchaClients && findRecaptchaClients()

Luego ejecuta esta función findRecaptchaClients() en la consola para encontrar la función correspondiente

[
  {
    "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"
  }
]

Cómo llamar a la función anónima de reCaptcha

Nota: A veces, la función de devolución de llamada encontrada es un nombre de función, como onSuccess mencionado anteriormente, simplemente onSuccess(gRecaptchaResponse) al llamarla. Pero a veces se encuentra que es una función anónima, lo que significa que no tiene un nombre de función, como el siguiente ejemplo:

Para este tipo de función anónima, solo necesitamos ejecutarla según la ruta completa que acabamos de encontrar, y el efecto será el mismo. Por ejemplo:

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

Tomemos un ejemplo, tomando este sitio web como ejemplo, ingresa ___grecaptcha_cfg.clients para expandir la búsqueda, puedes ver que la función de devolución de llamada aquí promise-callback es una función anónima f(token)

img.png

Podemos hacer clic con el botón derecho en ella y hacer clic en “Copy property path” para copiar este nodo

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

Agrega el ___grecaptcha_cfg.clients que acabas de ingresar y obtendrás la ruta completa de esta función

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

Finalmente, es igual que el método de ejecución mencionado anteriormente, simplemente ejecútalo como una función normal

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