CAPSOLVER
Blog
Cómo integrar CapSolver con la automatización del navegador de Composio AI

Cómo integrar CapSolver con la automatización del navegador de Composio AI

Logo of CapSolver

Aloísio Vítor

How to use CapSolver

17-Aug-2026

Resumen

  • Envuelva el flujo completo de la página de Playwright — abrir, resolver, aplicar el resultado, enviar y verificar — en una herramienta personalizada de Composio que el SDK de Agentes de OpenAI pueda llamar desde instrucciones en lenguaje natural.
  • El ejemplo cubre dos tipos de desafíos: reCAPTCHA v2 con un token devuelto e imagen de CAPTCHA reconocida con ImageToTextTask, registradas como herramientas separadas en una misma sesión.
  • El flujo se conecta directamente a la API oficial de OpenAI y utiliza Playwright para la automatización del navegador.
  • Dos fallas comunes de integración son una clave de Composio sin permiso sessions: write, que devuelve 403, y la falta de una anotación BaseModel de Pydantic en el primer parámetro de la herramienta, que activa un ValidationError.

1. Introducción

Este guía integra CapSolver con Composio como una herramienta de agente que completa un flujo de reCAPTCHA v2. En lugar de devolver solo un token, la herramienta ejecuta la secuencia completa de la página y trata la respuesta real de la página como la condición de éxito. SDK de Agentes de OpenAI decide cuándo llamar a la herramienta, mientras que automatización del navegador de Playwright preserva el contexto de la página utilizado para la presentación y verificación.

Use este patrón solo para flujos legales, razonables, responsables y autorizados por el usuario. La capacidad técnica no otorga permiso para acceder a datos privados, restringidos, sensibles o no autorizados; revise la guía de automatización de IA antes de la implementación.

Flujo de trabajo:

text Copy
Ejecute el script
  -> El SDK de Agentes de OpenAI decide qué herramienta llamar
  -> Herramienta personalizada de Composio: complete_recaptcha_v2
       -> Playwright abre la página
       -> capsolver.solve(...) devuelve gRecaptchaResponse
       -> Aplicar el token a g-recaptcha-response
       -> Playwright envía y espera la página
       -> Leer la página y determinar aceptado
  -> La herramienta devuelve {"accepted": ..., "message": ...}
  -> El agente informa el resultado de accepted

Los componentes tienen las siguientes responsabilidades:

Componente Responsabilidad
SDK de Agentes de OpenAI Entiende las instrucciones en lenguaje natural, decide cuándo llamar a la herramienta, la ejecuta y organiza la respuesta
Composio Registra una función de Python estándar como una herramienta llamable por el agente
Playwright Abre la página, aplica el resultado, envía el formulario y lee el estado de la página resultante
SDK de CapSolver Devuelve el resultado de la CAPTCHA a través de una llamada única solve()

2. Inicio rápido

bash Copy
pip install composio composio-openai-agents openai-agents capsolver pydantic playwright
playwright install chromium

Cada dependencia sirve un rol específico:

Paquete Propósito
composio Crea sesiones y registra o carga herramientas personalizadas
composio-openai-agents Convierte herramientas de Composio en objetos que los Agentes de OpenAI pueden llamar
openai-agents Proporciona Agent, Runner y memoria multi-turno de SQLite
capsolver Proporciona el SDK oficial y devuelve un resultado a través de solve()
pydantic Define el esquema de entrada de la herramienta
playwright Abre páginas, aplica resultados, envía formularios y lee respuestas

3. Configuración

python Copy
# Claves de API.
COMPOSIO_API_KEY = "ak_..."
OPENAI_API_KEY = "sk-..."          # Su clave oficial de API de OpenAI.
os.environ["OPENAI_API_KEY"] = OPENAI_API_KEY   # El SDK de OpenAI lee la clave desde el entorno.

# Configure CapSolver y Composio.
capsolver.api_key = "CAP-..."
composio = Composio(
    api_key=COMPOSIO_API_KEY,
    provider=OpenAIAgentsProvider(),
)

Notas de configuración: OPENAI_API_KEY debe escribirse en el entorno porque el SDK la lee allí; OpenAIAgentsProvider hace que las herramientas devueltas por session.tools() sean compatibles con Agent; y la clave de Composio necesita permiso sessions: write o la creación de sesión devuelve 403.

