Explainers

Guía de la cookie qa_validation_cookie de Cloudflare Challenge

Cuando Cloudflare marca a un visitante como sospechoso, muestra una página de challenge intersticial. Una vez resuelto, el navegador recibe una cookie qa_validation_cookie que concede acceso a la sesión. Esta guía explica cómo funciona el flujo de challenge y cómo lo gestiona CaptchaAI.


Cómo funcionan las páginas Cloudflare Challenge

  1. El usuario solicita una página protegida por Cloudflare
  2. Cloudflare evalúa señales de riesgo (reputación de IP, encabezados, señales del navegador TLS)
  3. Si se marca, Cloudflare devuelve un 403 o 503 con una página de desafío de JavaScript
  4. La página de challenge ejecuta comprobaciones del navegador y puede presentar un widget Turnstile.
  5. Si tiene éxito, Cloudflare establece qa_validation_cookie y redirige a la URL original.
  6. Las solicitudes posteriores con la cookie pasan sin desafío

Propiedad Detalles
Nombre qa_validation_cookie
Dominio Dominio del sitio de destino (por ejemplo, .example.com)
Camino /
Toda la vida Normalmente de 30 minutos a 24 horas
Sólo Http si
Seguro Sí (solo HTTPS)
Mismo sitio Ninguno

La cookie está ligada a varios factores:

  • Dirección IP: el uso de la cookie desde una IP diferente generalmente falla
  • Agente de usuario: debe coincidir con la UA utilizada durante la resolución del desafío.
  • señales del navegador TLS: algunas configuraciones se vinculan al TLS ClientHello

Tipos de desafíos

Cloudflare ofrece diferentes niveles de desafío:

Desafío Código de respuesta Interacción del usuario Descripción
Desafío JS 503 Ninguno Solo ejecución de JavaScript
Desafío gestionado 403 tal vez Cloudflare decide: puede mostrar Turnstile o pasar en silencio
Desafío interactivo 403 Siempre muestra un widget Turnstile

CaptchaAI resuelve los tres tipos a través del solucionador Cloudflare Challenge.


Resolviendo con CaptchaAI

pitón

import requests
import time

API_KEY = "YOUR_API_KEY"
TARGET_URL = "https://example.com/protected-page"

# Submit Cloudflare Challenge task
resp = requests.post("https://ocr.captchaai.com/in.php", data={
    "key": API_KEY,
    "method": "turnstile",
    "sitekey": "0x0000000000000000000000",  # may be generic for CF challenge
    "pageurl": TARGET_URL,
    "json": "1",
}).json()

if resp["status"] != 1:
    raise Exception(f"Submit error: {resp['request']}")

task_id = resp["request"]
print(f"Task ID: {task_id}")

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

    if result["status"] == 1:
        token = result["request"]
        print(f"Token received: {token[:50]}...")
        break
    if result["request"] != "CAPCHA_NOT_READY":
        raise Exception(f"Error: {result['request']}")

JavaScript

const axios = require('axios');

const API_KEY = 'YOUR_API_KEY';
const TARGET_URL = 'https://example.com/protected-page';

const submit = await axios.post('https://ocr.captchaai.com/in.php', null, {
  params: {
    key: API_KEY,
    method: 'turnstile',
    sitekey: '0x0000000000000000000000',
    pageurl: TARGET_URL,
    json: 1,
  }
});
const taskId = submit.data.request;

// Poll
let token = null;
for (let i = 0; i < 30; i++) {
  await new Promise(r => setTimeout(r, 5000));
  const poll = await axios.get('https://ocr.captchaai.com/res.php', {
    params: { key: API_KEY, action: 'get', id: taskId, json: 1 }
  });
  if (poll.data.status === 1) {
    token = poll.data.request;
    break;
  }
}
console.log(`Token: ${token.substring(0, 50)}...`);

Usando el token resuelto

Después de resolver, inyecta el token en la página del desafío para obtener qa_validation_cookie:

# With Selenium
from selenium import webdriver

driver = webdriver.Chrome()
driver.get(TARGET_URL)  # Load the challenge page

# Inject token into Turnstile response field
driver.execute_script("""
    const input = document.querySelector('input[name="cf-turnstile-response"]');
    if (input) input.value = arguments[0];

    // Trigger form submit or callback
    const form = document.querySelector('form');
    if (form) form.submit();
""", token)

# Wait for redirect and extract cookies
import time
time.sleep(3)
cookies = driver.get_cookies()
qa_validation_cookie = next(
    (c for c in cookies if c['name'] == 'qa_validation_cookie'), None
)
if qa_validation_cookie:
    print(f"qa_validation_cookie: {qa_validation_cookie['value'][:30]}...")

Reutilizar la galleta

session = requests.Session()
session.cookies.set("qa_validation_cookie", qa_validation_cookie["value"], domain=".example.com")
session.headers.update({
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
})

# Now access protected pages
resp = session.get("https://example.com/api/data")
print(resp.status_code)  # 200

La cookie qa_validation_cookie caduca. Plan para resolver:

import datetime

def is_cookie_valid(cookie):
    if not cookie:
        return False
    expiry = cookie.get("expiry", 0)
    return datetime.datetime.now().timestamp() < expiry - 60  # 60s buffer

def get_or_refresh_clearance(driver, target_url, solve_func):
    cookies = driver.get_cookies()
    cf = next((c for c in cookies if c["name"] == "qa_validation_cookie"), None)
    if is_cookie_valid(cf):
        return cf["value"]

    # Re-solve
    token = solve_func(target_url)
    # ... inject and extract new cookie

Solución de problemas

Problema Causa Solución
Cookie rechazada después de resolver IP no coincide Usa el mismo proxy para resolver y para las solicitudes
La cookie caduca rápidamente TTL corto establecido por el sitio Resuelve antes de que expire; comprueba el campo expiry
403 a pesar de una cookie válida User-Agent no coincide Haz coincidir el UA entre las sesiones de resolución y solicitud
La página de challenge no carga JavaScript deshabilitado Usa un navegador completo (Selenium, Puppeteer)

Preguntas frecuentes

Solo si comparten la misma IP y coincides con el User-Agent. Cloudflare suele vincular la cookie a la IP de origen.

Normalmente entre 30 minutos y 24 horas, según la configuración de Cloudflare del propietario del sitio.


Resuelve páginas Cloudflare Challenge con CaptchaAI

Obtén tu clave API en captchaai.com.


Guías relacionadas

  • Extracción del sitekey de Cloudflare Turnstile
  • Cloudflare Turnstile vs reCAPTCHA vs hCaptcha
Los comentarios están deshabilitados para este artículo.

Publicaciones relacionadas

Explainers GeeTest v4 Guía de resolución y cambios de CAPTCHA
Explicación clara sobre Gee Test v 4 CAPTCHA Changes and Solving Guide y lo que implica para automatización, integración y tasas de éxito con Captcha AI.

Explicación clara sobre Gee Test v 4 CAPTCHA Changes and Solving Guide y lo que implica para automatización, i...

Apr 25, 2026