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
- reCAPTCHA Enterprise vs Standard – Guia completo— comparação completa entre todas as versões
- Como resolver reCAPTCHA v2 usando API— tutorial v2 padrão
- Como resolver reCAPTCHA v2 Enterprise usando API— tutorial empresarial v2
- Como identificar a implementação empresarial do reCAPTCHA- detecção de mergulho profundo
- Como identificar a implementação empresarial do reCAPTCHA