CAPSOLVER
Blog
Como integrar o CapSolver com a Automação de Navegador do Composio AI

Como integrar o CapSolver com o Composio AI de Automação de Navegador

Logo of CapSolver

Adélia Cruz

How to use CapSolver

17-Aug-2026

TL;DR

  • Envolva todo o fluxo de trabalho da página do Playwright — abrir, resolver, aplicar o resultado, enviar e verificar — em uma ferramenta personalizada do Composio que o SDK de Agentes do OpenAI pode chamar a partir de instruções em linguagem natural.
  • O exemplo abrange dois tipos de desafios: reCAPTCHA v2 com um token retornado e reconhecimento de CAPTCHA de imagem com ImageToTextTask, registrados como ferramentas separadas em uma sessão.
  • O fluxo se conecta diretamente à API oficial do OpenAI e usa o Playwright para automação de navegador.
  • Dois falhas comuns de integração são uma chave do Composio sem permissão sessions: write, que retorna 403, e a ausência de uma anotação BaseModel do Pydantic no primeiro parâmetro da ferramenta, que dispara uma ValidationError.

1. Introdução

Este guia integra o CapSolver ao Composio como uma ferramenta de agente que completa um fluxo de reCAPTCHA v2. Em vez de retornar apenas um token, a ferramenta executa a sequência completa da página e trata o estado real da página como condição de sucesso. SDK de Agentes do OpenAI decide quando chamar a ferramenta, enquanto automação de navegador do Playwright preserva o contexto da página usado para envio e verificação.

Use este padrão apenas para fluxos legais, razoáveis, responsáveis e autorizados pelo usuário. A capacidade técnica não concede permissão para acessar dados privados, restritos, sensíveis ou não autorizados; revise a orientação de automação de IA antes da implantação.

Fluxo:

text Copy
Executar o script
  -> SDK de Agentes do OpenAI decide qual ferramenta chamar
  -> ferramenta personalizada do Composio: complete_recaptcha_v2
       -> Playwright abre a página
       -> capsolver.solve(...) retorna gRecaptchaResponse
       -> Aplica o token ao g-recaptcha-response
       -> Playwright envia e aguarda a página
       -> Lê a página e determina se foi aceito
  -> Ferramenta retorna {"accepted": ..., "message": ...}
  -> Agente relata o resultado do accepted

Os componentes têm as seguintes responsabilidades:

Componente Responsabilidade
SDK de Agentes do OpenAI Entende instruções em linguagem natural, decide quando chamar a ferramenta, a executa e organiza a resposta
Composio Registra uma função Python padrão como uma ferramenta acessível ao agente
Playwright Abre a página, aplica o resultado, envia o formulário e lê o estado da página resultante
SDK do CapSolver Retorna o resultado da CAPTCHA por meio de uma única chamada solve()

2. Início Rápido

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

Cada dependência tem um papel específico:

Pacote Propósito
composio Cria sessões e registra ou carrega ferramentas personalizadas
composio-openai-agents Converte ferramentas do Composio em objetos que os Agentes do OpenAI podem chamar
openai-agents Fornece Agent, Runner e memória multi-turn em SQLite
capsolver Fornece o SDK oficial e retorna um resultado por meio de solve()
pydantic Define o esquema de entrada da ferramenta
playwright Abre páginas, aplica resultados, envia formulários e lê respostas

3. Configuração

python Copy
# Chaves de API.
COMPOSIO_API_KEY = "ak_..."
OPENAI_API_KEY = "sk-..."          # Sua chave oficial da API do OpenAI.
os.environ["OPENAI_API_KEY"] = OPENAI_API_KEY   # SDK do OpenAI lê a chave da variável de ambiente.

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

Notas de configuração: OPENAI_API_KEY deve ser gravada na variável de ambiente porque o SDK a lê lá; OpenAIAgentsProvider torna as ferramentas retornadas por session.tools() compatíveis com o Agente; e a chave do Composio precisa da permissão sessions: write ou a criação da sessão retorna 403.

O provedor do Composio para OpenAI e SDK de Agentes do OpenAI atuais explicam o limite do provedor e do agente usado por esta configuração.

Resgate seu código promocional do CapSolver

Aumente seu orçamento de automação instantaneamente!
Use o código promocional CAP26 ao recarregar sua conta do CapSolver para obter um bônus extra de 5% em cada recarga — sem limites.
Resgate-o agora em seu Painel do CapSolver
Código de Bônus

