CAPSOLVER
Blog
Cómo resolver Cloudflare Turnstile en agentes de LlamaIndex

Cómo resolver Cloudflare Turnstile en LlamaIndex Agentes

Logo of CapSolver

Aloísio Vítor

How to use CapSolver

27-Aug-2026

TL;DR

  • Envolver una función estrecha de CapSolver Turnstile con FunctionTool.from_defaults() de LlamaIndex.
  • Usar la tarea documentada AntiTurnstileTaskProxyLess con la URL exacta de la página y la clave del sitio.
  • Enviar action y cdata solo cuando la página autorizada exponga estos valores opcionales.
  • Devolver el token de solución al código de navegador determinista en lugar de almacenarlo en la memoria del agente de largo plazo.
  • Añadir validación de host aprobado, un reintento limitado, redacción de trazas y una rama de revisión humana antes de la producción.

Introducción

La forma más segura de resolver Cloudflare Turnstile en agentes de LlamaIndex es exponer CapSolver como una herramienta de función tipada, manteniendo el estado del navegador, secretos y verificaciones de autorización fuera del modelo. LlamaIndex puede decidir que un desafío compatible bloquea el siguiente paso aprobado, pero Python determinista debe validar el objetivo, construir la tarea documentada AntiTurnstileTaskProxyLess y devolver un token de solución de corta duración al controlador del navegador. Esto sigue la arquitectura de agentes de CapSolver: el modelo decide, el adaptador de herramientas define la acción y la capa de resolución principal la ejecuta. Esta guía muestra los campos exactos de Turnstile, una implementación de FunctionTool de LlamaIndex, un flujo de trabajo de FunctionAgent, el intercambio seguro de tokens, reintentos limitados y controles de uso responsable para QA, RPA y automatización de navegadores permitidos.

¿Por qué FunctionTool de LlamaIndex es una buena opción?

LlamaIndex trata las herramientas como APIs orientadas al agente. Su documentación oficial de herramientas explica que FunctionTool puede envolver funciones Python sincrónicas o asincrónicas e inferir un esquema a partir de la firma de la función. El nombre de la herramienta, la descripción, las anotaciones y el docstring influyen en cuándo el modelo la llama.

Esta frontera es útil para la recuperación de desafíos porque el modelo nunca debe generar código de resolución arbitrario ni recibir una clave de API de CapSolver. Una función estrecha puede aceptar solo una URL de página aprobada, una clave de sitio de Turnstile y metadatos opcionales del widget.

El blog de CapSolver AI cubre integraciones de agentes, mientras que la FAQ de CapSolver AI y automatización explica cómo la recuperación de desafíos complementa una pila de agentes existente.

Comprender la Tarea Oficial de Turnstile

La documentación de Cloudflare Turnstile de CapSolver especifica AntiTurnstileTaskProxyLess. La tarea requiere websiteURL y websiteKey. Los metadatos opcionales pueden incluir los valores action y cdata del widget.

Campo Requerido Fuente Propósito
type Fijo AntiTurnstileTaskProxyLess
websiteURL Página actual aprobada Asocia la solución con la página
websiteKey Widget de Turnstile Identifica la configuración del widget
metadata.action No data-action Conserva un valor de acción del widget
metadata.cdata No data-cdata Conserva datos del cliente utilizados por el widget

CapSolver admite automáticamente presentaciones gestionadas, no interactivas e invisibles de Turnstile, por lo que la tarea no necesita un subtipo. La documentación de Turnstile de Cloudflare describe el widget y el proceso de validación del lado del servidor utilizado por el propietario del sitio.

Instalar LlamaIndex y CapSolver

bash Copy
pip install llama-index llama-index-llms-openai capsolver

Para la arquitectura de agente de CapSolver proporcionada en la documentación del usuario, instale también los paquetes principales y de agente:

bash Copy
pip install git+https://github.com/capsolver-ai/capsolver-core.git
pip install git+https://github.com/capsolver-ai/capsolver-agent.git

Configure secretos fuera del prompt:

bash Copy
export CAPSOLVER_API_KEY="CAP-xxxxxxxxxxxxxxxx"
export OPENAI_API_KEY="sk-xxxxxxxxxxxxxxxx"

El ejemplo de SDK directo a continuación utiliza los campos exactos de la tarea de Turnstile. LlamaIndex suministra el marco; CapSolver realiza la tarea.

Crear una Función Tipada de Turnstile

Valide la URL antes de enviarla a CapSolver. El modelo no debe poder seleccionar un hostname arbitrario.

