Tutoriales

Reutilización de tokens CAPTCHA en backends propios dentro del TTL

Sí, puedes reutilizar un token CAPTCHA en tu propio backend, con dos condiciones: que sigas dentro del TTL oficial que fija el proveedor y que el token pertenezca a una integración que tú controlas. Dentro de esa ventana, reutilizarlo convierte un reintento en una operación idempotente: si la misma solicitud vuelve a entrar, devuelves el token que ya emitiste en lugar de resolver otra vez. No sirve para acumular tokens ni para revenderlos.

Alcance seguro: Esta guía aplica únicamente a tus propios entornos de QA, staging y preproducción autorizados. Describe patrones de diagnóstico y observabilidad para tu integración CAPTCHA, no para sitios de terceros ni para flujos que no controlas.

Qué es el TTL y por qué condiciona la reutilización

La vida útil de un token la decide el proveedor, y esa ventana marca cuánto puedes reutilizarlo. Trabaja con un margen por debajo del TTL nominal:

Tipo de CAPTCHA Vida útil aproximada Ventana de reutilización
reCAPTCHA v2 / v3 ~120 s Corta; deja margen
Cloudflare Turnstile pocos minutos Dentro del TTL
GeeTest v3 ~60 s Muy corta

Guarda junto a cada token los datos que deciden si sigue vivo: token, emitido_en, expira_en y caso_qa. Con esos campos, tu backend decide en milisegundos si reutiliza o pide una resolución nueva.

Reutilizar el token en un reintento: idempotencia

El caso que lo justifica es el reintento. Imagina el suite de QA de una agencia en Madrid o Ciudad de México que prueba un alta de cuenta en su staging: el runner falla por un timeout y CI reencola el caso. Si vuelves a resolver el CAPTCHA desde cero, el test se vuelve lento y no determinista.

La regla es simple: si la solicitud que ya consumió un token vuelve a entrar dentro del TTL, devuelve la respuesta original y no invoques CaptchaAI de nuevo. Sobre coste: CaptchaAI factura por thread concurrente con resoluciones ilimitadas por thread, no por resolución; reutilizar no abarata cada resolución, solo agiliza los reintentos. Para un volumen bajo, el plan BASIC ($15/mes, 5 threads) cubre un pipeline de QA.

Cómo encaja CaptchaAI en tu pipeline de QA

El patrón de integración es siempre el mismo, sea cual sea tu framework de pruebas:

  1. Tu test detecta el widget de CAPTCHA en la página de tu propia aplicación (formulario de QA, landing de staging, endpoint de preproducción).
  2. Tu test envía a CaptchaAI los datos públicos del widget: el sitekey, la URL de la página y el tipo de CAPTCHA.
  3. CaptchaAI devuelve un token válido para esa página.
  4. Tu test inyecta ese token en el campo correspondiente y envía el formulario.
  5. Tu backend verifica el token con el proveedor de CAPTCHA, exactamente igual que haría con un usuario real.

La capa de reutilización vive entre el paso 3 y el paso 4: antes de pedir un token nuevo, consultas tu caché por si ya tienes uno vivo para ese sitekey y esa página.

Configuración de navegador idéntica en todos los entornos

La causa número uno de que un token deje de validar no es el TTL, sino que el navegador de CI no se comporta igual que el de tu máquina. Usa la misma configuración en QA, staging y CI para evitar que un test pase en local y falle en el runner.

from selenium import webdriver

def make_driver(headless: bool = True) -> webdriver.Chrome:
    options = webdriver.ChromeOptions()
    if headless:
        options.add_argument('--headless=new')
    options.add_argument('--window-size=1280,800')
    options.add_argument('--lang=es-ES')
    return webdriver.Chrome(options=options)

Mantener el viewport, el idioma y el user-agent idénticos en todos los runners reduce la varianza entre ejecuciones.

Limpieza y observabilidad del paso CAPTCHA

Un token caducado en caché no es un ahorro sino un fallo latente: programa un job que borre las entradas cuyo expira_en ya pasó y no persistas nada más allá del TTL. Además, instrumenta el paso de CAPTCHA para detectar regresiones antes de producción:

  • Tiempo de resolución por intento: desde la solicitud a CaptchaAI hasta la entrega del token.
  • Tasa de éxito por endpoint propio: verificaciones backend que pasan respecto al total de intentos.
  • Ratio de reutilización: qué porcentaje de reintentos se resolvió desde caché.

Conserva las trazas (logs, capturas, HAR) para reproducir incidentes cuando un test falle de forma intermitente.

Buenas prácticas en tu entorno de QA

  • Prueba siempre sobre tu propia aplicación o entornos explícitamente autorizados.
  • Usa una API key separada para QA, distinta de la de producción, para no mezclar métricas ni saldo.
  • Define timeouts y reintentos con backoff exponencial para no acumular trabajos pendientes.

Preguntas frecuentes

¿Cuánto tiempo puedo reutilizar un token antes de que expire?

Depende del tipo: reCAPTCHA v2 y v3 rondan los 120 segundos y Cloudflare Turnstile aguanta unos minutos. Trabaja con una ventana menor que el TTL nominal y descarta el token en cuanto expira_en caduque.

¿Reutilizar tokens me ahorra dinero con la facturación por thread?

No de forma directa. CaptchaAI cobra por thread concurrente con resoluciones ilimitadas por thread, así que el ahorro no es por resolución. Lo que ganas es velocidad y determinismo en los reintentos.

¿Qué tipos de CAPTCHA resuelve CaptchaAI en mi pipeline?

De forma general: reCAPTCHA v2 y v3, Cloudflare Turnstile y Cloudflare Challenge, GeeTest v3, e imagen/OCR y grid. CaptchaFox, Friendly Captcha y Lemin están en beta; hCaptcha y FunCaptcha no son compatibles hoy.

Solución de problemas

Síntoma Acción recomendada
El test no detecta el widget Revisa selectores y tiempos en tu entorno de staging
CaptchaAI devuelve ERROR_NO_SLOT_AVAILABLE Reintenta con backoff en tu pipeline interna
La validación backend rechaza el token Compara action y sitekey con tu configuración real
El token reutilizado deja de validar Reduce el margen de TTL o desactiva la reutilización para ese tipo
El test funciona en local pero falla en CI Iguala viewport, idioma y user-agent en ambos entornos

Guías relacionadas

Valida tus integraciones CAPTCHA en entornos propios con CaptchaAI.

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