Solución de Problemas

CAPTCHA resuelve la caída de la tasa de éxito: diagrama de flujo de diagnóstico

Cuando tu tasa de resolución baje, no adivines: sigue este diagnóstico sistemático para encontrar y solucionar la causa raíz.


Diagrama de flujo de diagnóstico

Success rate dropped
│
├── Are tokens being generated?
│   ├── NO → Check API errors
│   │   ├── ERROR_WRONG_GOOGLEKEY → Sitekey changed. Re-extract.
│   │   ├── ERROR_BAD_PARAMETERS → Check required params
│   │   ├── ERROR_NO_SLOT → Retry with backoff
│   │   └── Other errors → See error decision tree
│   │
│   └── YES → Tokens generated but rejected by target site
│       │
│       ├── Token expired before use?
│       │   └── YES → Submit token faster (< 60-120s)
│       │
│       ├── Token used for wrong domain?
│       │   └── YES → Check pageurl matches submission domain
│       │
│       ├── reCAPTCHA v3 score too low?
│       │   └── YES → Check action parameter, try min_score
│       │
│       ├── Site changed CAPTCHA type?
│       │   └── YES → Re-detect CAPTCHA type
│       │
│       └── Site added additional checks?
│           └── YES → Check for fingerprinting, cookies, headers

Paso 1: Mida su tarifa actual

import requests
import time
from collections import defaultdict


class SuccessTracker:
    """Track solve success rates over time."""

    def __init__(self):
        self.stats = defaultdict(lambda: {"attempts": 0, "success": 0, "errors": defaultdict(int)})

    def record(self, method, success, error_code=None):
        self.stats[method]["attempts"] += 1
        if success:
            self.stats[method]["success"] += 1
        elif error_code:
            self.stats[method]["errors"][error_code] += 1

    def report(self):
        for method, data in self.stats.items():
            rate = data["success"] / data["attempts"] * 100 if data["attempts"] > 0 else 0
            print(f"\n{method}:")
            print(f"  Attempts: {data['attempts']}")
            print(f"  Success: {data['success']} ({rate:.1f}%)")
            if data["errors"]:
                print("  Errors:")
                for err, count in sorted(data["errors"].items(), key=lambda x: -x[1]):
                    print(f"    {err}: {count}")


tracker = SuccessTracker()

Paso 2: identificar la categoría del problema

Categoría A: Fallos a nivel de API

La API CaptchaAI devuelve un error en lugar de un token.

def diagnose_api_failures(api_key, method, params, attempts=10):
    """Run test solves and collect error patterns."""
    errors = defaultdict(int)
    successes = 0

    for i in range(attempts):
        try:
            resp = requests.post("https://ocr.captchaai.com/in.php", data={
                "key": api_key, "method": method, "json": 1, **params,
            }, timeout=30)
            result = resp.json()

            if result.get("status") != 1:
                errors[result.get("request", "UNKNOWN")] += 1
                continue

            task_id = result["request"]
            # Quick poll
            time.sleep(15)
            resp = requests.get("https://ocr.captchaai.com/res.php", params={
                "key": api_key, "action": "get",
                "id": task_id, "json": 1,
            }, timeout=15)
            data = resp.json()

            if data.get("status") == 1:
                successes += 1
            else:
                errors[data.get("request", "POLL_ERROR")] += 1

        except Exception as e:
            errors[f"EXCEPTION:{type(e).__name__}"] += 1

        time.sleep(2)

    print(f"\nResults: {successes}/{attempts} success")
    for err, count in sorted(errors.items(), key=lambda x: -x[1]):
        print(f"  {err}: {count}")

Categoría B: Rechazo de token

CaptchaAI devuelve un token válido, pero el sitio de destino lo rechaza.

Causas comunes:

causa comprobar
El token expiró Usando token > 120s después de la generación
El dominio no coincide pageurl no coincide con el dominio de envío
puntuación v3 demasiado baja El sitio requiere 0.7+ pero el solucionador obtiene 0.3
Acción faltante v3 requiere un parámetro de acción coincidente
Parámetros modificados del sitio La clave del sitio o la estructura de la página cambiaron

Paso 3: solucionar problemas comunes

Solución: vencimiento del token

def solve_and_use_immediately(api_key, sitekey, pageurl):
    """Solve and use token as fast as possible."""
    # Submit
    resp = requests.post("https://ocr.captchaai.com/in.php", data={
        "key": api_key,
        "method": "userrecaptcha",
        "googlekey": sitekey,
        "pageurl": pageurl,
        "json": 1,
    }, timeout=30)
    task_id = resp.json()["request"]

    # Poll aggressively
    for _ in range(24):
        time.sleep(5)
        resp = requests.get("https://ocr.captchaai.com/res.php", params={
            "key": api_key, "action": "get",
            "id": task_id, "json": 1,
        }, timeout=15)
        data = resp.json()
        if data.get("status") == 1:
            token = data["request"]
            # USE IMMEDIATELY — don't store for later
            submit_form(token)
            return True

    return False

Solución: clave de sitio obsoleta

def solve_with_fresh_params(api_key, pageurl):
    """Re-extract sitekey before each solve."""
    import re

    resp = requests.get(pageurl, timeout=15)
    match = re.search(r'data-sitekey="([^"]+)"', resp.text)
    if not match:
        raise RuntimeError("Could not find sitekey")

    sitekey = match.group(1)
    # Now solve with fresh sitekey
    # ...

Solución: parámetro de acción v3

# Check what action the site uses
# Look for: grecaptcha.execute('sitekey', {action: 'submit'})

data = {
    "key": api_key,
    "method": "userrecaptcha",
    "googlekey": sitekey,
    "pageurl": pageurl,
    "version": "v3",
    "action": "submit",  # Must match site's action
    "min_score": "0.7",
    "json": 1,
}

Tasas de éxito esperadas

Tipo CAPTCHA Tarifa normal Umbral de alerta
reCAPTCHA v2 95-99% Por debajo del 90%
reCAPTCHA v3 90-98% Por debajo del 85%
Cloudflare Turnstile 99-100% Por debajo del 95%
GeeTest v3 99-100% Por debajo del 95%
BLS 99-100% Por debajo del 95%
Imagen/OCR 90-98% Por debajo del 85%

Solución de problemas

Problema causa Solución
La tasa bajó del 98% al 70% La clave del sitio o la página cambiaron Vuelva a extraer todos los parámetros
todos los tokens v3 rechazados Parámetro de acción incorrecto Coincidir con la acción de la fuente de la página
Los tokens funcionan pero caducan Demasiado lento para usar Enviar token dentro de 60 segundos
La tarifa varía según la hora del día. Limitación de velocidad del lado del servidor Agregar retrasos entre envíos

Preguntas frecuentes

¿Cuál es una tasa de éxito normal?

alta precisión orientativa para la mayoría de los tipos CAPTCHA. Si está constantemente por debajo del 90%, es probable que haya un problema de parámetro o sincronización.

¿Qué tan rápido necesito usar tokens?

Los tokens reCAPTCHA caducan en 120 segundos. Fichas de torniquete en 300 segundos. Utilice tokens en 60 segundos para obtener mejores resultados.

¿Debo reportar soluciones incorrectas?

Sí. Utilice el punto final reportbad para informar soluciones incorrectas. CaptchaAI utiliza estos comentarios para mejorar la precisión.


Guías relacionadas


Diagnostica rápido, resuelve mejor. Usa CaptchaAI.

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