Solución de Problemas

Caídas en la tasa de resolución de CAPTCHA: diagnóstico de regresión del rendimiento

Cuando la tasa de resolución se desploma, el instinto es abrir un ticket. Pero casi toda caída se explica por una de cuatro capas —tu código, el sitio de destino, el proxy o el servicio de CaptchaAI— y puedes aislar cuál con un árbol de decisión y un script, antes de escalar.

El árbol de decisión en 30 segundos

Solve rate dropped
├── Is the API returning errors? → Check error codes
│   ├── ERROR_WRONG_USER_KEY → API key issue
│   ├── ERROR_ZERO_BALANCE → Balance depleted
│   ├── ERROR_NO_SLOT_AVAILABLE → Rate limiting
│   └── ERROR_CAPTCHA_UNSOLVABLE → CAPTCHA changed
├── Are tokens returned but rejected by the target site?
│   ├── Token expired before submission → Speed up injection
│   ├── Sitekey changed → Re-extract from page
│   └── Domain mismatch → Check pageurl parameter
├── Are proxies failing?
│   ├── Proxy banned by target → Rotate proxies
│   └── Proxy timeout → Check proxy health
└── Did the target site change?
    ├── New CAPTCHA type → Update method parameter
    ├── JavaScript changes → Re-analyze page
    └── Rate limiting by site → Reduce frequency

Un caso típico: un equipo que monitorea un portal de cita previa —trámite que en España, México o Argentina genera colas— ve caer su tasa del 92 % al 40 % un lunes. El árbol lo aísla en orden.

Capa 1 · Empieza por los datos, no por las hipótesis

Antes de teorizar, mide. Este script revisa tu saldo y lanza resoluciones de prueba para recoger la distribución real de errores:

# diagnose_solve_rate.py
import os
import requests
from collections import Counter

API_KEY = os.environ.get("CAPTCHAAI_KEY", "YOUR_API_KEY")

def check_balance():
    """Verify API key and balance."""
    resp = requests.get("https://ocr.captchaai.com/res.php", params={
        "key": API_KEY, "action": "getbalance", "json": "1",
    })
    result = resp.json()
    print(f"Balance: {result}")
    return result

def test_solve(sitekey, pageurl, runs=5):
    """Run test solves and collect error statistics."""
    errors = Counter()
    successes = 0

    for i in range(runs):
        # Submit
        resp = requests.get("https://ocr.captchaai.com/in.php", params={
            "key": API_KEY,
            "method": "userrecaptcha",
            "googlekey": sitekey,
            "pageurl": pageurl,
            "json": "1",
        })
        result = resp.json()

        if result.get("status") != 1:
            errors[result.get("request", "UNKNOWN")] += 1
            print(f"  Run {i+1}: Submit error: {result.get('request')}")
            continue

        task_id = result["request"]
        import time
        time.sleep(15)

        # Poll
        for _ in range(25):
            poll = requests.get("https://ocr.captchaai.com/res.php", params={
                "key": API_KEY, "action": "get",
                "id": task_id, "json": "1",
            })
            poll_result = poll.json()

            if poll_result.get("status") == 1:
                successes += 1
                print(f"  Run {i+1}: Solved")
                break
            if poll_result.get("request") != "CAPCHA_NOT_READY":
                errors[poll_result.get("request", "UNKNOWN")] += 1
                print(f"  Run {i+1}: Error: {poll_result.get('request')}")
                break
            time.sleep(5)
        else:
            errors["TIMEOUT"] += 1
            print(f"  Run {i+1}: Timeout")

    print(f"\nResults: {successes}/{runs} solved")
    if errors:
        print(f"Errors: {dict(errors)}")

# Run diagnostics
print("=== Balance Check ===")
check_balance()

print("\n=== Test Solves ===")
test_solve("YOUR_SITEKEY", "https://your-staging.example.com", runs=5)

Lee la distribución de errores

El código que más se repite suele apuntar a la causa raíz; crúzalo con esta tabla:

Error Significado Acción
ERROR_CAPTCHA_UNSOLVABLE CAPTCHA demasiado complejo o modificado Repórtalo a CaptchaAI y confirma que el sitekey es correcto
ERROR_WRONG_CAPTCHA_ID Estás consultando un ID de tarea equivocado Corrige el seguimiento del ID de tarea en tu código
ERROR_ZERO_BALANCE Sin saldo Recarga tu saldo
ERROR_NO_SLOT_AVAILABLE Límite de solicitudes alcanzado Reduce la concurrencia o añade un retraso
CAPCHA_NOT_READY (tiempo de espera agotado) La resolución tarda demasiado Aumenta el tiempo de espera del sondeo y valida el sitekey

Si casi todo falla con ERROR_WRONG_USER_KEY, la clave API ya no es válida: corrígela antes de seguir.

Capa 2 · El sitio de destino cambió sin avisar

La causa número uno de una caída repentina no es tu código, sino el sitio, que se actualiza y deja tus parámetros obsoletos.

¿Cambió el sitekey?

Abre la página, entra en DevTools (F12) y busca:

  • reCAPTCHA: el atributo data-sitekey o la llamada grecaptcha.render.
  • Cloudflare Turnstile: el atributo data-sitekey dentro del widget de Turnstile.
  • GeeTest: el parámetro gt en la inicialización de GeeTest.