python Copy
import os
from typing import Annotated
from urllib.parse import urlparse

import capsolver

capsolver.api_key = os.environ["CAPSOLVER_API_KEY"]

ALLOWED_HOSTS = {
    "staging.example.com",
    "qa.example.com",
}


def solve_turnstile(
    website_url: Annotated[str, "Página HTTPS aprobada que contiene Turnstile"],
    website_key: Annotated[str, "Clave exacta del sitio de Turnstile de la página"],
    action: Annotated[str, "Valor opcional de data-action"] = "",
    cdata: Annotated[str, "Valor opcional de data-cdata"] = "",
) -> dict:
    """Resolver Cloudflare Turnstile para una página aprobada y devolver un token."""
    parsed = urlparse(website_url)
    if parsed.scheme != "https" or parsed.hostname not in ALLOWED_HOSTS:
        return {
            "success": False,
            "error": "El objetivo está fuera de la lista de hosts aprobados",
        }

    if not website_key.startswith("0x4"):
        return {
            "success": False,
            "error": "Formato inesperado de clave de sitio de Turnstile",
        }

    task = {
        "type": "AntiTurnstileTaskProxyLess",
        "websiteURL": website_url,
        "websiteKey": website_key,
    }

    metadata = {}
    if action:
        metadata["action"] = action
    if cdata:
        metadata["cdata"] = cdata
    if metadata:
        task["metadata"] = metadata

    try:
        solution = capsolver.solve(task)
        token = solution.get("token")
        if not token:
            return {"success": False, "error": "No se devolvió un token"}
        return {
            "success": True,
            "token": token,
            "solution_type": solution.get("type", "turnstile"),
        }
    except Exception as exc:
        return {"success": False, "error": str(exc)}

La verificación de formato es una advertencia temprana útil, pero no reemplaza la extracción exacta de parámetros de la página autorizada. Use la guía del complemento de navegador de CapSolver cuando necesite inspeccionar la configuración de un widget durante el desarrollo.

Envolver la Función con LlamaIndex

FunctionTool.from_defaults() convierte la firma de la función y el docstring en un esquema de herramienta de agente.

python Copy
from llama_index.core.tools import FunctionTool

turnstile_tool = FunctionTool.from_defaults(
    fn=solve_turnstile,
    name="solve_turnstile",
    description=(
        "Resolver Cloudflare Turnstile solo para una página HTTPS aprobada. "
        "Use la URL exacta de la página, la clave del sitio y los valores "
        "opcionales action/cdata proporcionados por el controlador de navegador confiable."
    ),
)

Mantenga el nombre corto y la descripción operativa. No describa la herramienta como un mecanismo de acceso general. El modelo debe entender que es una acción de recuperación dentro de un flujo ya aprobado.

Añadir la Herramienta a un LlamaIndex FunctionAgent

El FunctionAgent de LlamaIndex utiliza la capacidad de llamada de herramientas de un LLM para elegir y ejecutar herramientas.

python Copy
from llama_index.core.agent.workflow import FunctionAgent
from llama_index.llms.openai import OpenAI

llm = OpenAI(model="gpt-4o-mini", temperature=0)

agent = FunctionAgent(
    tools=[turnstile_tool],
    llm=llm,
    system_prompt=(
        "Usted opera solo en flujos de navegador aprobados. "
        "Llame a solve_turnstile solo cuando la aplicación confiable proporcione "
        "una URL de página exacta y una clave. Nunca invente objetivos, claves, "
        "acciones o cdata. Llame a la herramienta una vez. Si falla, deténgase y "
        "solicite revisión del operador."
    ),
)

Inicie la ejecución con parámetros producidos por código de navegador determinista:

python Copy
import asyncio

async def main():
    response = await agent.run(
        "El flujo de trabajo de staging aprobado encontró Turnstile en "
        "https://staging.example.com/account-check con la clave de sitio "
        "0x4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA y la acción "
        "account_check. Llame a la herramienta registrada una vez y devuelva "
        "el resultado estructurado."
    )
    print(response)

asyncio.run(main())

En producción, evite construir este mensaje directamente a partir de texto no confiable. El controlador de navegador debe extraer, validar y serializar los valores.

Mantener el Consumo de Tokens Fuera del Modelo

Un token de Turnstile es de corta duración y está vinculado al flujo del sitio. Páselo directamente desde el resultado de la herramienta confiable al código de navegador determinista cuando sea posible.

