Resolviste el Cloudflare Challenge con CaptchaAI, obtuviste la cookie qa_validation_cookie, la configuraste en tu sesión y la página de challenge vuelve a aparecer. Este bucle se produce cuando la cookie no coincide con el contexto de la sesión. Aquí tienes todas las causas y cómo solucionarlas.
Cómo funciona qa_validation_cookie
Cuando CaptchaAI resuelve un Cloudflare Challenge, devuelve una cookie qa_validation_cookie. Esta cookie está vinculada a:
- La IP del proxy utilizada durante la resolución
- El User-Agent utilizado durante la resolución
- El dominio del sitio de destino
Si alguno de estos difiere entre la resolución y tu solicitud posterior, Cloudflare rechaza la cookie y muestra el challenge nuevamente.
Causa 1: User-Agent no coincide
La causa más común. El User-Agent que envíe a CaptchaAI debe coincidir exactamente con el User-Agent en sus solicitudes.
import requests
USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
# Step 1: Solve with the SAME User-Agent
solve_data = {
"key": "YOUR_API_KEY",
"method": "cloudflare_challenge",
"pageurl": "https://example.com",
"proxy": "host:port:user:pass",
"proxytype": "HTTP",
"userAgent": USER_AGENT, # Must match step 2
"json": 1
}
submit = requests.post("https://ocr.captchaai.com/in.php", data=solve_data).json()
# ... poll for result ...
# Step 2: Use the SAME User-Agent in subsequent requests
session = requests.Session()
session.headers["User-Agent"] = USER_AGENT # Must match step 1
session.cookies.set("qa_validation_cookie", qa_validation_cookie_value, domain=".example.com")
resp = session.get("https://example.com")
Causa 2: La IP del proxy no coincide
La cookie qa_validation_cookie está vinculada a la IP que resolvió el desafío. Si solicita el sitio desde una IP diferente, la cookie se rechaza.
PROXY = "host:port:user:pass"
# Solve with this proxy
solve_data = {
"key": "YOUR_API_KEY",
"method": "cloudflare_challenge",
"pageurl": "https://example.com",
"proxy": PROXY,
"proxytype": "HTTP",
"userAgent": USER_AGENT,
"json": 1
}
# Use the SAME proxy for subsequent requests
session.proxies = {
"http": f"http://user:pass@host:port",
"https": f"http://user:pass@host:port"
}
Importante: Si utiliza proxies rotativos, fije una sesión fija. La IP debe permanecer igual entre la resolución y la navegación.
Causa 3: La cookie no está configurada correctamente
La cookie qa_validation_cookie debe configurarse en el dominio correcto con los atributos correctos.
# WRONG — setting on wrong domain
session.cookies.set("qa_validation_cookie", value, domain="example.com")
# CORRECT — include the dot prefix for subdomain coverage
session.cookies.set("qa_validation_cookie", value, domain=".example.com")
# Or set all cookies returned by CaptchaAI
for cookie_str in result.get("cookies", "").split(";"):
if "qa_validation_cookie" in cookie_str:
name, val = cookie_str.strip().split("=", 1)
session.cookies.set(name.strip(), val.strip(), domain=".example.com")
Causa 4: La cookie expiró
Las cookies qa_validation_cookie tienen una vida útil limitada, normalmente entre 15 y 30 minutos. Después del vencimiento, Cloudflare vuelve a mostrar el desafío.
Solución: realice un seguimiento de la antigüedad de las cookies y resuélvalas antes de que caduquen.
import time
last_solve_time = None
COOKIE_TTL = 900 # 15 minutes
def get_qa_validation_cookie():
global last_solve_time
if last_solve_time and (time.time() - last_solve_time) < COOKIE_TTL:
return # Cookie still valid
# Solve again
qa_validation_cookie = solve_cloudflare_challenge()
session.cookies.set("qa_validation_cookie", qa_validation_cookie, domain=".example.com")
last_solve_time = time.time()
Causa 5: la señales del navegador TLS no coincide
Cloudflare verifica las señales del navegador TLS. La biblioteca requests de Python tiene una señales del navegador TLS diferente a la de Chrome. Algunos sitios rechazan solicitudes incluso con qa_validation_cookie válido si la señales del navegador TLS no coincide.
Solución: use curl_cffi o tls-client para señales del navegador TLS similares a las de un navegador.
pip install curl_cffi
from curl_cffi import requests as curl_requests
session = curl_requests.Session(impersonate="chrome120")
session.cookies.set("qa_validation_cookie", value, domain=".example.com")
resp = session.get("https://example.com")
Lista de verificación de depuración
Challenge keeps repeating
↓
User-Agent in solve request matches browsing request? → No → Sync User-Agent
↓ Yes
Same proxy IP for solve and browse? → No → Pin proxy IP (sticky session)
↓ Yes
Cookie set on correct domain (.example.com)? → No → Fix domain
↓ Yes
Cookie less than 15 minutes old? → No → Re-solve the challenge
↓ Yes
TLS fingerprint matches a browser? → No → Use curl_cffi or tls-client
↓ Yes
Site may have additional bot detection → Use headless browser instead
Preguntas frecuentes
¿Cuánto dura una cookie qa_validation_cookie?
Normalmente entre 15 y 30 minutos. Algunos sitios establecen duraciones más cortas. Resolver proactivamente antes de su vencimiento.
¿Necesito una versión específica de Chrome en el User-Agent?
Utilice un User-Agent actual y realista. Los agentes de usuario obsoletos activan las comprobaciones de Cloudflare de forma más agresiva.
¿Puedo reutilizar una cookie qa_validation_cookie en diferentes páginas?
Sí, siempre y cuando estén en el mismo dominio y uses la misma IP y User-Agent.
Resuelva Cloudflare Challenge con CaptchaAI
Rompe el ciclo del challenge en captchaai.com.
Guías relacionadas
- Cómo resolver Cloudflare Challenge usando API
- Cloudflare Challenge vs Turnstile: cómo detectar
- Persistencia de sesión del navegador para workflows CAPTCHA
Configuración recomendada para su pipeline
Use exactamente la misma configuración de navegador en todos sus entornos de QA, staging y CI. Esto evita que un test funcione en local y falle en CI sin razón aparente.
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 viewport, idioma y user-agent por defecto idénticos en todos los runners reduce la varianza y facilita comparar resultados entre ejecuciones de su propio QA.
Cómo se integra CaptchaAI en su pipeline propio
El patrón de integración con CaptchaAI siempre es el mismo, independientemente del lenguaje o framework de pruebas que use:
- Su test detecta el widget de CAPTCHA en la página de su propia aplicación (formulario de QA, landing de staging, endpoint de preproducción).
- Su test envía a CaptchaAI los datos públicos del widget (
sitekey, URL de la página, tipo de CAPTCHA). - CaptchaAI devuelve un token válido para esa página.
- Su test inyecta ese token en el campo correspondiente y envía el formulario.
- Su backend verifica el token con el proveedor de CAPTCHA, exactamente igual que con un usuario real.
Este flujo se aplica únicamente a integraciones que usted controla. No se utiliza para sortear protecciones de sitios de terceros.
Métricas y observabilidad
Incluya métricas específicas para los pasos relacionados con CAPTCHA en sus pipelines de QA. Esto le permite detectar regresiones en su propia integración antes de que lleguen a producción:
- Tiempo de resolución por intento — desde la solicitud a CaptchaAI hasta la entrega del token.
- Tasa de éxito por endpoint propio — cuántas verificaciones backend pasan respecto al total de intentos.
- Distribución de errores — agrupados por código (
ERROR_*, timeouts internos, fallos de red). - Latencia extremo a extremo — incluyendo render de la página, resolución de CAPTCHA y respuesta de su backend.
Conserve trazas (logs, capturas, HAR) durante un período razonable para poder reproducir incidentes en su entorno QA cuando un test falle de forma intermitente.
Buenas prácticas en su entorno QA
- Pruebe siempre sobre su propia aplicación o sobre entornos explícitamente autorizados.
- Mantenga una API key de CaptchaAI separada para QA, distinta de la de producción, para no mezclar métricas.
- Defina timeouts y reintentos razonables (
backoffexponencial) para no acumular trabajos pendientes en CaptchaAI durante caídas. - Versione sus snapshots de configuración (sitekey, action, umbrales) junto al código de los tests.
- Revise periódicamente el changelog de su proveedor de CAPTCHA para anticipar cambios que afecten a su propia integración.
Solución de problemas
| Síntoma | Acción recomendada |
|---|---|
| El test no detecta el widget | Revise selectores y tiempos en su entorno staging |
CaptchaAI devuelve ERROR_NO_SLOT_AVAILABLE |
Reintente con backoff en su pipeline interna |
| La validación backend rechaza el token | Compare action/sitekey con su configuración real |
| El test funciona en local pero falla en CI | Iguale viewport, idioma y user-agent en ambos entornos |
| Tiempos de resolución muy variables | Revise concurrencia y límites de su API key de CaptchaAI |
Valide sus integraciones CAPTCHA en entornos propios con CaptchaAI.