
Adélia Cruz
Neural Network Developer

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.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:
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() |
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 |
# 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
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.
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()
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.
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,"
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:
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
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:
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.
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.
A criação de sessão pode retornar o seguinte erro:
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:
sessions: write e substitua COMPOSIO_API_KEY no topo do script.O núcleo desta integração é um fluxo de trabalho de negócio completo embalado como uma única ferramenta do Composio:
Ferramenta Composio = ações de página do Playwright + resultado do CapSolver + verificação do estado da página
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.
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.
Um agente de IA solucionador de recaptcha v3 é confiável apenas quando o agente preserva a ação, página, sessão do navegador e contexto de autorização que produziram o desafio. A CapSolver fornece a camada de infraestrutura CAPTCHA documentada por meio do Core SDK, Agent Tools e MCP. O agente ainda detém a política, tentativas de repetição e confirmação da tarefa original. Este guia explica uma integração de produção para reCAPTCHA v3, incluindo Enterprise, sem tratar um token retornado como o sucesso final.

Quando um relatório de falha no CAPTCHA do agente de IA chega, a frase esconde várias falhas diferentes. A detecção pode estar errada, o agente pode redirecionar para uma ferramenta indisponível, o navegador pode navegar antes que o resultado retorne, ou o aplicativo pode rejeitar um resultado que foi tecnicamente produzido. O CapSolver fornece a infraestrutura de CAPTCHA documentada, enquanto seu orquestrador deve preservar as evidências e escolher a ramificação correta de recuperação. Este guia transforma um incidente vago em uma camada
