Troubleshooting

Por que o reCAPTCHA v3 retorna pontuação baixa

Resposta curta: seu token provavelmente está correto. A nota baixa diz que o Google avaliou a origem da requisição e o comportamento da sessão — não a sua integração. É isso que torna a v3 desconfortável de depurar: sem imagem para clicar e sem mensagem de erro, a suspeita cai sobre o único trecho visível — o seu código.


O que a nota realmente mede

A v3 devolve um número entre 0,0 (típico de bot) e 1,0 (típico de pessoa). O corte é decisão de cada site — checkout costuma exigir 0,7; cadastro passa com 0,3 — e você não controla esse limite.

Categoria de sinal O que é observado
Reputação de IP Datacenter ou rede comum, histórico de abuso
Sinais do navegador Canvas, WebGL, fontes, plug-ins
Cookies e sessão Cookies do Google, histórico de navegação
Movimento do mouse Trajetória, velocidade, pausas
Rolagem e digitação Padrão de rolagem, ritmo entre teclas
Tempo de permanência Tempo na página antes da ação
Frequência de envio Execuções partindo da mesma sessão

O ponto que quase todo diagnóstico erra: nenhum sinal isolado derruba a nota. O que derruba é a soma — IP de datacenter mais perfil sem histórico mais envio instantâneo.


Monte o loop de medição antes de mexer em qualquer coisa

Sem medição você troca a origem de rede, troca o perfil e não sabe o que mexeu no número. Em ambiente próprio, registre a nota do siteverify a cada envio; em uma dúzia de rodadas o padrão aparece. Se esse log guardar IP ou identificadores de sessão, considere as obrigações da LGPD (ou do RGPD, em Portugal).

Antes de tudo, confirme que a sitekey é mesmo a da v3 e não a de um widget v2 na mesma página. Depois altere uma variável por vez, nesta ordem de impacto: origem de rede, idade do token, perfil do navegador, frequência de envio, cookies de sessão. Se a API responde bem e só o fluxo pelo navegador falha, o problema está no ambiente da automação.


As sete causas mais frequentes

1. Reputação de IP: a explicação mais comum para o score travado em 0,1

O Google mantém histórico por faixa de endereços: saídas de datacenter compartilhadas já chegam com nota reduzida antes de a página abrir.

Como corrigir: use egress de rede autorizado e dedicado, com rotação entre execuções.

2. Parâmetro de ação divergente

Toda chamada grecaptcha.execute() carrega uma string de ação — login, submit, checkout — embutida no token. Se ela não bate com a esperada, o backend descarta a verificação mesmo com nota alta.

Como corrigir: no DevTools, copie o valor exato para o parâmetro action. Maiúsculas contam.

3. Perfil de navegador sem história

Um navegador headless recém-iniciado não tem nada a apresentar: nenhum movimento de mouse, nenhuma rolagem, nenhum cookie.

Como corrigir: reaproveite um perfil persistente, reproduza interação real antes do envio e use viewport e user agent de desktop comum.

4. Cookies do Google ausentes

Cookies como NID, SID e HSID carregam histórico que o modelo lê como uso legítimo; perfis criados do zero não têm nenhum deles.

Como corrigir: parta de um perfil com sessão do Google válida antes de abrir a página com o CAPTCHA.

5. Token consumido tarde demais

O token da v3 vale 2 minutos. Pipelines que resolvem cedo e só enviam depois de outras validações estouram esse limite: funciona local e quebra no CI.

Como corrigir: peça o token como último passo antes do POST.

6. Muitas execuções na mesma sessão

Chamadas repetidas de grecaptcha.execute() na mesma sessão reduzem a nota a cada rodada.

Como corrigir: espace as requisições em 15 a 30 segundos e alterne sessões e perfis entre lotes.

7. Modo headless identificável

Sites reconhecem o Chrome headless por propriedades inconsistentes de chrome.runtime e pela ausência de plug-ins que um navegador comum declara.

Como corrigir: rode uma instância real do navegador, com configuração padrão, e valide em staging.


Um cenário de QA no Brasil

