Comparativas

Diferencias entre el solucionador reCAPTCHA v2 estándar y empresarial

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

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