La actual proveedor de OpenAI de Composio y SDK de Agentes de OpenAI explican el límite del proveedor y agente utilizado por esta configuración.

Canjea tu código de bonificación de CapSolver

¡Aumenta tu presupuesto de automatización de inmediato!
Usa el código de bonificación CAP26 al recargar tu cuenta de CapSolver para obtener un 5% adicional de bonificación en cada recarga — sin límites.
Canjéalo ahora en tu Panel de CapSolver
Código de bonificación

4. Implementación principal

Condición de parada: la herramienta reporta éxito solo cuando la página contiene el texto de éxito esperado. El bloque finally cierra el navegador en ambos caminos de éxito y fallo.

python Copy
import os
from typing import List, cast
import capsolver
from agents import Agent, Runner, SQLiteSession
from composio import Composio
from composio.core.models.custom_tool import CustomTool
from composio.core.models.tool_router import ToolRouterExperimentalConfig
from composio_openai_agents import OpenAIAgentsProvider
from playwright.sync_api import sync_playwright
from pydantic import BaseModel, Field

# Claves de API.
COMPOSIO_API_KEY = "ak_..."
OPENAI_API_KEY = "sk-..."          # Su clave oficial de API de OpenAI.
os.environ["OPENAI_API_KEY"] = OPENAI_API_KEY

# Configure CapSolver y Composio.
capsolver.api_key = "CAP-..."
composio = Composio(
    api_key=COMPOSIO_API_KEY,
    provider=OpenAIAgentsProvider(),
)


# Esquema de entrada para la herramienta personalizada; Composio requiere un BaseModel de Pydantic aquí.
class CompleteRecaptchaInput(BaseModel):
    target_url: str = Field(
        default="https://www.google.com/recaptcha/api2/demo",
        description="URL de la página que contiene el demo de reCAPTCHA v2",
    )
    website_key: str = Field(
        default="6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-",
        description="Clave de sitio de reCAPTCHA v2 del sitio actual",
    )


# Registre todo el flujo como una herramienta de Composio que el agente puede llamar.
# La anotación del tipo del primer parámetro es requerida por Composio para inferir el esquema.
@composio.experimental.tool(preload=True)
def complete_recaptcha_v2(input: CompleteRecaptchaInput, _ctx):
    """Abra la página con Playwright, resuelva reCAPTCHA v2, envíe y verifique."""
    with sync_playwright() as p:
        browser = p.chromium.launch(headless=False)  # Establezca headless=True para ocultar la ventana.
        page = browser.new_page()
        try:
            page.goto(input.target_url)
            # Pida a CapSolver que resuelva el desafío reCAPTCHA v2.
            solution = capsolver.solve(
                {
                    "type": "ReCaptchaV2TaskProxyLess",
                    "websiteURL": input.target_url,
                    "websiteKey": input.website_key,
                }
            )
            token = solution.get("gRecaptchaResponse")
            page.evaluate(
                """
                (token) => {
                    const textarea = document.getElementById('g-recaptcha-response');
                    if (textarea) {
                        textarea.value = token;
                    }
                }
                """,
                token,
            )
            page.click("#recaptcha-demo-submit")
            page.wait_for_load_state("networkidle")
            result_page = page.content()
            # Éxito solo si la página muestra realmente el texto de éxito
            accepted = "Verification Success" in result_page
            return {
                "accepted": accepted,
                "message": (
                    "Verification Success"
                    if accepted
                    else "La página no informó Verification Success"
                ),
            }
        finally:
            browser.close()
def main():
    experimental: ToolRouterExperimentalConfig = {
        "custom_tools": cast(List[CustomTool], [complete_recaptcha_v2]),
    }
    session = composio.sessions.create(
        user_id="playwright-recaptcha-demo-user",
        experimental=experimental,
        sandbox={"enable": False},  # Ejecute la herramienta en este proceso, no en un sandbox.
    )
    agent = Agent(
        name="Asistente de reCAPTCHA de Playwright",
        instructions=(
            "Cuando el usuario pida ejecutar el demo, llame a complete_recaptcha_v2 "
            "con sus valores predeterminados. Informe éxito solo cuando accepted sea verdadero."
        ),
        model="gpt-5.2",
        tools=session.tools(),
    )
    # Memoria para conversación multi-turno
    memory = SQLiteSession("conversation")
    print("Demo de Composio + reCAPTCHA v2 de Playwright en ejecución...")
    user_input = (
        "Llame a complete_recaptcha_v2 ahora con sus valores predeterminados de target_url "
        "y website_key. No pida confirmación."
    )
    result = Runner.run_sync(
        starting_agent=agent,
        input=user_input,
        session=memory,
    )
    print(f"Asistente: {result.final_output}\n")
