¿Token o cookie? La respuesta rápida: usa un token para superar un CAPTCHA puntual al enviar un formulario, y una cookie para recorrer muchas páginas detrás de un mismo desafío de Cloudflare. La diferencia no la eliges tú: la marca el sitio de destino según cómo valide cada solicitud, y elegir mal cuesta resoluciones de más.
Token o cookie: la diferencia de un vistazo
| Aspecto | Basado en token | Basado en cookie |
|---|---|---|
| Qué obtienes | Una cadena de token (más de 500 caracteres) | Una cookie de navegador (qa_validation_cookie, entre otras) |
| Para qué sirve | reCAPTCHA v2/v3, Cloudflare Turnstile | Páginas de Cloudflare Challenge |
| Cómo se usa | Se inyecta en el campo del formulario o en el cuerpo del POST | Se envía en las solicitudes HTTP siguientes |
| Duración | 60-120 segundos | De 30 minutos a 24 horas |
| Reutilizable | No (un solo uso) | Sí (mientras dure la sesión) |
| Navegador | Solo para extraer datos de la página | Obligatorio para resolver (navegador completo) |
Cómo decidir según tu caso
Antes de escribir código, mira qué protege el sitio y qué necesitas hacer después. Estas son las decisiones más habituales:
| Escenario | Enfoque | Por qué |
|---|---|---|
| Formulario de login con reCAPTCHA | Token | Envías el token junto con los datos del formulario |
| Web scraping de un sitio tras Cloudflare | Cookie | Una resolución cubre muchas páginas |
| Envío de formulario con Turnstile | Token | Se inyecta en cf-turnstile-response |
| Acceso a una API detrás de Cloudflare | Cookie | Reutilizas la cookie en todas las llamadas |
| Envío de varios formularios | Token (uno por envío) | Cada formulario necesita un token nuevo |
| Extracción masiva del mismo dominio | Cookie | Resuelves una vez y extraes hasta que caduque |
Un caso frecuente en la región: extraer precios de un marketplace protegido por Cloudflare. Con el enfoque basado en cookie, una resolución cubre miles de páginas del mismo dominio hasta que expira, en lugar de pagar una por página. Automatiza solo flujos que tengas autorización para usar y respeta los términos de servicio y la normativa de protección de datos aplicable (GDPR/LOPDGDD en España, LFPDPPP en México).
Resolución basada en token
Cómo funciona
- Extrae el sitekey de la página.
- Envía el sitekey y la URL de la página a CaptchaAI.
- Recibe la cadena de token.
- Inyecta el token en el campo oculto del formulario.
- Envía el formulario.
Qué CAPTCHA devuelven un token
| CAPTCHA | Campo del token |
|---|---|
| reCAPTCHA v2 | g-recaptcha-response (textarea) |
| reCAPTCHA v3 | g-recaptcha-response, con action (y enterprise=1 en sitekeys Enterprise) |
| Cloudflare Turnstile | cf-turnstile-response |
Implementación
import requests
import time
API_KEY = "YOUR_API_KEY"
# 1. Solve
resp = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "userrecaptcha",
"googlekey": "6Le-wvkSAAAAAPBMR...",
"pageurl": "https://staging.example.com/qa-login",
"json": "1",
}).json()
task_id = resp["request"]
# 2. Poll
token = None
for _ in range(24):
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"]
break
# 3. Submit form with token (no browser needed)
form_response = requests.post("https://staging.example.com/qa-login", data={
"email": "user@example.com",
"password": "password",
"g-recaptcha-response": token,
})
No hace falta navegador para el envío: inyectas el token directamente en la solicitud HTTP POST. A cambio, tiene vida corta —caduca en 60-120 segundos, así que resuélvelo y úsalo de inmediato— y es de un solo uso: cada envío necesita uno nuevo. La validación ocurre en el servidor, cuando el sitio manda el token a Google o Cloudflare.
Resolución basada en cookie
Cómo funciona
- El sitio muestra una página de desafío (Cloudflare Challenge, JS Challenge).
- Un navegador resuelve el desafío (puede usar Turnstile internamente).
- El servidor emite una cookie de sesión (
qa_validation_cookie). - Todas las solicitudes posteriores con esa cookie se saltan el desafío.
Qué desafíos usan cookies
- Páginas de Cloudflare Challenge: cookie
qa_validation_cookie. - JS Challenge: el desafío de solo JavaScript de Cloudflare.
- Algunos desafíos de WAF: distintos firewalls de aplicaciones web.
Implementación
from selenium import webdriver
import requests
import time
# 1. Solve the challenge in a browser
driver = webdriver.Chrome()
driver.get("https://example.com/protected")
# Wait for challenge to complete (manually or con CaptchaAI)
time.sleep(10) # O valida el token con CaptchaAI en una prueba propia
# 2. Extract cookies from browser
cookies = driver.get_cookies()
qa_validation_cookie = next(
(c for c in cookies if c["name"] == "qa_validation_cookie"), None
)
user_agent = driver.execute_script("return navigator.userAgent")
driver.quit()
# 3. Use cookies for subsequent requests (no browser needed)
session = requests.Session()
session.headers.update({"User-Agent": user_agent})
for cookie in cookies:
session.cookies.set(cookie["name"], cookie["value"])
# All requests now pass the challenge
for page in range(1, 50):
resp = session.get(f"https://example.com/api/data?page={page}")
print(f"Page {page}: {resp.status_code}")
Aquí el reparto de costos se invierte. Necesitas un navegador completo para resolver, pero la recompensa es una cookie de vida larga (de 30 minutos a 24 horas) reutilizable en muchas solicitudes. La contrapartida: queda atada a la IP y al User-Agent que la resolvieron, así que ambos deben mantenerse iguales o el desafío reaparece.
Enfoque híbrido
Algunos sitios combinan las dos técnicas: una página de Cloudflare Challenge (cookie) que protege un formulario con reCAPTCHA (token). Resuelves primero la cookie para entrar y después el token para enviar.
# Step 1: Get past Cloudflare (cookie)
session = get_qa_validation_cookie_session("https://example.com")
# Step 2: Load the form (using the cookie session)
html = session.get("https://example.com/submit").text
sitekey = extract_sitekey(html)
# Step 3: Solve reCAPTCHA (token)
token = solve_recaptcha(sitekey, "https://example.com/submit")
# Step 4: Submit form (cookie + token)
resp = session.post("https://example.com/submit", data={
"data": "value",
"g-recaptcha-response": token,
})
Resumen de costo y rendimiento
| Característica | Token | Cookie |
|---|---|---|
| Costo de resolución | Por cada envío de formulario | Por sesión (se amortiza) |
| Tiempo de resolución | 10-30 s por token | 10-30 s una sola vez |
| Solicitudes por resolución | 1 | Muchas (hasta que caduque) |
| Flexibilidad de IP | El token funciona desde cualquier IP | La cookie queda atada a la IP que la resolvió |
| Navegador para usarla | No hace falta | No hace falta (basta la cookie) |
| Riesgo de caducidad | 60-120 s | De 30 minutos a 24 horas |
Preguntas frecuentes
¿Necesito un navegador para resolver con tokens?
No. El enfoque basado en token funciona con simples solicitudes HTTP: envías el sitekey a la API, recibes el token y lo inyectas en el POST. El navegador solo hace falta para el enfoque basado en cookie.
¿Por qué mi cookie de sesión caduca antes de lo esperado?
Casi siempre por un desajuste de IP o de User-Agent. La cookie queda atada a la IP y al User-Agent que resolvieron el desafío; si cambias de red o de cabecera, el sitio vuelve a mostrarlo aunque la cookie no haya expirado.
¿Puedo reutilizar el mismo token en varios formularios?
No. Cada token es de un solo uso y caduca en 60-120 segundos. Para cada envío necesitas resolver uno nuevo; por eso, en flujos con muchos formularios, el costo crece con el número de envíos.
¿CaptchaAI cubre tanto tokens como cookies?
Sí. Los CAPTCHA basados en token (reCAPTCHA v2/v3, Turnstile) devuelven la cadena lista para inyectar. Para las páginas de Cloudflare Challenge, usas el solver de Turnstile para obtener el token y luego extraes la cookie resultante.
Resuelve CAPTCHA con CaptchaAI
Obtén tu API key en captchaai.com y elige el enfoque —token o cookie— según cómo valide cada sitio.