Um time em São Paulo mantém workers em sa-east-1 e homologação na Europa. Depois de migrar para uma faixa de IP de datacenter recém-alocada, todo envio da v3 passou a voltar em 0,1.

Dois fatores somados: a faixa era nova para o modelo, sem histórico a favor, e o RTT entre São Paulo e a região do alvo, mais dois passos de validação antes do POST, consumia boa parte dos 2 minutos do token. Isolando um fator por vez em ambiente próprio, com dados fictícios e URLs de staging, o time viu que apenas pedir o token por último já recuperava parte da nota.


O que esperar da CaptchaAI na v3

A CaptchaAI resolve reCAPTCHA v3 em ambientes de navegador reais e devolve tokens que normalmente pontuam 0,3 — suficiente para a maioria dos sites, insuficiente acima disso. A nota continua sendo do Google: nenhum serviço escolhe o score, apenas emite o token em condições melhores que as de um worker headless recém-criado.

O fluxo é igual em Python e Node.js: envie a sitekey, a pageurl e a ação exata para in.php e consulte res.php até o token voltar.

import requests
import time

response = requests.get("https://ocr.captchaai.com/in.php", params={
    "key": "YOUR_API_KEY",
    "method": "userrecaptcha",
    "version": "v3",
    "googlekey": "SITE_KEY",
    "action": "login",
    "pageurl": "https://staging.example.com/qa-login",
    "json": 1
})

task_id = response.json()["request"]

for _ in range(30):
    time.sleep(5)
    result = requests.get("https://ocr.captchaai.com/res.php", params={
        "key": "YOUR_API_KEY", "action": "get", "id": task_id, "json": 1
    }).json()
    if result.get("status") == 1:
        token = result["request"]
        print(f"Token received: {token[:50]}...")
        break
const axios = require('axios');

async function solveV3(sitekey, pageurl, action) {
  const { data } = await axios.get('https://ocr.captchaai.com/in.php', {
    params: {
      key: 'YOUR_API_KEY', method: 'userrecaptcha', version: 'v3',
      googlekey: sitekey, action, pageurl, json: 1
    }
  });

  const taskId = data.request;
  for (let i = 0; i < 30; i++) {
    await new Promise(r => setTimeout(r, 5000));
    const res = await axios.get('https://ocr.captchaai.com/res.php', {
      params: { key: 'YOUR_API_KEY', action: 'get', id: taskId, json: 1 }
    });
    if (res.data.status === 1) return res.data.request;
  }
  throw new Error('Timeout');
}

Perguntas frequentes

Qual score o site exige para aceitar meu token?

Não dá para ler o corte de fora — ele fica no backend do site. Dá para inferir: se tokens de 0,3 passam, o limite é 0,3 ou menor. Registre a nota do siteverify a cada envio e o valor fica evidente.

Na minha máquina a nota é alta e no CI cai para 0,1. O que muda?

Muda o ambiente, não o código. O CI roda em faixa de datacenter, com navegador recém-criado e sem cookie do Google — três sinais fracos de uma vez. Reproduza o cenário do CI localmente antes de mexer na integração.

O token da v3 tem tempo de vida diferente do da v2?

Sim, e é o detalhe que mais quebra pipeline: o da v3 vale 2 minutos. Se houver validações intermediárias antes do POST, cronometre esse trecho no CI antes de culpar o score.

Preciso de plano pago só para validar a integração?

O plano BASIC (US$ 15/mês, 5 threads) cobre validação e QA. A cobrança é por thread concorrente, com resoluções ilimitadas nas threads contratadas — repetir a suíte não aumenta o custo. Acima dele vêm STANDARD (US$ 30/mês, 15 threads) e ADVANCE (US$ 90/mês, 50 threads).

Vale insistir na v3 ou resolver o fallback v2?

Depende do corte do site. Muitos exibem um desafio v2 justamente quando a nota da v3 fica baixa, e a v2 tem resultado binário — se a v3 reprova sempre, o fallback é mais previsível.


Guias relacionados

Os comentários estão desativados para este artigo.