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

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
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
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
# 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_KEYdeve ser gravada na variável de ambiente porque o SDK a lê lá;OpenAIAgentsProvidertorna as ferramentas retornadas porsession.tools()compatíveis com o Agente; e a chave do Composio precisa da permissãosessions: writeou 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
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
finallyfecha o navegador em ambos os caminhos de sucesso e falha.
python
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.

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
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
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
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.

Por exemplo, use o código-fonte inalterado para reconhecimento apenas de números:
python
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
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
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:
- Abra o painel do Composio e vá para as configurações de chaves de API para o projeto relevante.
- Altere a permissão de sessões da chave atual de leitura para gravação.
- Se a permissão não puder ser editada, crie uma nova chave com
sessions: writee substituaCOMPOSIO_API_KEYno topo do script. - 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
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

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.

Adélia Cruz
18-Sep-2026

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.

Adélia Cruz
18-Sep-2026

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.

Adélia Cruz
18-Sep-2026

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.

Lucas Mitchell
15-Sep-2026

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.

Lucas Mitchell
11-Sep-2026

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.

Adélia Cruz
10-Sep-2026