if __name__ == "__main__":
    main()

5. Reconocimiento de CAPTCHA de imagen con ImageToTextTask

El mismo patrón puede manejar una CAPTCHA estándar de imagen-texto registrando una segunda herramienta de Composio. Este ejemplo utiliza el demo de CAPTCHA de BotDetect: el elemento de imagen es #demoCaptcha_CaptchaImage, el campo de entrada es #captchaCode y el botón de validación es #validateCaptchaButton.

Imagen de CAPTCHA de BotDetect, entrada y elementos de validación inspeccionados en el navegador

La solicitud ImageToTextTask envía la imagen en base64 a través de body. A diferencia de las tareas basadas en tokens, esta tarea devuelve directamente el texto reconocido y no requiere un bucle de sondeo separado.

5.1 Lea la imagen como Base64

python Copy
image_src = page.locator("#demoCaptcha_CaptchaImage").get_attribute("src")
if not image_src or "," not in image_src:
    raise RuntimeError("No se encontró una URL de datos de imagen CAPTCHA válida")
base64_image = image_src.split(",", 1)[1]  # Elimine el prefijo "data:image/...;base64,"

5.2 Implementación de la herramienta personalizada

python Copy
class CompleteImageCaptchaInput(BaseModel):
    target_url: str = Field(
        default="https://captcha.com/demos/features/captcha-demo.aspx",
        description="URL de la página de demostración de CAPTCHA de imagen",
    )
    module: str = Field(
        default="common",
        description="Módulo de reconocimiento ImageToTextTask de CapSolver",
    )

@composio.experimental.tool(preload=True)
def complete_image_captcha(input: CompleteImageCaptchaInput, _ctx):
    """Abra la página con Playwright, reconozca la CAPTCHA de imagen, envíe y verifique."""
    with sync_playwright() as p:
        browser = p.chromium.launch(headless=False)
        page = browser.new_page()
        try:
            page.goto(input.target_url)
            page.wait_for_selector("#demoCaptcha_CaptchaImage", state="visible")

            # La src de la imagen ya es una URL de datos; elimine el prefijo para obtener Base64.
            image_src = page.locator("#demoCaptcha_CaptchaImage").get_attribute("src")
            if not image_src or "," not in image_src:
                raise RuntimeError("No se encontró una URL de datos de imagen CAPTCHA válida")
            base64_image = image_src.split(",", 1)[1]
            solution = capsolver.solve(
                {
                    "type": "ImageToTextTask",
                    "websiteURL": input.target_url,
                    "module": input.module,
                    "body": base64_image,
                }
            )
            captcha_text = solution.get("text")
            if not isinstance(captcha_text, str) or not captcha_text:
                raise RuntimeError("CapSolver no devolvió texto reconocido")
            page.fill("#captchaCode", captcha_text)      # Escriba el resultado en #captchaCode.
            page.click("#validateCaptchaButton")
            page.wait_for_load_state("networkidle")
            result_page = page.content()
            # La página de demostración muestra "Correct!" en éxito, "Incorrect!" en fallo.
            accepted = "Correct!" in result_page
            return {
                "accepted": accepted,
                "recognized_text": captcha_text,
                "message": "Correct!" if accepted else "La página no informó Correct!",
            }
        finally:
            browser.close()

Resumen del flujo:

text Copy
Playwright abre la página de CAPTCHA
  -> Esperar a que #demoCaptcha_CaptchaImage sea visible
  -> Leer src (URL de datos) y eliminar el prefijo para obtener Base64
  -> capsolver.solve(ImageToTextTask) devuelve texto
  -> page.fill escribe el resultado en #captchaCode
  -> page.click activa #validateCaptchaButton
  -> page.content comprueba Correct! o Incorrect!
  -> finally cierra el navegador

5.3 Elija el modelo de reconocimiento adecuado

El parámetro module es opcional y predeterminado a common. Si la CAPTCHA contiene solo números, use number. Los estilos especiales pueden usar un modelo independiente documentado cuando sea apropiado.

Ejemplos de modelos independientes de ImageToTextTask de CapSolver y valores de precisión

