Ambas versiones presentan la misma casilla de verificación "No soy un robot" y desafíos de cuadrícula de imágenes. La diferencia está en el backend: Enterprise agrega códigos de motivo, reglas personalizadas e integración con Google Cloud. Para resolverlo, el único cambio es agregar enterprise=1 a su solicitud CaptchaAI, pero detectar qué versión usa un sitio es la parte en la que los desarrolladores se equivocan con mayor frecuencia.
Comparación de características
| Característica | Estándar v2 | Empresa v2 |
|---|---|---|
| Widget de casilla de verificación | Sí, apariencia idéntica | Sí, apariencia idéntica |
| Desafíos de imagen | Cuadrículas de 3×3 o 4×4 | Cuadrículas de 3×3 o 4×4 |
| archivo js | api.js |
enterprise.js |
| Ejecutar función | grecaptcha.execute() |
grecaptcha.enterprise.execute() |
| API de verificación | siteverify (gratis) |
recaptchaenterprise.googleapis.com (pagado) |
| Códigos de motivo | No | Sí (AUTOMATIZACIÓN, DEMASIADO_TRÁFICO, etc.) |
| Reglas personalizadas | No | Sí (umbrales por acción) |
| Consola de la nube de Google | No | Sí (gestión basada en proyectos) |
| Detección de fuga de contraseña | No | si |
| Formato de token | Misma estructura | Misma estructura |
| Parámetro CaptchaAI | — | enterprise=1 |
| Tiempo típico de resolución | 10-30 segundos | 10-30 segundos |
Cómo detectar Enterprise v2
La diferencia clave es qué archivo JavaScript carga la página:
Comprueba la etiqueta del 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>
Detección 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)
Detección automática (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;
}
Comprobación de la consola del 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");
}
Resolviendo con CaptchaAI
Estándar 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 automáticamente
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]}...")
Errores comunes
| error | que pasa | Solución |
|---|---|---|
Usando enterprise=1 en el estándar v2 |
Puede devolver tokens no válidos | Verifique enterprise.js antes de agregar la bandera |
Omitir enterprise=1 en Enterprise v2 |
El token puede ser rechazado por el backend del sitio | Agregue siempre enterprise=1 cuando enterprise.js esté presente |
| Usando una clave de sitio incorrecta | ERROR_WRONG_GOOGLEKEY |
Extracto de data-sitekey sobre el elemento .g-recaptcha |
| Confundir v2 Enterprise con v3 Enterprise | Parámetros de resolución incorrectos | v2 tiene casilla de verificación; v3 es invisible con puntuación |
Inyección de tokens: lo mismo 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);
Preguntas frecuentes
¿Es Enterprise v2 más difícil de resolver?
No. La mecánica del desafío es idéntica: la misma casilla de verificación, las mismas cuadrículas de imágenes. Enterprise agrega análisis de backend (códigos de motivo, umbrales personalizados) pero no cambia la dificultad del desafío para el solucionador.
¿Puedo usar el mismo código para ambas versiones?
Casi. La única diferencia de parámetro es enterprise=1. Utilice el enfoque de detección automática anterior para crear una base de código que maneje ambos. La detección, el sondeo y la inyección de tokens son idénticos.
¿Necesito manejar códigos de motivo de Enterprise?
No. Google devuelve los códigos de motivo al servidor del sitio web durante la verificación. Son invisibles para el solucionador CAPTCHA. Su integración CaptchaAI no necesita ningún cambio en los códigos de motivo.
¿Cuesta más resolver Enterprise v2?
Consulte la página de precios actual de CaptchaAI. Las soluciones empresariales pueden tener precios diferentes, pero el esfuerzo de integración de API es el mismo.
¿Cómo sé si la detección funcionó correctamente?
Si envía enterprise=1 para un sitio estándar, la resolución puede tener éxito, pero el sitio de destino puede rechazar el token. Si lo omite para un sitio empresarial, puede suceder lo mismo. Verifique siempre verificando primero la URL del script.
Guías relacionadas
- reCAPTCHA Enterprise vs Standard: guía completa— comparación completa entre todas las versiones
- Cómo resolver reCAPTCHA v2 usando API— tutorial estándar v2
- Cómo resolver reCAPTCHA v2 Enterprise usando API— tutorial empresarial v2
- Cómo identificar la implementación empresarial de reCAPTCHA— inmersión profunda de detección
- Cómo identificar la implementación empresarial de reCAPTCHA