Blog
Como encontrar a função de retorno de cada versão do reCaptcha

Como encontrar a função de retorno de chamada de cada versão do reCaptcha

WARNING

Cada site é diferente; se nenhum dos métodos a seguir puder resolver o problema.

Por favor, pesquise mais por conta própria.

Após obter o valor gRecaptchaResponse reconhecido com sucesso por meio da API, se você estiver usando software de simulação, como o Selenium, precisará executar uma função de retorno de chamada para informar à página da web que reconhecemos com sucesso. Vamos aprender como encontrar essa função:

Nota: Em alguns casos, realmente não há uma função de retorno de chamada. Nesse caso, você pode atribuir valores diretamente ao contêiner g-recaptcha-response e enviar o formulário.

Método 1: Pesquisar através do Elemento do console

Abra a página exibida, pressione F12 para entrar no console, pressione Ctrl+F em Elementos para pesquisar, procure a palavra-chave: data-callback

Como você pode ver, nossa função de retorno de chamada aqui é onSuccess, e então só precisamos executar essa função no selenium

Se você não conseguir encontrar, pode estar confuso ou em outras circunstâncias, você pode tentar outros métodos

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

img.png

Método 2: Aplicável à série reCaptcha V3

Semelhante ao método 1, pesquise palavras-chave: grecaptcha.render

Encontre um código semelhante, onde callback é a função de retorno de chamada

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

Método 3: Pesquisar pelo Console

Pressione F12 para entrar no console e digite ___grecaptcha_cfg.clients, se ocorrer um erro, a página da web não carregou o reCaptcha

Normalmente, existem muitos nós, precisamos prestar atenção à diferença, aqui onSuccess é a função de retorno de chamada que estamos procurando

img.png

Método 4: Encontrar por função de busca automática

Se for difícil executar os métodos acima, você pode tentar encontrar definindo uma função de busca automática

Pressione F12 para entrar no console e insira a seguinte função definida automaticamente 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()

Em seguida, execute esta função findRecaptchaClients() no console para encontrar a função correspondente

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

Como chamar a função anônima reCaptcha?

Nota: Às vezes, a função de retorno de chamada encontrada é um nome de função, como onSuccess mencionado acima, basta onSuccess(gRecaptchaResponse) ao chamar, mas às vezes é encontrada como uma função anôn

ima, o que significa que não há nome de função, como a seguinte:

Para esse tipo de função anônima, só precisamos executá-la de acordo com o caminho completo que acabamos de encontrar, e o efeito é o mesmo, por exemplo:

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

Vamos dar um exemplo, pegue este site como exemplo, digite ___grecaptcha_cfg.clients para expandir a pesquisa, você pode ver a função de retorno de chamada aqui promise-callback é uma função anônima f(token)

img.png

Podemos clicar com o botão direito nela e clicar em Copiar caminho da propriedade para copiar esse caminho de nó

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

Adicione o ___grecaptcha_cfg.clients inserido anteriormente e você pode obter o caminho completo dessa função

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

Finalmente, é o mesmo método de execução mencionado acima, basta executá-lo como uma função normal

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