Comparisons

Comparação de reCAPTCHA v3 Enterprise vs Standard

Se a sua automação parou de funcionar de um dia para o outro em um site que antes passava sem reclamar, provavelmente ninguém trocou o CAPTCHA: o site migrou do reCAPTCHA v3 Standard para o Enterprise. No seu código, a diferença é um parâmetro — enterprise=1 na requisição à CaptchaAI. No site, muda quem define o limite de aprovação e com que granularidade.

As duas versões rodam de forma invisível e devolvem uma pontuação de risco entre 0,0 (bot) e 1,0 (humano). O Enterprise acrescenta códigos de motivo, gerenciamento por projeto no Google Cloud, limites adaptativos por ação e o Account Defender.


O que muda de fato para quem integra

Três diferenças aparecem no seu log; o resto é conversa de marketing:

  • A escala continua igual, de 0,0 a 1,0. Muda o limite que o site aplica a ela.
  • O limite deixa de ser único. No Standard há um corte para tudo; no Enterprise cada ação tem o seu — login passa com 0,7 enquanto checkout exige 0,9.
  • O parâmetro action vira crítico: enviar a ação errada é ser avaliado contra o limite de outra.

Uma equipe de QA em São Paulo que valida o cadastro do próprio produto sente isso na prática: o script estável contra staging.example.com passa a receber tokens recusados depois que a segurança ativa o Enterprise no Google Cloud. Nada quebrou no código — mudou o limite da ação signup.


Como identificar a versão em produção

Não há diferença visual: as duas são invisíveis. A pista está no HTML. O script é enterprise.js?render=KEY no Enterprise e api.js?render=KEY no Standard, e a chamada é grecaptcha.enterprise.execute() em vez de grecaptcha.execute(). Nos dois, a sitekey (chave pública do widget) vem do render= na URL do script, não de um data-sitekey como no v2 — origem mais comum do ERROR_WRONG_GOOGLEKEY.

Em Python, a detecção cabe em uma função que devolve versão, sitekey e ação:

import requests
import re

def detect_v3_version(url):
    html = requests.get(url).text

    if "enterprise.js" in html:
        version = "enterprise"
    elif "recaptcha/api.js" in html and "render=" in html:
        version = "standard"
    else:
        return None

    # Extract sitekey
    key_match = re.search(r'render[=:]\s*["\']?([A-Za-z0-9_-]{40})', html)
    sitekey = key_match.group(1) if key_match else None

    # Extract action
    action_match = re.search(r'action["\']?\s*[:=]\s*["\'](\w+)', html)
    action = action_match.group(1) if action_match else None

    return {"version": version, "sitekey": sitekey, "action": action}

O equivalente em Node.js, para quem já tem o pipeline em JavaScript:

const axios = require("axios");

