Cómo encontrar la función de devolución de llamada de cada versión de reCaptcha
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
- Método 2: Aplicable a la serie reCaptcha V3
- Método 3: Buscar a través de la Consola
- Método 4: Buscar mediante una función de búsqueda automática
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}")')
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
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)
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)