La mayoría de los fallos de Cloudflare Turnstile no son aleatorios. Se dividen en tres categorías: errores en la etapa de solicitud (se rechaza su envío a la API), errores en la etapa de resultados (el sondeo falla o se agota el tiempo de espera) y fallas de validación de la página de destino (la API devuelve un token válido pero la página aún lo rechaza).
Los tres mayores problemas específicos de Turnstile son:
- URL de página exacta incorrecta, especialmente en las páginas de desafío de Cloudflare, donde el contexto es más estricto
- Clave de sitio incorrecta: capturada desde el elemento incorrecto o una instancia de widget diferente
- Token aplicado por la ruta incorrecta: la página espera
cf-turnstile-response, un callback, o ambos.
CaptchaAI resuelve Turnstile con una tasa de éxito del 100% en menos de 10 segundos. Cuando tu integración falla, el problema casi siempre está en los parámetros que envías o en cómo aplicas el token devuelto.
Puntos de fallo específicos de Turnstile
Antes de profundizar en los códigos de error, entiende las tres cosas que diferencian a Turnstile de otros tipos de captcha:
1. La URL exacta de la página importa más
Los tokens de Turnstile están estrechamente vinculados al contexto de la página. En las páginas de challenge de Cloudflare (la pantalla de verificación de página completa), usar la URL incorrecta (incluso una ruta ligeramente diferente) hará que se rechace el token.
2. Dos rutas de aplicación simbólicas
El token devuelto se puede aplicar de dos maneras, y usar el incorrecto fallará silenciosamente:
| Método | Cuándo usar |
|---|---|
Campo oculto: insertar en cf-turnstile-response (y a veces en g-recaptcha-response) |
Cuando la página usa un formulario estándar con una entrada oculta |
Función callback: llama a la función definida en turnstile.render() o data-callback |
Cuando la página usa validación programática en lugar de un formulario |
3. Los tokens son de un solo uso
Una ficha de Turnstile solo se puede verificar una vez. Si su automatización lo envía accidentalmente dos veces, o si hay una condición de carrera, el segundo intento fallará.
Errores en la etapa de solicitud
Esto sucede al enviar la tarea a https://ocr.captchaai.com/in.php.
ERROR_WRONG_USER_KEY
Causa: El formato de la clave API es incorrecto (debe tener 32 caracteres).
Solución: Verifica la clave en captchaai.com/api.php.
ERROR_KEY_DOES_NOT_EXIST
Causa: La clave tiene el formato correcto pero no está vinculada a una cuenta activa.
Solución: Consulta tu panel de control. Asegúrese de que la cuenta esté activa y que la clave sea correcta.
ERROR_ZERO_BALANCE
Causa: No hay hilos gratuitos en tu plan.
Solución: Espere a que los subprocesos se liberen, reduzcan la simultaneidad o actualicen.
ERROR_PAGEURL
Causa: Falta el parámetro pageurl.
Solución: Agregue la URL completa: protocolo, dominio y ruta:
pageurl=https://staging.example.com/qa-login
ERROR_BAD_PARAMETERS
Causa: Faltan parámetros obligatorios o están mal formados. Para Turnstile, los parámetros requeridos son:
| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
key |
cuerda | si | Su clave API CaptchaAI |
method |
cuerda | si | Debe ser turnstile |
sitekey |
string | Sí | Sitekey del widget Turnstile |
pageurl |
cuerda | si | URL de página completa |
Opcional pero útil:
| Parámetro | Tipo | Descripción |
|---|---|---|
action |
cuerda | Valor de data-action o el parámetro action de turnstile.render() |
proxy |
cuerda | Formato: login:password@IP:PORT |
proxytype |
cuerda | HTTP, HTTPS, SOCKS4, SOCKS5 |
Solución: Verifique que todos los campos obligatorios estén presentes y escritos correctamente.
Respuestas HTML o 500/502
Causa: Error transitorio del lado del servidor.
Solución: Espere de 5 a 10 segundos y vuelva a intentarlo.
Cómo encontrar la clave del sitio Turnstile
La clave del sitio es el parámetro incorrecto más común. Aquí es donde encontrarlo:
Opción 1: el atributo data-sitekey:
<div class="cf-turnstile" data-sitekey="0x4AAAAAAAB1example"></div>
Opción 2: una llamada turnstile.render():
turnstile.render('#captcha-container', {
sitekey: '0x4AAAAAAAB1example',
callback: function(token) {
document.getElementById('cf-turnstile-response').value = token;
}
});
Opción 3: interceptar la llamada de renderizado (avanzado):
Si la clave del sitio se carga dinámicamente, puede redefinir turnstile.render antes de que el widget se inicialice para capturar los parámetros:
// Inject this before the Turnstile script loads
const originalRender = window.turnstile.render;
window.turnstile.render = function(container, params) {
console.log('Sitekey:', params.sitekey);
console.log('Action:', params.action);
return originalRender.call(this, container, params);
};
Errores en la etapa de resultados
Esto sucede al sondear https://ocr.captchaai.com/res.php.
CAPCHA_NOT_READY
No es un error. La resolución aún está en progreso. Turnstile en CaptchaAI suele resolverse en menos de 10 segundos.
Solución: Espere 5 segundos y vuelva a sondear.
ERROR_WRONG_ID_FORMAT
Causa: El ID del captcha contiene caracteres no numéricos.
Solución: Utilice el ID exacto devuelto por in.php, sin modificar.
ERROR_WRONG_CAPTCHA_ID
Causa: El ID no coincide con ninguna tarea enviada.
Solución: Verifique que esté sondeando el ID correcto de la respuesta de envío.
ERROR_EMPTY_ACTION
Causa: Falta el parámetro action en su solicitud de consulta.
Solución: Incluya siempre action=get:
https://ocr.captchaai.com/res.php?key=YOUR_KEY&action=get&id=CAPTCHA_ID&json=1
Nota: Para Turnstile, utilice siempre
json=1en su solicitud de consulta. La respuesta JSON puede incluir eluser_agentdel solucionador, que algunas páginas protegidas por Cloudflare requieren para una validación exitosa del token.
ERROR_CAPTCHA_UNSOLVABLE
Causa: La solución falló: posiblemente una clave de sitio incorrecta o una configuración de página no compatible.
Solución: Verifique la clave del sitio, actualice la solicitud y vuelva a intentarlo.
ERROR_INTERNAL_SERVER_ERROR
Causa: Problema del lado del servidor.
Solución: Espere 10 segundos y vuelva a intentarlo.
Errores de validación de la página de destino
Estos son los más difíciles de depurar porque la API devuelve un token correctamente, pero la página de destino lo rechaza.
Fallo 1: token insertado en el campo incorrecto
Síntoma: El formulario se envía pero la página devuelve un error de validación o se actualiza.
Las páginas de torniquete pueden esperar el token en diferentes campos:
cf-turnstile-response: la entrada oculta principal del torniqueteg-recaptcha-response: algunas páginas utilizan esto como alternativa
Solución: Verifique el formulario de la página para ambos campos. En la automatización del navegador:
# Selenium — inject into both fields for safety
driver.execute_script("""
var cfField = document.querySelector('[name="cf-turnstile-response"]');
var gField = document.querySelector('[name="g-recaptcha-response"]');
if (cfField) cfField.value = arguments[0];
if (gField) gField.value = arguments[0];
""", token)
Fallo 2: callback no activado
Síntoma: El token está en el campo, pero el formulario sigue bloqueando el envío.
Causa: La página usa una función callback en lugar de (o además de) el campo oculto. El callback maneja lógica adicional como habilitar el botón de envío o enviar una solicitud AJAX.
Solución: Busca y llama al callback:
// Check data-callback attribute
const callbackName = document.querySelector('.cf-turnstile').getAttribute('data-callback');
if (callbackName && window[callbackName]) {
window[callbackName](token);
}
// Or if it was passed in turnstile.render()
// You may need to intercept the render call to capture it
Fallo 3: contexto de página exacto incorrecto
Síntoma: Token rechazado a pesar de la clave del sitio correcta y la nueva solución.
Causa: El pageurl utilizado en la solicitud de API no coincide con el contexto real de la página. Esto es especialmente común en:
- Páginas de desafío de Cloudflare: la URL puede incluir parámetros de consulta o componentes de ruta que sean importantes
- Aplicaciones de una sola página: la URL visible puede diferir de la URL que cargó el widget Turnstile
Solución: Utilice la pestaña Red de DevTools para encontrar la URL exacta desde la que se carga el widget Turnstile. Utilice esa URL como pageurl.
Fallo 4: reutilización de tokens
Síntoma: La primera solución funciona, las siguientes fallan.
Causa: Las fichas de torniquete son de un solo uso. Una vez verificado por el servidor de Cloudflare, el token queda invalidado.
Solución: Solicite una nueva solución para cada envío de formulario. No almacene en caché ni reutilice tokens.
Referencia rápida para corregir errores
| Error/síntoma | etapa | causa probable | Solución |
|---|---|---|---|
ERROR_WRONG_USER_KEY |
Enviar | Clave API mal formada | Verificar clave de 32 caracteres |
ERROR_KEY_DOES_NOT_EXIST |
Enviar | Clave no válida | Revisar el tablero |
ERROR_ZERO_BALANCE |
Enviar | No hay hilos libres | Esperar o actualizar el plan |
ERROR_PAGEURL |
Enviar | Falta pageurl |
Agregar URL completa |
ERROR_BAD_PARAMETERS |
Enviar | Falta la clave del sitio, el método o la URL de página | Verifique todos los campos obligatorios |
CAPCHA_NOT_READY |
Consulta | Resolver en progreso | Espere 5 segundos, vuelva a intentarlo |
ERROR_WRONG_ID_FORMAT |
Consulta | ID de captcha no numérico | Utilice la identificación exacta de in.php |
ERROR_WRONG_CAPTCHA_ID |
Consulta | ID de captcha no válido | Verificar ID de envío |
ERROR_EMPTY_ACTION |
Consulta | Falta action=get |
Agregar parámetro de acción |
| Token rechazado por la página | Validación | Campo incorrecto, callback no activado, URL incorrecta | Verificar nombre de campo, callback y URL exacta |
| La segunda solución falla | Validación | Reutilización de tokens | Solicitar token nuevo por envío |
Python: solución completa de torniquete
import time
import requests
API_KEY = "YOUR_CAPTCHAAI_API_KEY"
SITEKEY = "0x4AAAAAAAB1example"
PAGE_URL = "https://staging.example.com/qa-login"
SUBMIT_URL = "https://ocr.captchaai.com/in.php"
RESULT_URL = "https://ocr.captchaai.com/res.php"
def solve_turnstile(api_key, sitekey, pageurl):
"""Submit a Turnstile challenge and return the solved token."""
# Submit
submit_resp = requests.post(
SUBMIT_URL,
data={
"key": api_key,
"method": "turnstile",
"sitekey": sitekey,
"pageurl": pageurl,
"json": 1,
},
timeout=30,
)
submit_resp.raise_for_status()
submit_data = submit_resp.json()
if submit_data.get("status") != 1:
raise RuntimeError(f"Submit failed: {submit_data}")
captcha_id = submit_data["request"]
print(f"Task created — captcha ID: {captcha_id}")
# Wait before first poll (Turnstile is fast — 10 seconds is usually enough)
time.sleep(10)
# Poll for result
for _ in range(60):
result_resp = requests.get(
RESULT_URL,
params={
"key": api_key,
"action": "get",
"id": captcha_id,
"json": 1,
},
timeout=30,
)
result_resp.raise_for_status()
result_data = result_resp.json()
if result_data.get("request") == "CAPCHA_NOT_READY":
time.sleep(5)
continue
if result_data.get("status") == 1:
return result_data["request"]
raise RuntimeError(f"Polling error: {result_data}")
raise TimeoutError("Turnstile solve timed out")
# Usage
token = solve_turnstile(API_KEY, SITEKEY, PAGE_URL)
print(f"Solved token: {token[:80]}...")
# Inject into cf-turnstile-response and/or g-recaptcha-response
# Then submit the form
Node.js: solución completa de torniquete
const API_KEY = "YOUR_CAPTCHAAI_API_KEY";
const SITEKEY = "0x4AAAAAAAB1example";
const PAGE_URL = "https://staging.example.com/qa-login";
const SUBMIT_URL = "https://ocr.captchaai.com/in.php";
const RESULT_URL = "https://ocr.captchaai.com/res.php";
function sleep(ms) {
return new Promise((resolve) => setTimeout(resolve, ms));
}
async function solveTurnstile(apiKey, sitekey, pageurl) {
// Submit
const submitResp = await fetch(SUBMIT_URL, {
method: "POST",
headers: { "Content-Type": "application/x-www-form-urlencoded" },
body: new URLSearchParams({
key: apiKey,
method: "turnstile",
sitekey: sitekey,
pageurl: pageurl,
json: "1",
}),
});
const submitData = await submitResp.json();
if (submitData.status !== 1) {
throw new Error(`Submit failed: ${JSON.stringify(submitData)}`);
}
const captchaId = submitData.request;
console.log(`Task created — captcha ID: ${captchaId}`);
// Turnstile is fast — wait 10 seconds before first poll
await sleep(10_000);
// Poll for result
for (let i = 0; i < 60; i++) {
const resultResp = await fetch(
`${RESULT_URL}?${new URLSearchParams({
key: apiKey,
action: "get",
id: captchaId,
json: "1",
})}`
);
const resultData = await resultResp.json();
if (resultData.request === "CAPCHA_NOT_READY") {
await sleep(5_000);
continue;
}
if (resultData.status === 1) {
return resultData.request;
}
throw new Error(`Polling error: ${JSON.stringify(resultData)}`);
}
throw new Error("Turnstile solve timed out");
}
// Usage
solveTurnstile(API_KEY, SITEKEY, PAGE_URL)
.then((token) => {
console.log(`Solved token: ${token.slice(0, 80)}...`);
// Inject into cf-turnstile-response and/or g-recaptcha-response
})
.catch(console.error);
Turnstile vs Cloudflare Challenge: ¿a cuál te enfrentas?
| Señal | Turnstile | Cloudflare Challenge |
|---|---|---|
| Lo que ves | Widget integrado en la página (casilla de verificación o invisible) | Pantalla de verificación de Cloudflare de página completa |
| Lo que devuelve CaptchaAI | Un token para inyectar en el formulario | Una cookie qa_validation_cookie |
| Método API | turnstile |
cloudflare_challenge |
| ¿Se requiere proxy? | Opcional | Sí (requerido) |
Si estás enfrentando un challenge de Cloudflare de página completa (no un widget integrado), necesitas el Solucionador de Cloudflare Challenge: devuelve una cookie qa_validation_cookie y requiere un proxy.
Preguntas frecuentes
¿Por qué falla Turnstile incluso cuando la solicitud parece correcta?
Las tres causas más comunes: (1) el pageurl es ligeramente incorrecto, especialmente en las páginas de desafío de Cloudflare, (2) la clave del sitio se capturó del elemento incorrecto o (3) el token se está inyectando en el campo o ruta de devolución de llamada incorrectos.
¿Cuál es el error de torniquete más común?
Usar la URL de la página exacta incorrecta. Los tokens de torniquete están estrechamente vinculados al contexto de la página; incluso una ruta diferente o un parámetro de consulta faltante pueden provocar un rechazo.
¿Qué significa CAPCHA_NOT_READY?
La solución aún está en proceso. Espere 5 segundos y vuelva a sondear. Las soluciones de torniquete normalmente se completan en menos de 10 segundos.
¿Qué debo hacer si la API devuelve un token pero la página aún lo rechaza?
- Verifique que
pageurlcoincida con la página exacta donde se carga el widget. - Compruebe si la página espera el token en
cf-turnstile-response,g-recaptcha-responseo ambos. - Compruebe si la página utiliza una función de devolución de llamada en lugar de (o además de) un campo oculto.
- Asegúrese de que la ficha se use solo una vez: las fichas de torniquete son de un solo uso.
¿CaptchaAI admite proxies para Turnstile?
Sí. Agregue proxy y proxytype a su solicitud. Los proxies son opcionales para los widgets independientes de Turnstile, pero se recomiendan en las páginas de desafíos de Cloudflare.
¿Cuál es la diferencia entre torniquete y Cloudflare Challenge?
Turnstile es un widget integrado que devuelve un token. Cloudflare Challenge es una verificación de página completa que devuelve una cookie qa_validation_cookie. Utilizan diferentes métodos API y diferentes patrones de integración, aunque ambos son productos de Cloudflare.
Arregla tu flujo de trabajo de Turnstile
Si su integración de Turnstile falla:
- Verifique la clave del sitio: extráigala de
data-sitekeyoturnstile.render() - Verifique la URL de la página: utilice la URL exacta, incluido el protocolo y la ruta.
- Verifique la ruta del token: ¿la página utiliza
cf-turnstile-response,g-recaptcha-responseo una devolución de llamada? - Utilice
json=1: utilice siempre respuestas JSON al sondear los resultados de Turnstile - No reutilice tokens: solicite una solución nueva para cada envío
Comience con elCaptchaAI Solucionador de torniquetes, verifique sus parámetros con losDocumentos APIy leerCómo funciona Cloudflare Turnstilesi necesita información sobre la mecánica del widget.
Registro de iteración
| Iteración | Enfoque | Cambios |
|---|---|---|
| Borrador 1 | Estructura y contenido | Borrador inicial de solución de problemas: 3 etapas de error, tabla de errores para corregir, preguntas frecuentes |
| Borrador 2 | Precisión técnica | Códigos de error verificados, parámetros de torniquete y rutas de tokens con captchaai.com/api-docs. Se agregaron tablas de parámetros. Confirmado method=turnstile y ambos campos cf-turnstile-response / g-recaptcha-response. |
| Borrador 3 | Código y profundidad de inyección. | Se agregaron ejemplos de resolución de Python y Node.js. Se agregaron métodos de extracción de claves de sitio (3 enfoques). Se agregó código de inyección de selenio para ambos campos de token. Se agregó un código de detección de devolución de llamada. |
| Borrador 4 | Contenido de diferenciación | Se agregó una tabla comparativa de torniquetes y Cloudflare Challenge. Se agregó la nota de requisito json=1 para user_agent. Se agregó una técnica de interceptación de renderizado para claves de sitio dinámicas. |
| Borrador 5 | Pulido final de control de calidad | Todos los códigos de error verificados coinciden con los documentos oficiales. Se agregó una tabla de referencia rápida. Introducción apretada. Se agregó una advertencia de token de un solo uso. Enlaces cruzados confirmados a artículos del grupo. Las respuestas a las preguntas frecuentes están listas para el esquema. |
Resumen de activos visuales
Imagen de héroe
- Texto alternativo: El desarrollador soluciona errores Cloudflare Turnstile: flujo de solicitudes, inyección de token y fallas de validación
- Debe mostrar: Flujo de solución de problemas técnicos con etapas de error y rutas de solución
- Nombre de archivo: cloudflare-turnstile-errors-troubleshooting-hero.png
Visual 1 en el artículo
- Ubicación: Después de "Errores en la etapa de resultados"
- Tipo: Árbol de decisión
- Texto alternativo: Árbol de decisión para fallas de Cloudflare Turnstile: errores de solicitud versus errores de sondeo versus rechazo de página
- Nombre de archivo: cloudflare-turnstile-error-decision-tree.png
Visual 2 en el artículo
- Ubicación: Después de "Errores de validación de la página de destino"
- Tipo: Diagrama de causas y soluciones
- Texto alternativo: Diagrama que muestra por qué se rechazan los tokens Turnstile y la solución para cada causa.
- Nombre de archivo: cloudflare-turnstile-validation-causes-fixes.png
Artículos relacionados
- Cloudflare Challenge vs Turnstile: cómo detectar
- Cloudflare Turnstile 403 después del token: solución
- Cómo resolver Cloudflare Turnstile usando API