async function detectV3Version(url) {
  const { data: html } = await axios.get(url);

  const version = html.includes("enterprise.js")
    ? "enterprise"
    : html.includes("recaptcha/api.js") && html.includes("render=")
      ? "standard"
      : null;

  const keyMatch = html.match(/render[=:]\s*['"]?([A-Za-z0-9_-]{40})/);
  const actionMatch = html.match(/action['"]?\s*[:=]\s*['"](\w+)/);

  return {
    version,
    sitekey: keyMatch?.[1],
    action: actionMatch?.[1],
  };
}

Rode essa detecção a cada execução, nunca como constante: sites migram para o Enterprise sem aviso, e um valor fixo transforma a migração deles em incidente seu.


Resolvendo cada versão com a CaptchaAI

O fluxo é o mesmo nos dois casos: envie a tarefa para in.php e consulte res.php até o token ficar pronto.

Standard v3

import requests
import time

resp = requests.get("https://ocr.captchaai.com/in.php", params={
    "key": "YOUR_API_KEY",
    "method": "userrecaptcha",
    "version": "v3",
    "googlekey": sitekey,
    "action": "login",
    "pageurl": page_url
})
task_id = resp.text.split("|")[1]

for _ in range(60):
    time.sleep(5)
    result = requests.get("https://ocr.captchaai.com/res.php", params={
        "key": "YOUR_API_KEY", "action": "get", "id": task_id
    })
    if result.text.startswith("OK|"):
        token = result.text.split("|")[1]
        break

Enterprise v3

A única linha nova é enterprise: 1:

import requests
import time

# Only difference: enterprise=1
resp = requests.get("https://ocr.captchaai.com/in.php", params={
    "key": "YOUR_API_KEY",
    "method": "userrecaptcha",
    "version": "v3",
    "enterprise": 1,
    "googlekey": sitekey,
    "action": "login",
    "pageurl": page_url
})
task_id = resp.text.split("|")[1]

for _ in range(60):
    time.sleep(5)
    result = requests.get("https://ocr.captchaai.com/res.php", params={
        "key": "YOUR_API_KEY", "action": "get", "id": task_id
    })
    if result.text.startswith("OK|"):
        token = result.text.split("|")[1]
        break

Detecção e resolução em um só objeto

O padrão que melhor sobrevive em produção junta as duas etapas: a classe abaixo inspeciona a página, decide se precisa da flag e envia a tarefa.

class V3AutoSolver:
    def __init__(self, api_key):
        self.api_key = api_key

    def solve(self, page_url, action=None):
        import re
        html = requests.get(page_url).text

        is_enterprise = "enterprise.js" in html
        key_match = re.search(r'render[=:]\s*["\']?([A-Za-z0-9_-]{40})', html)
        if not key_match:
            raise Exception("No v3 sitekey found")

        if not action:
            act_match = re.search(r'action["\']?\s*[:=]\s*["\'](\w+)', html)
            action = act_match.group(1) if act_match else "verify"

        params = {
            "key": self.api_key,
            "method": "userrecaptcha",
            "version": "v3",
            "googlekey": key_match.group(1),
            "action": action,
            "pageurl": page_url
        }
        if is_enterprise:
            params["enterprise"] = 1

        resp = requests.get("https://ocr.captchaai.com/in.php", params=params)
        if not resp.text.startswith("OK|"):
            raise Exception(f"Submit failed: {resp.text}")

        task_id = resp.text.split("|")[1]
        for _ in range(60):
            time.sleep(5)
            result = requests.get("https://ocr.captchaai.com/res.php", params={
                "key": self.api_key, "action": "get", "id": task_id
            })
            if result.text.startswith("OK|"):
                return result.text.split("|")[1]
            if result.text != "CAPCHA_NOT_READY":
                raise Exception(f"Solve error: {result.text}")
        raise Exception("Timed out")

Como a cobrança da CaptchaAI é por thread simultânea, e não por resolução, detectar antes de cada envio não custa nada a mais. O BASIC (US$ 15/mês, 5 threads) cobre uma suíte de QA com resoluções ilimitadas; volumes maiores só pedem mais threads — STANDARD (US$ 30/mês, 15 threads) ou ADVANCE (US$ 90/mês, 50 threads).


Códigos de motivo: por que o Enterprise recusa

É a novidade mais útil do Enterprise para quem diagnostica: junto da pontuação vêm códigos que explicam o veredito.

Código Significado O que investigar
AUTOMATION Comportamento automatizado Sinal de navegador do ambiente
UNEXPECTED_ENVIRONMENT Navegador incomum Modo headless identificado
TOO_MUCH_TRAFFIC Volume alto da mesma origem Limite de requisições
UNEXPECTED_USAGE_PATTERNS Interação anormal Intervalos entre as ações
LOW_CONFIDENCE_SCORE Dados insuficientes Sinais comportamentais
SUSPECTED_CARDING Fraude com cartão Irrelevante para QA legítimo
SUSPECTED_CHARGEBACK Fraude de estorno Irrelevante para QA legítimo

Importante: você não vê esses códigos ao resolver pela CaptchaAI — eles vão para o backend do site na verificação do token. Conhecê-los ajuda a interpretar o que você observa: quando o token é aceito em teste e recusado em produção, a causa costuma estar em um deles.


Pontuação e recursos, lado a lado

O Standard v3 usa um único modelo global do Google; o Enterprise parte dele e acrescenta camadas:

Aspecto Standard v3 Enterprise v3
Operação invisível Sim Sim
Modelo de pontuação Global do Google Global + sinais do projeto
Faixa e granularidade 0,0–1,0, duas casas Mesma faixa, mais sinais
Limites Um corte para tudo Um por ação (login=0,7, checkout=0,9)
Aprendizagem adaptativa Básica Tráfego daquele site
Códigos de motivo Não Sim
Falso positivo Ajuste manual Análise dos códigos
Vazamento de senha Não Sim
Account Defender e rótulos de fraude Não Sim
Autenticação multifator Não Sim
Endpoint de verificação siteverify (gratuito) recaptchaenterprise.googleapis.com
Cota mensal 1 milhão de avaliações grátis Por avaliação
Arquivo JS api.js?render=KEY enterprise.js?render=KEY
Parâmetros na CaptchaAI version=v3 version=v3 + enterprise=1

A consequência é contraintuitiva: a mesma pontuação pode ser aprovada em um site e recusada em outro, sem nada ter mudado do seu lado. Antes de mexer no código, meça — registre pontuação, ação e resposta a cada tentativa.


Quando algo dá errado

Sintoma Causa provável Correção
Token recusado em site Enterprise Falta o enterprise=1 Confirme o enterprise.js e adicione a flag
Pontuação baixa só no Enterprise action incorreto Extraia a ação de grecaptcha.enterprise.execute()
Funciona em teste, falha em produção A aprendizagem adaptativa reconheceu seu padrão Varie o ritmo das requisições e revise o egress autorizado
ERROR_WRONG_GOOGLEKEY Sitekey lida de data-sitekey Procure render=KEY na URL do script

Se o token chega correto pela API mas o navegador reprova, o problema está no ambiente, não na resolução.

Um lembrete de escopo: tudo acima pressupõe automação autorizada — QA de formulários que você mantém, testes em staging, monitoramento autorizado. Ao registrar pontuações e respostas, considere o que a LGPD (ou o RGPD, em Portugal) exige sobre o que fica nos logs.


Perguntas frequentes

Preciso de código diferente para cada versão?

Não. O mesmo method=userrecaptcha com version=v3 atende às duas; o Enterprise só acrescenta enterprise=1. O que muda é a detecção, que roda a cada execução.

Como sei se o site migrou para o Enterprise sem avisar?

Pelo script da página: enterprise.js no lugar de api.js. Registre isso em log a cada execução — a migração aparece no monitoramento em vez de virar falha silenciosa.

A CaptchaAI cobra mais caro para resolver o Enterprise?

Não há cobrança por tipo de CAPTCHA. Os planos são por thread simultânea, com resoluções ilimitadas: de BASIC (US$ 15/mês, 5 threads) a VIP-3 (US$ 7.500/mês, 5.000 threads). Cada envio consome uma thread.

O que faço quando a pontuação cai depois da migração?

Comece pelo action: cada ação tem seu limite no Enterprise, e um verify genérico onde o site espera login derruba o resultado. Depois revise o intervalo entre requisições e o sinal de navegador.

Quais outros tipos de CAPTCHA a CaptchaAI atende?

Não há suporte a hCaptcha nem a FunCaptcha (Arkose Labs). Os tipos disponíveis incluem reCAPTCHA v2 e v3, Cloudflare Turnstile e Challenge, GeeTest v3 e CAPTCHAs de imagem/OCR e grade, além de CaptchaFox (beta), Friendly Captcha (beta) e Lemin (beta). O GeeTest v4 é "em breve".


Guias relacionados

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