Si cambió, vuelve a alinearlo:

  1. Copia el data-sitekey actual desde el DOM.
  2. Sustitúyelo en tu configuración.
  3. Redespliega y lanza una resolución de prueba.

Un solo carácter distinto hace fallar todo; compara la cadena completa.

¿Cambió el tipo de CAPTCHA?

Algunos sitios migran de proveedor y dejan tu parámetro method obsoleto:

  • reCAPTCHA v2 → reCAPTCHA v3 (invisible)
  • reCAPTCHA → Cloudflare Turnstile
  • Image CAPTCHA → reCAPTCHA Enterprise

Si cambió, actualiza el parámetro method para que coincida.

¿Caducó el token antes de llegar al formulario?

Los tokens tienen validez limitada; un pipeline lento los deja caducar antes de inyectarlos:

Tipo de CAPTCHA Vida útil del token
reCAPTCHA v2 ~120 segundos
reCAPTCHA v3 ~120 segundos
Cloudflare Turnstile ~300 segundos
GeeTest v3 ~60 segundos

Mide el tiempo entre getTaskResult y el envío. Si supera los 60 segundos, el sitio rechazará un token que CaptchaAI ya resolvió bien; la fuga está ahí.

Capa 3 · El proxy y la reputación de la IP de salida

La calidad del proxy afecta directamente a la tasa en los CAPTCHA basados en token, donde CaptchaAI resuelve a través de tu salida de red:

Problema del proxy Síntoma Solución
Proxy bloqueado por el sitio de destino El token se resuelve pero el sitio lo rechaza Rota a nuevas IPs de salida autorizadas
El proxy devuelve errores ERROR_PROXY_NOT_FOUND Verifica que el proxy esté activo y accesible
Se detecta una salida de centro de datos Tasa de resolución más baja Cambia a una salida residencial de confianza
El país del proxy no coincide Resultados inconsistentes Haz coincidir el país del proxy con el del sitio de destino

Prueba primero sin proxy (si el tipo lo admite): si la tasa se recupera, ya sabes qué capa falla.

Capa 4 · ¿El fallo está en el servicio?

Solo llegas aquí con las tres capas anteriores limpias. Antes de escalar, contrasta con datos y prepara el informe.

Compara contra tu línea base

Sin línea base previa, "bajó mucho" es una sensación, no un dato:

Métrica Línea base Actual Delta ¿Preocupa?
Tasa de resolución 95 % ? caída > 5 % = investiga
Tiempo medio de resolución 15 s ? aumento > 50 % = investiga
Tasa de error 2 % ? > 5 % = investiga
Aceptación de tokens 98 % ? caída > 3 % = cambió el sitio

Cuándo escalar al soporte de CaptchaAI

Contacta con el soporte solo cuando el diagnóstico ya descartó lo evidente:

  • Todos los pasos pasan, pero la tasa sigue baja.
  • La tasa de ERROR_CAPTCHA_UNSOLVABLE supera el 20 % en sitekeys que antes funcionaban.
  • El saldo aparece correcto, pero las resoluciones siguen fallando.
  • El problema persiste durante más de 2 horas.

Adjunta en tu reporte:

  1. Tipo de CAPTCHA y sitekey.
  2. URL del sitio de destino.
  3. Distribución de errores (del script de diagnóstico).
  4. Cuándo empezó el problema.
  5. Cambios recientes en tu código.

Tabla de referencia rápida

Si no tienes tiempo para el árbol, arranca por el síntoma:

Escenario Causa más probable Primera acción
Todos los intentos fallan con ERROR_WRONG_USER_KEY Clave API no válida Vuelve a verificar tu clave API
Descenso gradual a lo largo de varios días Degradación del proxy Rota los proxies
Caída repentina al 0 % Cambió el sitekey o la página Vuelve a extraer los parámetros del CAPTCHA
Se resuelve pero el sitio rechaza los tokens Caducidad del token o dominio incorrecto Revisa el tiempo y el parámetro pageurl
Funciona en staging pero falla en el objetivo Restricciones específicas del sitio Compara los parámetros entre ambos entornos

Preguntas frecuentes

Las dudas más frecuentes cuando la tasa cae:

¿Cómo sé si la caída es culpa de mi código o del sitio de destino?

Aísla la variable: ejecuta el script contra un staging propio. Si la tasa se mantiene ahí y solo cae contra el objetivo, el cambio está en el sitio; si falla en ambos, es tu código.

¿Subir de plan y sumar más threads mejora mi tasa de resolución?

No. Los planes de CaptchaAI (desde BASIC a $15/mes con 5 threads hasta VIP-3 a $7,500/mes con 5.000 threads) escalan la concurrencia, no la precisión: más threads resuelven más CAPTCHA en paralelo, pero no cambian la tasa de acierto de un sitekey. Si la tasa cayó, es diagnóstico, no capacidad.

¿La calidad del proxy afecta de verdad a la resolución de tokens?

Sí. En los CAPTCHA basados en token, el sitio evalúa la reputación de la IP de salida: un proxy quemado o de centro de datos hace que el token se resuelva pero el sitio lo rechace, lo que se lee como una caída aunque CaptchaAI funcione bien.

¿Cada cuánto debería medir una línea base de referencia?

Mide una línea base una vez al mes y tras cada cambio. Así la próxima caída se compara con un número real, no con tu memoria.

Artículos relacionados


Mantén tu pipeline de CAPTCHA saludable: obtén tu API key de CaptchaAI.

Guías relacionadas:

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