Comparações

Diferenças entre o solucionador reCAPTCHA v2 padrão e empresarial

Ambas as versões apresentam a mesma caixa de seleção “Não sou um robô” e desafios de grade de imagem. A diferença está no back-end: o Enterprise adiciona códigos de motivo, regras personalizadas e integração com o Google Cloud. Para resolver, a única mudança é adicionar enterprise=1 à sua solicitação CaptchaAI – mas detectar qual versão um site usa é a parte que os desenvolvedores erram com mais frequência.


Comparação de recursos

Recurso Padrão v2 Empresa v2
Widget de caixa de seleção Sim – aparência idêntica Sim – aparência idêntica
Desafios de imagem Grades 3×3 ou 4×4 Grades 3×3 ou 4×4
Arquivo JS api.js enterprise.js
Executar função grecaptcha.execute() grecaptcha.enterprise.execute()
API de verificação siteverify (grátis) recaptchaenterprise.googleapis.com (pago)
Códigos de motivo Não Sim (AUTOMAÇÃO, TOO_MUCH_TRAFFIC, etc.)
Regras personalizadas Não Sim (limites por ação)
Console do Google Cloud Não Sim (gerenciamento baseado em projetos)
Detecção de vazamento de senha Não Sim
Formato de token Mesma estrutura Mesma estrutura
Parâmetro CaptchaAI - enterprise=1
Tempo de resolução típico 10-30 segundos 10-30 segundos

Como detectar o Enterprise v2

A principal diferença é qual arquivo JavaScript a página carrega:

Verifique a tag do script:

<!-- Standard v2 -->
<script src="https://www.google.com/recaptcha/api.js"></script>

<!-- Enterprise v2 -->
<script src="https://www.google.com/recaptcha/enterprise.js"></script>

Detecção automatizada (Python):

import requests
from bs4 import BeautifulSoup

def detect_recaptcha_version(url):
    resp = requests.get(url)
    soup = BeautifulSoup(resp.text, "html.parser")

    enterprise_script = soup.find("script", src=lambda s: s and "enterprise.js" in s)
    standard_script = soup.find("script", src=lambda s: s and "recaptcha/api.js" in s)

    widget = soup.find(class_="g-recaptcha")
    sitekey = widget["data-sitekey"] if widget else None

    if enterprise_script:
        return {"version": "enterprise_v2", "sitekey": sitekey}
    elif standard_script:
        return {"version": "standard_v2", "sitekey": sitekey}
    return None

info = detect_recaptcha_version("https://staging.example.com/qa-login")
print(info)

Detecção automatizada (Node.js):

const axios = require("axios");
const cheerio = require("cheerio");

async function detectRecaptchaVersion(url) {
  const { data } = await axios.get(url);
  const $ = cheerio.load(data);

  const hasEnterprise = $('script[src*="enterprise.js"]').length > 0;
  const hasStandard = $('script[src*="recaptcha/api.js"]').length > 0;
  const sitekey = $(".g-recaptcha").attr("data-sitekey");

  if (hasEnterprise) return { version: "enterprise_v2", sitekey };
  if (hasStandard) return { version: "standard_v2", sitekey };
  return null;
}

Verificação do console do navegador:

// Quick check in DevTools
if (document.querySelector('script[src*="enterprise.js"]')) {
  console.log("Enterprise v2");
} else if (document.querySelector('script[src*="recaptcha/api.js"]')) {
  console.log("Standard v2");
}

Resolvendo com CaptchaAI

Padrão v2

import requests
import time

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

# Poll for token
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

Empresa v2

import requests
import time

# Submit task — only difference is enterprise=1
resp = requests.get("https://ocr.captchaai.com/in.php", params={
    "key": "YOUR_API_KEY",
    "method": "userrecaptcha",
    "googlekey": sitekey,
    "pageurl": page_url,
    "enterprise": 1  # Required for Enterprise
})
task_id = resp.text.split("|")[1]

# Polling is identical
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

