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.