4. Implementação Principal

Condição de parada: a ferramenta relata sucesso apenas quando a página contém o texto de sucesso esperado. O bloco finally fecha o navegador em ambos os caminhos de sucesso e falha.

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

# Chaves de API.
COMPOSIO_API_KEY = "ak_..."
OPENAI_API_KEY = "sk-..."          # Sua chave oficial da API do OpenAI.
os.environ["OPENAI_API_KEY"] = OPENAI_API_KEY

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


# Esquema de entrada para a ferramenta personalizada; o Composio exige um BaseModel do Pydantic aqui.
class CompleteRecaptchaInput(BaseModel):
    target_url: str = Field(
        default="https://www.google.com/recaptcha/api2/demo",
        description="URL da página que contém o demo do reCAPTCHA v2",
    )
    website_key: str = Field(
        default="6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-",
        description="Chave do reCAPTCHA v2 da página atual",
    )


# Registre todo o fluxo como uma única ferramenta do Composio que o agente pode chamar.
# A anotação de tipo do primeiro parâmetro é necessária pelo Composio para inferir o esquema.
@composio.experimental.tool(preload=True)
def complete_recaptcha_v2(input: CompleteRecaptchaInput, _ctx):
    """Abre a página com o Playwright, resolve o reCAPTCHA v2, envia e verifica."""
    with sync_playwright() as p:
        browser = p.chromium.launch(headless=False)  # Defina headless=True para ocultar a janela.
        page = browser.new_page()
        try:
            page.goto(input.target_url)
            # Peça ao CapSolver para resolver o desafio 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()
            # Sucesso apenas se a página mostrar o texto de sucesso
            accepted = "Verification Success" in result_page
            return {
                "accepted": accepted,
                "message": (
                    "Verification Success"
                    if accepted
                    else "A página não relatou 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},  # Execute a ferramenta neste processo, não em um sandbox.
    )
    agent = Agent(
        name="Assistente de reCAPTCHA do Playwright",
        instructions=(
            "Quando o usuário pedir para executar o demo, chame complete_recaptcha_v2 "
            "com os valores padrão. Relate o sucesso apenas quando accepted for verdadeiro."
        ),
        model="gpt-5.2",
        tools=session.tools(),
    )
    # Memória para conversa multi-turno
    memory = SQLiteSession("conversation")
    print("Demo do Composio + reCAPTCHA v2 do Playwright em execução...")
    user_input = (
        "Chame complete_recaptcha_v2 agora com os valores padrão de target_url "
        "e website_key. Não peça confirmação."
    )
    result = Runner.run_sync(
        starting_agent=agent,
        input=user_input,
        session=memory,
    )
    print(f"Assistente: {result.final_output}\n")
if __name__ == "__main__":
    main()

5. Reconhecimento de CAPTCHA de Imagem com ImageToTextTask

O mesmo padrão pode lidar com uma CAPTCHA de texto de imagem padrão registrando uma segunda ferramenta do Composio. Este exemplo usa o demo do BotDetect CAPTCHA: o elemento de imagem é #demoCaptcha_CaptchaImage, o campo de entrada é #captchaCode e o botão de validação é #validateCaptchaButton.

Elementos da imagem, entrada e validação da CAPTCHA do BotDetect inspecionados no navegador

A solicitação ImageToTextTask envia a imagem em Base64 por meio de body. Ao contrário das tarefas baseadas em token, esta tarefa retorna o texto reconhecido diretamente e não requer um loop de verificação separado.

5.1 Leia a Imagem como Base64

python Copy
image_src = page.locator("#demoCaptcha_CaptchaImage").get_attribute("src")
if not image_src or "," not in image_src:
    raise RuntimeError("Nenhum URL de dados de imagem de CAPTCHA válido foi encontrado")
base64_image = image_src.split(",", 1)[1]  # Remova o prefixo "data:image/...;base64,"

5.2 Implementação da Ferramenta Personalizada

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

@composio.experimental.tool(preload=True)
def complete_image_captcha(input: CompleteImageCaptchaInput, _ctx):
    """Abre a página com o Playwright, reconhece a CAPTCHA de imagem, envia e verifica."""
    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")

            # O src da imagem já é um URL de dados; remova o prefixo para obter Base64.
            image_src = page.locator("#demoCaptcha_CaptchaImage").get_attribute("src")
            if not image_src or "," not in image_src:
                raise RuntimeError("Nenhum URL de dados de imagem de CAPTCHA válido foi encontrado")
            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("O CapSolver não retornou texto reconhecido")
            page.fill("#captchaCode", captcha_text)      # Preenche o texto reconhecido.
            page.click("#validateCaptchaButton")
            page.wait_for_load_state("networkidle")
            result_page = page.content()
            # A página de demo mostra "Correct!" em caso de sucesso, "Incorrect!" em caso de falha.
            accepted = "Correct!" in result_page
            return {
                "accepted": accepted,
                "recognized_text": captcha_text,
                "message": "Correct!" if accepted else "A página não relatou Correct!",
            }
        finally:
            browser.close()

Visão geral do fluxo:

text Copy
Playwright abre a página de CAPTCHA
  -> Aguarda #demoCaptcha_CaptchaImage se tornar visível
  -> Lê src (URL de dados) e remove o prefixo para obter Base64
  -> capsolver.solve(ImageToTextTask) retorna texto
  -> page.fill escreve o resultado em #captchaCode
  -> page.click ativa #validateCaptchaButton
  -> page.content verifica Correct! ou Incorrect!
  -> finally fecha o navegador

5.3 Escolha o Modelo de Reconhecimento Adequado

O parâmetro module é opcional e padrão para common. Se a CAPTCHA contiver apenas números, use number. Estilos especiais podem usar um modelo independente documentado quando apropriado.

Exemplos e valores de precisão dos modelos ImageToTextTask do CapSolver

Por exemplo, use o código-fonte inalterado para reconhecimento apenas de números:

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

answers = solution["answers"]

O modelo number suporta múltiplas imagens em uma única submissão, e images pode conter até nove strings Base64. Os nomes dos modelos suportados e os casos de uso estão listados na página ImageToTextTask do CapSolver vinculada acima.

6. Solução de Problemas

6.1 O Primeiro Parâmetro da Ferramenta Deve Ser um BaseModel

text Copy
experimental.tool: o primeiro parâmetro de "complete_recaptcha_v2" deve ser
anotado com uma subclasse de BaseModel do Pydantic. Recebido: <class 'inspect._empty'>

O Composio infere o esquema de entrada a partir da anotação de tipo do primeiro parâmetro, então input: CompleteRecaptchaInput não pode ser omitido. Esta é uma anotação funcional, não um dica de tipo opcional. A referência do BaseModel do Pydantic descreve o tipo de modelo usado para o esquema.

6.2 Composio retorna 403

A criação de sessão pode retornar o seguinte erro:

text Copy
403 APIKey_InsufficientPermissions
Esta rota requer acesso de gravação para "sessions"

A causa é que composio.sessions.create() requer acesso de gravação ao project-key para sessões, enquanto a chave atual tem acesso somente leitura. A chave é válida, mas seu escopo é insuficiente, portanto a resposta é 403 em vez de 401.

Etapas para resolver:

  1. Abra o painel do Composio e vá para as configurações de chaves de API para o projeto relevante.
  2. Altere a permissão de sessões da chave atual de leitura para gravação.
  3. Se a permissão não puder ser editada, crie uma nova chave com sessions: write e substitua COMPOSIO_API_KEY no topo do script.
  4. Execute o script novamente. Acessar o fluxo interativo sem o 403 confirma que a permissão está ativa.

7. Conclusão e CTA

O núcleo desta integração é um fluxo de trabalho de negócio completo embalado como uma única ferramenta do Composio:

text Copy
Ferramenta Composio = ações de página do Playwright + resultado do CapSolver + verificação do estado da página
  • O Composio converte a função Python em uma ferramenta de agente e trata a inferência de esquema e execução.
  • Playwright abre a página, aplica o resultado, envia o formulário e lê o estado final.
  • CapSolver lida com a reconhecimento de reCAPTCHA v2 e CAPTCHA de imagem para este fluxo específico.

Execute o exemplo apenas em páginas e processos que você possua ou esteja autorizado a automatizar. Use variáveis de ambiente ou um gerenciador de segredos para credenciais, pare quando a página não atingir o estado de negócio esperado e revise falhas repetidas em vez de tentar repetidamente.

Para um fluxo de trabalho de agente autorizado do Composio que precise de uma camada de infraestrutura focada em CAPTCHA, teste o CapSolver com suas próprias páginas controladas e verifique o resultado da aplicação após cada solução.

Perguntas frequentes

O que o Composio trata nesta integração?

O Composio registra a função Python como uma ferramenta personalizada chamável pelo agente, cria a sessão, expõe o esquema da ferramenta e roteia a execução do agente OpenAI.

Por que o primeiro parâmetro da ferramenta deve ser um Pydantic BaseModel?

O Composio usa essa anotação para inferir o esquema de entrada da ferramenta. Omissão dela impede a construção do esquema e levanta um erro de validação antes do fluxo do navegador.

A ferramenta reCAPTCHA v2 para de funcionar após o CapSolver retornar um token?

Não. O código inalterado aplica o token, envia o formulário de demonstração, lê o HTML resultante e relata o sucesso somente quando a página contém o texto "Verification Success" esperado.

A ImageToTextTask requer um loop de verificação separado?

Não. Neste fluxo, o SDK oficial retorna o texto reconhecido diretamente. A ferramenta depois preenche o campo de entrada, envia a página e verifica "Correct!" como condição de parada.

Este fluxo pode ser usado em qualquer site?

Não. Use-o apenas para automação legal, razoável, responsável e autorizada pelo usuário. Respeite os termos do site, leis aplicáveis, limites de taxa e requisitos de minimização de dados.

Declaração de Conformidade: As informações fornecidas neste blog são apenas para fins informativos. A CapSolver está comprometida em cumprir todas as leis e regulamentos aplicáveis. O uso da rede CapSolver para atividades ilegais, fraudulentas ou abusivas é estritamente proibido e será investigado. Nossas soluções de resolução de captcha melhoram a experiência do usuário enquanto garantem 100% de conformidade ao ajudar a resolver dificuldades de captcha durante a coleta de dados públicos. Incentivamos o uso responsável de nossos serviços. Para mais informações, visite nossos Termos de Serviço e Política de Privacidade.

Mais

Tutorial do Registro Oficial MCP da CapSolver mostrando o registro do registro, o comando uvx, a variável da chave de API e o status ativo de stdio
Como instalar o CapSolver MCP do Registro Oficial MCP

Localize o CapSolver MCP no Registro Oficial MCP, instale a versão 0.1.3 com uvx ou pip, configure um cliente local e verifique as ferramentas stdio.

ai
Logo of CapSolver

Adélia Cruz

18-Sep-2026

Ferramentas de CAPTCHA de IA: Entradas Digitadas e Resultados do Resolvedor
Ferramentas de CAPTCHA de IA: Entradas Digitadas e Resultados do Solucionador

Adicione ferramentas CAPTCHA ao Pydantic AI usando o adaptador oficial do CapSolver, teste a execução da ferramenta localmente e lide com entradas digitadas e resultados de solucionador estruturados.

ai
Logo of CapSolver

Adélia Cruz

18-Sep-2026

Interfaces MCP e CLI conectadas a um serviço de ferramenta de agente de IA
MCP vs CLI para Agentes de IA: Custo de Contexto e Tratamento de Falhas

Compare as interfaces MCP e CLI para agentes de IA em descoberta de ferramentas, custo de contexto, segurança, depuração, tratamento de falhas e arquitetura híbrida.

ai
Logo of CapSolver

Adélia Cruz

18-Sep-2026

O agente de navegador de IA seleciona o formulário desejado, corresponde ao widget CAPTCHA e verifica o resultado da submissão.
Como lidar com múltiplos widgets CAPTCHA em agentes de navegador de IA

Gerenciar múltiplos widgets CAPTCHA em uma página com propriedade explícita do formulário, parâmetros do solver, direcionamento de resultados e verificações para a ação planejada do agente de IA.

ai
Logo of CapSolver

Lucas Mitchell

15-Sep-2026

Agentes de IA vs Scripts: Como Escolher para Automação da Web com um diagrama das principais decisões
Agentes de IA vs Scripts: Como Escolher para Automação da Web

Escolha entre agentes de IA, scripts e automação híbrida da web com base na incerteza da tarefa, testabilidade, custo e nos controles necessários para execução confiável.

ai
Logo of CapSolver

Lucas Mitchell

11-Sep-2026

Servidor CapSolver MCP conectando um agente de IA a cinco ferramentas de automação
CapSolver MCP Server Está Agora Disponível para Agentes de IA

Instale o servidor CapSolver MCP do PyPI e forneça aos agentes de IA compatíveis cinco ferramentas para a resolução autorizada de CAPTCHA por meio do Protocolo de Contexto de Modelo.

ai
Logo of CapSolver

Adélia Cruz

10-Sep-2026