Comparativas

Guía de resolución de reCAPTCHA v3 estándar vs empresarial

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

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

Los comentarios están deshabilitados para este artículo.