python Copy
async def apply_turnstile_token(page, token: str) -> None:
    await page.evaluate(
        """
        (token) => {
          const field = document.querySelector(
            'input[name="cf-turnstile-response"]'
          );
          if (!field) {
            throw new Error('Campo de respuesta de Turnstile no encontrado');
          }
          field.value = token;
          field.dispatchEvent(new Event('input', { bubbles: true }));
          field.dispatchEvent(new Event('change', { bubbles: true }));
        }
        """,
        token,
    )

Algunas aplicaciones usan renderizado basado en callbacks o envío gestionado por el servidor. Pruebe contra su propia aplicación de staging y siga su integración admitida. La documentación de Siteverify de Cloudflare explica que el propietario del sitio valida el token del lado del servidor.

La guía de Turnstile de CapSolver proporciona contexto de implementación, y la FAQ de solución de problemas de CapSolver ayuda a diagnosticar soluciones rechazadas.

Añadir un Único Reintento Limitado

No permita que un agente se ejecute indefinidamente. Clasifique los fallos de validación como finales y permita como máximo un reintento para un tiempo de espera transitorio.

python Copy
import asyncio

async def solve_with_policy(params: dict) -> dict:
    last_error = "error desconocido"

    for attempt in range(1, 3):
        result = solve_turnstile(**params)
        if result.get("success"):
            return {**result, "attempt": attempt}

        last_error = result.get("error", last_error)
        normalized = last_error.lower()
        if "allowlist" in normalized or "site-key" in normalized:
            break
        if attempt == 1:
            await asyncio.sleep(2)

    return {
        "success": False,
        "error": last_error,
        "requires_operator_review": True,
    }

Registre el hostname, tipo de tarea, duración, número de intentos y resultado normalizado. Nunca registre el token completo, clave de API, cookies o contenido de formularios.

Modo Mejor para Entrada Salida
Modo de token URL y clave de sitio de Turnstile conocidos URL, clave, metadatos opcionales Token de solución
Modo de navegador Widgets dinámicos en una sesión de Playwright existente Objeto de página en vivo Resultado de recuperación de página
Revisión humana Fallo repetido o estado no admitido Error y referencia de captura de pantalla redactados Decisión del operador

La documentación del agente de CapSolver proporcionada por el usuario mapea solve_captcha a la resolución de token principal y solve_on_page a la recuperación del navegador. Si la página es dinámica, instale el complemento de navegador y mantenga la sesión de navegador original intacta:

bash Copy
pip install "capsolver-agent[browser] @ git+https://github.com/capsolver-ai/capsolver-agent.git"

Use las tutoriales de automatización de CapSolver para flujos de trabajo de navegador relacionados y la página de productos de CapSolver para categorías de soluciones admitidas.

Código adicional: Use el código WEBS en el Panel de CapSolver para obtener un 5% adicional en cada recarga.

Control en Producción

Una integración de Turnstile de LlamaIndex en producción debe usar un registro de hosts aprobados, almacenamiento de secretos aislado, intercambio de tokens de corta duración, un reintento limitado, redacción de trazas, revisión por operador y una separación estricta entre automatización de solo lectura y acciones de alto impacto.

Control Implementación recomendada
Permisos de objetivo Lista de hosts HTTPS específica del inquilino
Fuente de parámetros Controlador de navegador confiable
Almacenamiento de secretos Solo en entorno del ejecutor
Políticas de reintento Un reintento para errores transitorios
Manejo de tokens Entrega directa al navegador; sin almacenamiento a largo plazo
Registro Redactar tokens y cookies
Acciones finales Requerir confirmación para envíos o cambios

La FAQ de resolución de CAPTCHA de CapSolver explica el ciclo de vida de la tarea, y la FAQ de raspado web de CapSolver cubre consideraciones operativas.

Uso Responsable

Use esta integración solo en aplicaciones que posea, pruebe o tenga permiso explícito para automatizar. La resolución de desafíos no otorga autorización para acceder a datos privados, crear cuentas, enviar transacciones o ignorar términos del sitio. Aplicar límites de tasa, mantener un registro de auditoría y requerir confirmación antes de cualquier acción que cambie datos o afecte a usuarios.

Conclusión

Para resolver Cloudflare Turnstile de manera confiable en LlamaIndex, haga que CapSolver sea una FunctionTool estrecha y mantenga la autorización, secretos, reintentos y consumo de tokens en código determinista. El agente de LlamaIndex decide cuándo se necesita recuperación, la herramienta crea la tarea documentada AntiTurnstileTaskProxyLess, y el navegador reanuda el mismo flujo aprobado con el token devuelto.

Comience con CapSolver, valide la integración contra una página de staging que controle y agregue listas de hosts y redacción de trazas antes de la producción.