Por ejemplo, use el siguiente código sin cambios para el reconocimiento solo numérico:

python Copy
solution = capsolver.solve({
    "type": "ImageToTextTask",
    "module": "number",
    "images": [base64_image],
})

answers = solution["answers"]

El modelo number admite múltiples imágenes en una sola entrega, y images puede contener hasta nueve cadenas en base64. Los nombres de los modelos admitidos y los casos de uso se enumeran en la página ImageToTextTask de CapSolver.

6. Solución de problemas

6.1 El primer parámetro de la herramienta debe ser un BaseModel

text Copy
experimental.tool: el primer parámetro de "complete_recaptcha_v2" debe estar anotado con una subclase de BaseModel de Pydantic. Obtenido: <class 'inspect._empty'>

Composio infiere el esquema de entrada del primer parámetro de la anotación de tipo, por lo que input: CompleteRecaptchaInput no puede omitirse. Esta es una anotación funcional, no una pista de tipo opcional. La referencia BaseModel de Pydantic describe el tipo de modelo utilizado para el esquema.

6.2 Composio devuelve 403

La creación de sesión puede devolver el siguiente error:

text Copy
403 APIKey_InsufficientPermissions
Esta ruta requiere acceso de escritura a "sessions"

La causa es que composio.sessions.create() requiere acceso de escritura al project-key para sesiones, mientras que la clave actual tiene acceso de solo lectura. La clave es válida, pero su alcance es insuficiente, por lo que la respuesta es 403 en lugar de 401.

Pasos para resolver:

  1. Abra el tablero de Composio y vaya a la configuración de claves de API para el proyecto correspondiente.
  2. Cambie el permiso de sesiones de la clave actual de lectura a escritura.
  3. Si no se puede editar el permiso, cree una nueva clave con sessions: write y reemplace COMPOSIO_API_KEY en la parte superior del script.
  4. Ejecute el script nuevamente. Llegar al flujo interactivo sin recibir 403 confirma que el permiso está activo.

7. Conclusión y CTA

El núcleo de esta integración es un flujo de trabajo empresarial completo empaquetado como una herramienta de Composio:

text Copy
Herramienta de Composio = Acciones de página de Playwright + resultado de CapSolver + verificación del estado de la página
  • Composio convierte la función de Python en una herramienta de agente y maneja la inferencia de esquema y la ejecución.
  • Playwright abre la página, aplica el resultado, envía el formulario y lee el estado final.
  • CapSolver maneja reCAPTCHA v2 y la reconocimiento de CAPTCHA de imagen para este flujo de trabajo específico.

Ejecute el ejemplo solo en páginas y procesos que usted posea o esté autorizado a automatizar. Use variables de entorno o un gestor de secretos para las credenciales, deténgase cuando la página no alcance el estado empresarial esperado y revise los errores repetidos en lugar de reintentar indefinidamente.

Para un flujo de trabajo de agente autorizado de Composio que necesite una capa de infraestructura de CAPTCHA enfocada, pruebe CapSolver con sus propias páginas controladas y verifique el resultado de la aplicación después de cada resolución.

Preguntas frecuentes

¿Qué maneja Composio en esta integración?

Composio registra la función de Python como una herramienta personalizada llamable por un agente, crea la sesión, expone el esquema de la herramienta y enruta la ejecución desde el agente de OpenAI.

¿Por qué el primer parámetro de la herramienta debe ser un Pydantic BaseModel?

Composio usa esta anotación para inferir el esquema de entrada de la herramienta. Omitirla impide la construcción del esquema y genera un error de validación antes de que comience el flujo del navegador.

¿La herramienta reCAPTCHA v2 se detiene después de que CapSolver devuelve un token?

No. El código sin cambios aplica el token, envía el formulario de demostración, lee el HTML resultante y reporta éxito solo cuando la página contiene el texto de Verificación Exitosa esperado.

¿Requiere ImageToTextTask un bucle de sondeo separado?

No. En este flujo de trabajo, el SDK oficial devuelve el texto reconocido directamente. La herramienta luego completa el campo de entrada, envía la página y verifica "Correcto!" como condición de detención.

¿Puede usarse este flujo en cualquier sitio web?

No. úselo solo para automatización legal, razonable, responsable y autorizada por el usuario. Respete los términos del sitio, las leyes aplicables, los límites de frecuencia y los requisitos de minimización de datos.

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