Ambas versiones se ejecutan de forma invisible y devuelven una puntuación de riesgo (0,0 a 1,0). Enterprise agrega códigos de motivo, umbrales adaptativos y gestión de proyectos de Google Cloud, pero desde la perspectiva de resolución de CaptchaAI, la única diferencia de parámetros es enterprise=1. El desafío es detectar qué versión utiliza un sitio, ya que ambas son invisibles.
Comparación de características
| Característica | Estándar v3 | Empresa v3 |
|---|---|---|
| operación invisible | si | si |
| Puntuación (0,0–1,0) | si | si |
| Parámetro de acción | Requerido | Requerido |
| archivo js | api.js?render=KEY |
enterprise.js?render=KEY |
| Ejecutar función | grecaptcha.execute() |
grecaptcha.enterprise.execute() |
| Códigos de motivo | No | Sí (AUTOMATIZACIÓN, DEMASIADO_TRÁFICO, etc.) |
| Umbrales personalizados por acción | No | Sí (a través de la consola en la nube) |
| Detección de fuga de contraseña | No | si |
| Defensor de cuenta | No | si |
| Punto final de verificación | siteverify (gratis) |
recaptchaenterprise.googleapis.com (pagado) |
| Parámetros CaptchaAI | version=v3 |
version=v3 + enterprise=1 |
| Tiempo típico de resolución | 10-20 segundos | 10-20 segundos |
Cómo detectar qué versión usa un sitio
Dado que ambas versiones son invisibles (no hay ningún widget visible), la detección debe depender de JavaScript:
Detección de Python:
import requests
import re
def detect_v3_type(url):
resp = requests.get(url)
html = resp.text
# Check for enterprise.js
if "enterprise.js" in html:
version = "enterprise_v3"
execute_fn = "grecaptcha.enterprise.execute"
elif "recaptcha/api.js" in html and "render=" in html:
version = "standard_v3"
execute_fn = "grecaptcha.execute"
else:
return None
# Extract sitekey from render parameter
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 parameter
action_match = re.search(r'action["\']?\s*[:=]\s*["\'](\w+)', html)
action = action_match.group(1) if action_match else "unknown"
return {
"version": version,
"sitekey": sitekey,
"action": action,
"execute_fn": execute_fn
}
info = detect_v3_type("https://staging.example.com/qa-login")
print(info)
Detección de Node.js:
const axios = require("axios");
async function detectV3Type(url) {
const { data: html } = await axios.get(url);
let version, executeFn;
if (html.includes("enterprise.js")) {
version = "enterprise_v3";
executeFn = "grecaptcha.enterprise.execute";
} else if (html.includes("recaptcha/api.js") && html.includes("render=")) {
version = "standard_v3";
executeFn = "grecaptcha.execute";
} else {
return 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] || null,
action: actionMatch?.[1] || "unknown",
executeFn,
};
}
Comprobación rápida de la consola del navegador:
// Paste in DevTools console
if (document.querySelector('script[src*="enterprise.js"]')) {
console.log("Enterprise v3");
console.log("Execute:", typeof grecaptcha?.enterprise?.execute);
} else if (document.querySelector('script[src*="api.js"][src*="render="]')) {
console.log("Standard v3");
console.log("Execute:", typeof grecaptcha?.execute);
}
Resolviendo con CaptchaAI
Estándar v3
import requests
import time
# Submit
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]
# Poll
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 v3
import requests
import time
# Submit — add enterprise=1
resp = requests.get("https://ocr.captchaai.com/in.php", params={
"key": "YOUR_API_KEY",
"method": "userrecaptcha",
"version": "v3",
"enterprise": 1, # Required for Enterprise
"googlekey": sitekey,
"action": "login",
"pageurl": page_url
})
task_id = resp.text.split("|")[1]
# Polling is identical to standard
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 con detección automática
import requests
import time
import re
class RecaptchaV3Solver:
def __init__(self, api_key):
self.api_key = api_key
def detect_and_solve(self, page_url, action=None):
"""Auto-detect standard vs enterprise and solve."""
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")
sitekey = key_match.group(1)
if not action:
action_match = re.search(r'action["\']?\s*[:=]\s*["\'](\w+)', html)
action = action_match.group(1) if action_match else "verify"
params = {
"key": self.api_key,
"method": "userrecaptcha",
"version": "v3",
"googlekey": sitekey,
"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 failed: {result.text}")
raise Exception("Timed out")
solver = RecaptchaV3Solver("YOUR_API_KEY")
token = solver.detect_and_solve("https://staging.example.com/qa-login", action="login")
print(f"Token: {token[:40]}...")
Errores comunes
| error | Resultado | Solución |
|---|---|---|
Usando enterprise=1 en el estándar v3 |
El token puede no ser válido | Verifique enterprise.js antes de agregar la bandera |
Omitir enterprise=1 en Enterprise v3 |
Token rechazado por el backend | Agregar siempre cuando enterprise.js esté presente |
Parámetro action incorrecto |
Puntuación baja, ficha rechazada | Extraiga la cadena de acción exacta de la página JavaScript |
Omitiendo version=v3 |
Solver lo trata como v2 | Incluya siempre version=v3 para reCAPTCHA basado en puntuaciones |
| Usando v2 sitekey para resolver v3 | ERROR_WRONG_GOOGLEKEY |
Las claves de sitio v3 provienen del parámetro render=KEY |
Extrayendo el parámetro de acción
El parámetro action es fundamental para la versión 3, tanto estándar como empresarial. Si envía la acción incorrecta, la puntuación será baja y el token podrá ser rechazado.
import re
def find_v3_actions(html):
"""Extract all action parameters from page JavaScript."""
# Look for grecaptcha.execute(key, {action: '...'})
pattern = r"(?:grecaptcha\.(?:enterprise\.)?execute|action)\s*[(:]\s*['\"](\w+)"
actions = re.findall(pattern, html)
return list(set(actions))
# Common actions: "login", "submit", "register", "checkout", "homepage"
Inyección de tokens
Mismo enfoque para ambas versiones:
# For browser-based workflows (Selenium)
driver.execute_script(
f'document.getElementById("g-recaptcha-response").value = "{token}";'
)
# For pure HTTP workflows
requests.post(page_url, data={
"g-recaptcha-response": token,
"username": "user",
"password": "pass"
})
// Puppeteer
await page.evaluate((tok) => {
document.getElementById("g-recaptcha-response").value = tok;
}, token);
// Pure HTTP (axios)
await axios.post(pageUrl, new URLSearchParams({
"g-recaptcha-response": token,
username: "user",
password: "pass",
}));
Preguntas frecuentes
¿Enterprise v3 otorga puntuaciones diferentes?
El modelo de puntuación es similar, pero Enterprise puede utilizar señales adicionales y umbrales personalizados. CaptchaAI maneja ambos de manera idéntica: el token devuelto funciona independientemente del modelo que utilice Google.
¿Cómo detecto Enterprise v3 en una página?
Busque enterprise.js en lugar de api.js en la etiqueta del script y grecaptcha.enterprise.execute() en JavaScript. Ambos son invisibles, por lo que no hay diferencia visual.
¿Es más caro resolver Enterprise v3?
Consulte el precio actual de CaptchaAI. Las soluciones empresariales pueden tener precios diferentes, pero el esfuerzo de integración de API es idéntico al estándar.
¿Qué pasa si no puedo encontrar el parámetro de acción?
Pruebe valores comunes: "verify", "submit", "homepage", "login". Si el token aún se rechaza, use DevTools del navegador para buscar execute( en los scripts de la página y encontrar la cadena de acción exacta.
¿Puede un sitio cambiar entre estándar y empresarial sin previo aviso?
Sí. Los sitios pueden migrar a Enterprise en cualquier momento. Cree su detección para que se ejecute en cada carga de página en lugar de codificar la versión.
Guías relacionadas
- reCAPTCHA v3 Enterprise frente a Estándar— ángulo de comparación alternativo
- reCAPTCHA Enterprise vs Standard: guía completa— cubre todas las versiones
- Cómo resolver reCAPTCHA v3 usando API— tutorial estándar v3
- Cómo resolver reCAPTCHA v3 Enterprise usando API— tutorial empresarial v3
- Parámetro de acción reCAPTCHA v3 explicado— análisis profundo del parámetro de acción
Preguntas frecuentes
¿Usar el indicador empresarial incorrecto provocará fallas?
Muchas veces sí. Los sitios que utilizan tokens Enterprise verifican con la API Enterprise, que espera tokens Enterprise. Los tokens estándar pueden no pasar la verificación y viceversa.
¿Cómo detecto Enterprise v3 mediante programación?
Busque en la fuente de la página enterprise.js:
page_source = driver.page_source
is_enterprise = "enterprise.js" in page_source
¿Hay alguna diferencia de rendimiento?
No. El tiempo de resolución y las tasas de éxito son similares para ambas versiones.
Guías relacionadas
- reCAPTCHA v3 Enterprise frente a Estándar
- reCAPTCHA Enterprise vs Standard: guía completa
- Cómo resolver reCAPTCHA v3 Enterprise usando API