Preguntas Frecuentes

¿Qué clase de herramienta de LlamaIndex debo usar?

Use FunctionTool.from_defaults() para envolver una función Python sincrónica o asincrónica tipada. Para un modelo de llamada de herramientas, pase la herramienta resultante a FunctionAgent.

¿Requiere la tarea de Turnstile un proxy?

La tarea documentada AntiTurnstileTaskProxyLess usa el camino de tarea sin proxy de CapSolver, por lo que no debe proporcionar un proxy en la tarea.

¿Qué campos son obligatorios?

websiteURL y websiteKey son obligatorios. Incluya metadata.action y metadata.cdata solo cuando el widget autorizado los exponga.

¿Debe almacenarse el token en la memoria de LlamaIndex?

No. Prefiera la entrega directa al código de navegador confiable y devuelva solo un estado de éxito o fallo redactado al agente.

¿Qué debe ocurrir tras un fallo repetido?

Verifique la URL, la clave del sitio, los metadatos opcionales y el estado de la página. Tras un reintento limitado, deténgase y redirija el flujo a la revisión del operador.

Aviso de Cumplimiento: La información proporcionada en este blog es solo para fines informativos. CapSolver se compromete a cumplir con todas las leyes y regulaciones aplicables. El uso de la red de CapSolver para actividades ilegales, fraudulentas o abusivas está estrictamente prohibido y será investigado. Nuestras soluciones para la resolución de captcha mejoran la experiencia del usuario mientras garantizan un 100% de cumplimiento al ayudar a resolver las dificultades de captcha durante el rastreo de datos públicos. Fomentamos el uso responsable de nuestros servicios. Para obtener más información, visite nuestros Términos de Servicio y Política de Privacidad.

Máse

Tutorial del Registro Oficial de CapSolver MCP que muestra el registro, el comando uvx, la variable de clave de API y el estado activo de stdio
Cómo instalar CapSolver MCP desde el Registro Oficial MCP

Busca CapSolver MCP en el Registro Oficial de MCP, instala la versión 0.1.3 con uvx o pip, configura un cliente local y verifica las herramientas stdio.

ai
Logo of CapSolver

Aloísio Vítor

18-Sep-2026

Herramientas Pydantic AI CAPTCHA: Entradas digitadas y resultados del solucionador
Herramientas Pydantic de IA CAPTCHA: Entradas digitadas y resultados del resolutor

Agrega herramientas de CAPTCHA a Pydantic AI utilizando el adaptador oficial de CapSolver, prueba la ejecución de la herramienta localmente y maneja entradas con tipo y resultados estructurados del solucionador.

ai
Logo of CapSolver

Aloísio Vítor

18-Sep-2026

Las interfaces MCP y CLI conectadas a un servicio de herramienta de agente de IA
MCP vs CLI para Agentes de IA: Costo de Contexto y Manejo de Fallos

Compara las interfaces MCP y CLI para agentes de IA en descubrimiento de herramientas, costo de contexto, seguridad, depuración, manejo de fallos y arquitectura híbrida.

ai
Logo of CapSolver

Aloísio Vítor

18-Sep-2026

El agente de navegador de IA selecciona el formulario deseado, coincide con su widget CAPTCHA y verifica el resultado de la presentación.
Cómo manejar múltiples CAPTCHA widgets en agentes de navegador de IA

Manejar múltiples widgets CAPTCHA en una sola página con propiedad explícita del formulario, parámetros del solucionador, enrutamiento de resultados y verificaciones para la acción del agente de IA deseada.

ai
Logo of CapSolver

Lucas Mitchell

15-Sep-2026

Agentes de IA vs Scripts: Cómo elegir para la automatización web con un diagrama de las principales decisiones
Agentes de IA vs. Scripts: Cómo elegir para la automatización web

Elija entre agentes de IA, scripts y automatización híbrida de web según la incertidumbre de la tarea, testabilidad, costo y los controles necesarios para una ejecución fiable.

ai
Logo of CapSolver

Lucas Mitchell

11-Sep-2026

CapSolver MCP Server conectando un agente de inteligencia artificial a cinco herramientas de automatización
CapSolver MCP Server Está ahora disponible para Agentes de IA

Instale el servidor CapSolver MCP desde PyPI y proporcione a los agentes de inteligencia artificial compatibles cinco herramientas para el manejo de CAPTCHA autorizado a través del Protocolo de Contexto de Modelo.

ai
Logo of CapSolver

Aloísio Vítor

10-Sep-2026