Solucionador universal que detecta automaticamente

import requests
import time
from bs4 import BeautifulSoup

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

    def detect_and_solve(self, page_url, page_html=None):
        if not page_html:
            page_html = requests.get(page_url).text

        soup = BeautifulSoup(page_html, "html.parser")
        is_enterprise = bool(soup.find("script", src=lambda s: s and "enterprise.js" in s))
        widget = soup.find(class_="g-recaptcha")
        sitekey = widget["data-sitekey"] if widget else None

        if not sitekey:
            raise Exception("No reCAPTCHA sitekey found on page")

        params = {
            "key": self.api_key,
            "method": "userrecaptcha",
            "googlekey": sitekey,
            "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 {
                    "token": result.text.split("|")[1],
                    "is_enterprise": is_enterprise,
                    "sitekey": sitekey
                }
            if result.text != "CAPCHA_NOT_READY":
                raise Exception(f"Solve failed: {result.text}")

        raise Exception("Solve timed out")


solver = RecaptchaV2Solver("YOUR_API_KEY")
result = solver.detect_and_solve("https://staging.example.com/qa-login")
print(f"Enterprise: {result['is_enterprise']}, Token: {result['token'][:40]}...")

Erros comuns

Erro O que acontece Correção
Usando enterprise=1 no padrão v2 Pode retornar tokens inválidos Verifique enterprise.js antes de adicionar o sinalizador
Omitindo enterprise=1 no Enterprise v2 O token pode ser rejeitado pelo back-end do site Sempre adicione enterprise=1 quando enterprise.js estiver presente
Usando sitekey errado ERROR_WRONG_GOOGLEKEY Extrair de data-sitekey no elemento .g-recaptcha
Confundindo v2 Enterprise com v3 Enterprise Parâmetros de resolução errados v2 possui caixa de seleção; v3 é invisível com pontuação

envio controlado ao endpoint QA – igual para ambos

# Selenium injection — works for both standard and enterprise
driver.execute_script(
    f'document.getElementById("g-recaptcha-response").value = "{token}";'
)

# If the page uses a callback function
callback = driver.find_element("css selector", ".g-recaptcha").get_attribute("data-callback")
if callback:
    driver.execute_script(f'{callback}("{token}");')
// Puppeteer injection — works for both
await page.evaluate((token) => {
  document.getElementById("g-recaptcha-response").value = token;
  // Find and call callback if present
  const widget = document.querySelector(".g-recaptcha");
  const cb = widget?.getAttribute("data-callback");
  if (cb && typeof window[cb] === "function") {
    window[cb](token);
  }
}, token);

Perguntas frequentes

O Enterprise v2 é mais difícil de resolver?

Não. A mecânica do desafio é idêntica – mesma caixa de seleção, mesmas grades de imagem. A empresa adiciona análises de back-end (códigos de motivo, limites personalizados), mas não altera a dificuldade do desafio para o solucionador.

Posso usar o mesmo código para ambas as versões?

Quase. A única diferença de parâmetro é enterprise=1. Use a abordagem de detecção automática acima para construir uma base de código que lide com ambos. Detecção, pesquisa e envio controlado ao endpoint QA são idênticas.

Preciso lidar com códigos de motivo corporativos?

Não. Os códigos de motivo são retornados pelo Google ao back-end do site durante a verificação. Eles são invisíveis para o solucionador CAPTCHA. Sua integração CaptchaAI não precisa de nenhuma alteração nos códigos de motivo.

O Enterprise v2 custa mais para resolver?

Verifique a página de preços atual do CaptchaAI. As soluções empresariais podem ter preços diferentes, mas o esforço de integração da API é o mesmo.

Como posso saber se a detecção funcionou corretamente?

Se você enviar enterprise=1 para um site padrão, a solução poderá ser bem-sucedida, mas o token poderá ser rejeitado pelo site de destino. Se você omitir isso para um site corporativo, o mesmo pode acontecer. Sempre verifique primeiro o URL do script.


Guias relacionados

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