
Emma Foster
Machine Learning Engineer

Quando sua automação web alimentada por IA bate em um muro de CAPTCHA, toda a pipeline para. As páginas não carregam, os formulários não podem ser enviados e a extração de dados para. Tudo isso porque um desafio foi criado para bloquear robôs. O TinyFish AgentQL é um conjunto poderoso de ferramentas para conectar a IA à web, com consultas em linguagem natural, integrações com Playwright e extração de dados estruturados em escala empresarial. Mas, como qualquer framework de automação de navegador, ele fica travado em CAPTCHAs.
O CapSolver muda isso completamente. Carregando a extensão CapSolver no contexto do navegador do AgentQL baseado em Playwright, os CAPTCHAs são resolvidos automaticamente e invisivelmente em segundo plano. Nenhuma resolução manual. Nenhuma orquestração complexa de API do seu lado. Seus scripts de automação continuam a executar como se o CAPTCHA nunca tivesse existido.
A melhor parte? Suas consultas e scripts do AgentQL não precisam de uma linha de código relacionado ao CAPTCHA. A extensão cuida da detecção, resolução e injeção de tokens por conta própria, enquanto seu agente se concentra no que faz melhor: extrair dados e automatizar fluxos de trabalho.
TinyFish AgentQL é uma ferramenta empresarial para conectar agentes de IA e LLMs a ambientes web em tempo real. Desenvolvido pela TinyFish, ele fornece uma linguagem de consulta potencializada por IA que permite localizar elementos de página e extrair dados estruturados usando linguagem natural — sem a necessidade de seletores CSS frágeis ou XPaths.
O AgentQL funciona em qualquer página — incluindo conteúdo autenticado e páginas geradas dinamicamente — tornando-o ideal para automação em larga escala, coleta de dados e fluxos de trabalho de agentes de IA.
CapSolver é um serviço líder de resolução de CAPTCHA alimentado por IA que resolve automaticamente diversos desafios de CAPTCHA. Com tempos de resposta rápidos e compatibilidade ampla, o CapSolver se integra perfeitamente aos fluxos de automação.
A maioria das integrações de resolução de CAPTCHA exige que você escreva código-padrão: crie tarefas, consulte resultados, injete tokens em campos ocultos. Essa é a abordagem padrão com scripts do Playwright ou Puppeteer.
AgentQL + CapSolver adota uma abordagem fundamentalmente diferente:
| Tradicional (Baseado em Código) | AgentQL + Extensão CapSolver |
|---|---|
| Escreva uma classe de serviço do CapSolver | Carregue a extensão no contexto do Playwright |
Chame createTask() / getTaskResult() |
A extensão lida com tudo automaticamente |
Injete tokens via page.evaluate() |
A injeção de tokens é invisível |
| Trate erros, repetições, timeouts no código | A extensão gerencia repetições internamente |
| Código diferente para cada tipo de CAPTCHA | Funciona para todos os tipos automaticamente |
A principal descoberta: A extensão CapSolver roda no contexto do navegador do Playwright do AgentQL. Quando o AgentQL navega até uma página com um CAPTCHA, a extensão o detecta, o resolve em segundo plano e injeta o token — tudo antes que seu script interaja com o formulário. Seus scripts de automação permanecem limpos, focados e livres de CAPTCHA.
Antes de configurar a integração, certifique-se de ter:
Importante: Extensões do Chrome só funcionam com o Chromium em um contexto persistente no Playwright. Isso é um requisito do Playwright, não uma limitação do AgentQL.
SDK Python:
pip install agentql
playwright install chromium
SDK JavaScript:
npm install agentql
npx playwright install chromium
Baixe a extensão do CapSolver do Chrome e extraia-a para um diretório dedicado:
CapSolver.Browser.Extension-chrome-v1.17.0.zipmkdir -p ~/capsolver-extension
unzip CapSolver.Browser.Extension-chrome-v*.zip -d ~/capsolver-extension/
ls ~/capsolver-extension/manifest.json
Você deve ver manifest.json — isso confirma que a extensão está no lugar certo.
Abra o arquivo de configuração da extensão em ~/capsolver-extension/assets/config.js e substitua o valor de apiKey pelo seu:
export const defaultConfig = {
apiKey: 'CAP-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX', // ← seu chave aqui
useCapsolver: true,
// ... resto da configuração
};
Você pode obter sua chave de API em seu painel do CapSolver.
O passo crítico é iniciar o Chromium do Playwright com um contexto persistente que carregue a extensão do CapSolver.
Exemplo em Python:
import agentql
from playwright.sync_api import sync_playwright
import time
import os
# Caminho para a extensão do CapSolver
CAPSOLVER_EXTENSION_PATH = os.path.expanduser("~/capsolver-extension")
def main():
with sync_playwright() as p:
# Inicie o Chromium com contexto persistente e a extensão do CapSolver
context = p.chromium.launch_persistent_context(
user_data_dir="./browser-data",
headless=False, # Extensões exigem modo não cabeça
args=[
f"--disable-extensions-except={CAPSOLVER_EXTENSION_PATH}",
f"--load-extension={CAPSOLVER_EXTENSION_PATH}",
],
)
# Envolver a página com o AgentQL para consultas potencializadas por IA
page = agentql.wrap(context.pages[0])
# Navegue até sua página de destino
page.goto("https://example.com/protected-page")
# Aguarde o CapSolver detectar e resolver qualquer CAPTCHA
time.sleep(30)
# Encontre e clique no botão de envio usando consultas em linguagem natural do AgentQL
response = page.query_elements("""
{
submit_button
}
""")
# Clique no botão de envio — o CAPTCHA já foi resolvido!
response.submit_button.click()
# Extraia dados após o envio
result = page.query_data("""
{
confirmation_message
}
""")
print(f"Resultado: {result['confirmation_message']}")
context.close()
if __name__ == "__main__":
main()
Exemplo em JavaScript:
const { chromium } = require('playwright');
const agentql = require('agentql');
const path = require('path');
const os = require('os');
const CAPSOLVER_EXTENSION_PATH = path.join(os.homedir(), 'capsolver-extension');
(async () => {
// Inicie o Chromium com contexto persistente e a extensão do CapSolver
const context = await chromium.launchPersistentContext('./browser-data', {
headless: false, // Extensões exigem modo não cabeça
args: [
`--disable-extensions-except=${CAPSOLVER_EXTENSION_PATH}`,
`--load-extension=${CAPSOLVER_EXTENSION_PATH}`,
],
});
// Obtenha a primeira página e a envolva com o AgentQL
const page = agentql.wrap(context.pages()[0]);
// Navegue até a página de destino
await page.goto('https://example.com/protected-page');
// Aguarde o CapSolver resolver qualquer CAPTCHA
await page.waitForTimeout(30000);
// Use consultas do AgentQL para interagir — o CAPTCHA já foi resolvido
const response = await page.queryElements(`{
submit_button
}`);
await response.submit_button.click();
// Extraia os dados do resultado
const result = await page.queryData(`{
confirmation_message
}`);
console.log('Resultado:', result.confirmation_message);
await context.close();
})();
Após iniciar o navegador, você pode verificar se a extensão do CapSolver está ativa navegando até chrome://extensions na janela do navegador. Você deve ver a extensão do CapSolver listada e ativada.
Alternativamente, verifique o console do navegador para mensagens de log do CapSolver indicando que o serviço worker está em execução.
Após concluir a configuração, usar o CapSolver com o AgentQL é simples.
Não escreva código específico de CAPTCHA. Basta adicionar um tempo de espera antes de interagir com formulários protegidos por CAPTCHA e deixe a extensão fazer seu trabalho.
page.goto("https://example.com/contact")
# Preencha o formulário usando consultas do AgentQL
response = page.query_elements("""
{
contact_form {
name_field
email_field
message_field
submit_button
}
}
""")
response.contact_form.name_field.fill("John Doe")
response.contact_form.email_field.fill("john@example.com")
response.contact_form.message_field.fill("Hello, I have a question about your services.")
# Aguarde o CapSolver resolver o CAPTCHA
time.sleep(30)
# Enviar — o token do CAPTCHA já foi injetado
response.contact_form.submit_button.click()
page.goto("https://example.com/login")
# Aguarde o CapSolver resolver o desafio do Turnstile
time.sleep(25)
# Encontre os elementos do formulário de login com o AgentQL
response = page.query_elements("""
{
login_form {
email_input
password_input
login_button
}
}
""")
# Preencha o formulário — o Turnstile já foi tratado
response.login_form.email_input.fill("me@example.com")
response.login_form.password_input.fill("mypassword123")
# Clique em login
response.login_form.login_button.click()
page.goto("https://example.com/data")
# Aguarde qualquer desafio de CAPTCHA ser resolvido
time.sleep(30)
# Extraia dados estruturados com o AgentQL
data = page.query_data("""
{
products[] {
name
price
rating
availability
}
}
""")
for product in data['products']:
print(f"{product['name']}: ${product['price']} ({product['rating']} estrelas)")
| Tipo de CAPTCHA | Tempo de Resolução Típico | Tempo Recomendado de Espera |
|---|---|---|
| reCAPTCHA v2 (caixa de seleção) | 5-15 segundos | 30-60 segundos |
| reCAPTCHA v2 (invisível) | 5-15 segundos | 30 segundos |
| reCAPTCHA v3 | 3-10 segundos | 20-30 segundos |
| Cloudflare Turnstile | 3-10 segundos | 20-30 segundos |
Dica: Quando em dúvida, use 30 segundos. É melhor esperar um pouco mais do que enviar cedo demais. O tempo extra não afeta o resultado.
Aqui está o que acontece quando o AgentQL é executado com a extensão CapSolver carregada:
Seu Script do AgentQL
───────────────────────────────────────────────────
page.goto("https://...") ──► O Chromium carrega a página
│
▼
┌─────────────────────────────┐
│ Página com widget de CAPTCHA │
│ │
│ Extensão CapSolver: │
│ 1. Script de conteúdo detecta │
│ CAPTCHA na página │
│ 2. Serviço worker chama │
│ API do CapSolver │
│ 3. Token recebido │
│ 4. Token injetado em campo │
│ oculto │
└─────────────────────────────┘
│
▼
time.sleep(30) Extensão resolve o CAPTCHA...
│
▼
page.query_elements(...) O AgentQL encontra os elementos do formulário
submit_button.click() O formulário é enviado com token válido
│
▼
"Verificação bem-sucedida!"
Quando o Playwright inicia o Chromium com o sinalizador --load-extension:
Aqui está uma configuração completa em Python com todas as opções de configuração para a integração AgentQL + CapSolver:
import agentql
from playwright.sync_api import sync_playwright
import os
# Configuração
CAPSOLVER_EXTENSION_PATH = os.path.expanduser("~/capsolver-extension")
USER_DATA_DIR = "./browser-data"
with sync_playwright() as p:
context = p.chromium.launch_persistent_context(
user_data_dir=USER_DATA_DIR,
headless=False,
args=[
f"--disable-extensions-except={CAPSOLVER_EXTENSION_PATH}",
f"--load-extension={CAPSOLVER_EXTENSION_PATH}",
],
)
page = agentql.wrap(context.pages[0])
# ... seu código de automação aqui
context.close()
| Opção | Descrição |
|---|---|
user_data_dir |
Diretório para armazenar dados do perfil do navegador (cookies, sessões). Obrigatório para contexto persistente. |
headless |
Deve ser False — extensões do Chrome não funcionam no modo headless. |
--disable-extensions-except |
Restringe quais extensões podem carregar (previne conflitos). |
--load-extension |
Caminho para o diretório da extensão CapSolver descompactada. |
CAPSOLVER_EXTENSION_PATH |
Caminho completo para a extensão CapSolver extraída contendo manifest.json. |
A chave da API do CapSolver é configurada diretamente no arquivo assets/config.js da extensão (consulte a Etapa 3 acima).
Tudo o que foi dito anteriormente pressupõe que você está executando o Chromium por conta própria, localmente, com um contexto do Playwright persistente para que a extensão CapSolver possa ser carregada. No entanto, nem toda configuração oferece esse tipo de controle — se sua automação for executada contra o TinyFish Browser, o serviço de sessão de navegador remoto e sob demanda do TinyFish, você não gerencia o processo do Chromium diretamente, portanto não pode carregar uma extensão descompactada da mesma forma.
Nesse cenário, o CapSolver pode ser integrado via sua API, diretamente no seu script: você solicita uma sessão de navegador remoto ao TinyFish Browser, se conecta a ele por meio do CDP com o Playwright, resolve o CAPTCHA com o SDK do CapSolver e injeta o token resultante na página você mesmo. É a abordagem mais "tradicional", baseada em código, descrita anteriormente neste artigo — mas é a ferramenta certa quando uma extensão não pode ser carregada na instância do navegador que você está controlando.
Antes de começar, instale o SDK do CapSolver:
pip install capsolver
O código a seguir mostra como usar o CapSolver para resolver um reCAPTCHA em uma sessão do TinyFish Browser:
import time
import requests
import capsolver
from playwright.sync_api import sync_playwright
TINYFISH_API_KEY = "SUA CHAVE DE API DO TINYFISH"
capsolver.api_key = "SUA CHAVE DE API DO CAPSOLVER"
website_url = "https://www.google.com/recaptcha/api2/demo"
website_key = "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-"
captcha_type = "ReCaptchaV2TaskProxyLess"
def create_tinyfish_browser(url):
resp = requests.post(
"https://api.browser.tinyfish.ai",
headers={
"X-API-Key": TINYFISH_API_KEY,
"Content-Type": "application/json",
},
json={
"url": url,
"timeout_seconds": 300,
},
timeout=90,
)
resp.raise_for_status()
return resp.json()
def close_tinyfish_browser(session_id):
try:
requests.delete(
f"https://api.browser.tinyfish.ai/{session_id}",
headers={"X-API-Key": TINYFISH_API_KEY},
timeout=30,
)
except Exception as exc:
print(" Falha ao fechar a sessão do navegador TinyFish:", repr(exc))
def solve_recaptcha_v2():
print("3. Resolvendo reCAPTCHA com o CapSolver")
solution = capsolver.solve({
"type": captcha_type,
"websiteURL": website_url,
"websiteKey": website_key,
})
token = solution.get("gRecaptchaResponse")
if not token:
raise RuntimeError(f"O CapSolver não retornou um token de reCAPTCHA: {solution}")
print(" Tarefa do CapSolver resolvida:", token)
return token
def inject_recaptcha_token(page, token):
page.evaluate(
"""
(token) => {
const textarea = document.getElementById('g-recaptcha-response');
if (textarea) {
textarea.value = token;
}
}
""",
token,
)
print(" Token do CapSolver injetado")
page.click('input[type="submit"]')
print(" Botão de envio clicado")
def main():
session_id = None
try:
print("1. Criando sessão do navegador TinyFish")
session = create_tinyfish_browser(website_url)
session_id = session["session_id"]
cdp_url = session["cdp_url"]
print(" ID da sessão TinyFish:", session_id)
print(" URL do CDP do TinyFish:", cdp_url)
with sync_playwright() as p:
print("2. Conectando-se ao navegador TinyFish via CDP")
browser = p.chromium.connect_over_cdp(cdp_url)
context = browser.contexts[0]
page = context.pages[0] if context.pages else context.new_page()
page.wait_for_load_state("domcontentloaded", timeout=60000)
print(" URL da página atual:", page.url)
token = solve_recaptcha_v2()
print("4. Injetando o token do capsolver")
inject_recaptcha_token(page, token)
page.wait_for_load_state("domcontentloaded", timeout=30000)
time.sleep(3)
body_text = page.locator("body").inner_text(timeout=10000)
print("5. Resultado da página:", " ".join(body_text.split()))
print("6. Fechando as sessões do navegador")
browser.close()
finally:
if session_id:
close_tinyfish_browser(session_id)
if __name__ == "__main__":
main()
Qualquer que seja a abordagem que se encaixe na sua configuração — carregar a extensão do CapSolver em um contexto do Playwright local e persistente, ou chamar diretamente a API do CapSolver contra uma sessão do TinyFish Browser remoto — o objetivo é o mesmo: a automação do AgentQL nunca deverá precisar conter lógica própria para lidar com CAPTCHAs.
Sintoma: CAPTCHAs não estão sendo resolvidos automaticamente.
Causa: Você pode estar usando um contexto de navegador regular em vez de um contexto persistente, ou executando em modo headless.
Solução: Extensões no Playwright requerem um contexto persistente e modo não headless:
# ✅ Correto — contexto persistente, modo não headless
context = p.chromium.launch_persistent_context(
user_data_dir="./browser-data",
headless=False,
args=[...extensão...]
)
# ❌ Incorreto — contexto regular (extensões não carregarão)
browser = p.chromium.launch()
context = browser.new_context()
Possíveis causas:
Sintoma: O script roda, mas a extensão não aparece.
Causa: Extensões do Chrome não funcionam no modo headless.
Solução: Use o modo não headless com um display virtual em servidores:
# Instale o Xvfb
sudo apt-get install xvfb
# Inicie um display virtual
Xvfb :99 -screen 0 1280x720x24 &
# Defina o DISPLAY
export DISPLAY=:99
Sintoma: A bandeira da extensão é ignorada silenciosamente.
Causa: O Google Chrome 137+ removeu o suporte para --load-extension em builds oficiais.
Solução: Use o Chromium do Playwright (recomendado) ou o Chrome for Testing:
# Instale o Chromium do Playwright (recomendado)
npx playwright install chromium
# Ou baixe o Chrome for Testing
# Acesse: https://googlechromelabs.github.io/chrome-for-testing/
Sempre use tempos de espera generosos. Mais tempo de espera é sempre mais seguro. O CAPTCHA geralmente se resolve em 5-20 segundos, mas a latência da rede, desafios complexos ou tentativas podem adicionar tempo. 30-60 segundos é o ponto ideal.
Mantenha seus scripts de automação limpos. Não adicione lógica específica para CAPTCHA em suas consultas do AgentQL. A extensão cuida de tudo — seu código deve se concentrar puramente na extração de dados e interação.
Monitore seu saldo do CapSolver. Cada resolução de CAPTCHA custa créditos. Verifique seu saldo em capsolver.com/dashboard regularmente para evitar interrupções.
Use consistentemente o contexto persistente. Sempre inicie com launch_persistent_context() quando precisar de extensões. Isso também preserva cookies e dados de sessão entre as execuções, o que pode reduzir a frequência de CAPTCHAs.
Use o Xvfb em servidores headless. Extensões do Chrome exigem um contexto de exibição. Configure o Xvfb para ambientes de servidor onde não haja um display físico disponível.
Escolha a integração adequada ao seu ambiente. Use a abordagem baseada em extensão sempre que você controlar diretamente o processo do Chromium e puder iniciar um contexto persistente. Use a abordagem baseada em API com o SDK do CapSolver sempre que estiver se conectando a um navegador que você não controla diretamente — como uma sessão do TinyFish Browser remoto via CDP.
A integração do TinyFish AgentQL + CapSolver traz a resolução de CAPTCHA invisível a uma das ferramentas de automação web mais poderosas disponíveis. Em vez de escrever código complexo para lidar com CAPTCHAs, você simplesmente:
A extensão do CapSolver cuida do restante — detectando CAPTCHAs, resolvendo-os via API do CapSolver e injetando tokens na página. Seus scripts do AgentQL nunca precisam saber sobre CAPTCHAs de forma alguma.
E quando sua automação for executada contra uma sessão remota — como o TinyFish Browser — o SDK e a API do CapSolver permitem obter o mesmo resultado com algumas linhas extras de código: solicite a sessão, conecte-se via CDP, resolva e injete.
Essa é a cara da resolução de CAPTCHA quando você combina automação web com inteligência artificial com resolução de CAPTCHA com inteligência artificial: invisível, automática e sem código.
Pronto para começar? Registre-se no CapSolver e use o código promocional AGENTQL para obter 6% extras em seu primeiro recarregamento!

Não. A extensão do CapSolver funciona totalmente em segundo plano dentro do contexto do navegador do Playwright. Basta adicionar um time.sleep() ou waitForTimeout() antes de enviar formulários, e a extensão cuida da detecção, resolução e injeção do token automaticamente.
O Playwright só suporta extensões do Chrome quando usa launch_persistent_context(). Isso é um requisito arquitetural do Playwright. Contextos de navegador regulares criados via browser.new_context() não podem carregar extensões.
Não. Extensões do Chrome exigem um navegador com interface gráfica. Para ambientes de servidor sem tela, use o Xvfb (X Virtual Framebuffer) para criar um display virtual.
Como você não controla diretamente o lançamento do navegador, não pode carregar a extensão do CapSolver em uma sessão do TinyFish Browser. Em vez disso, use o SDK do CapSolver para resolver o CAPTCHA e injetar o token resultante você mesmo via page.evaluate() após se conectar via CDP, como mostrado na seção "Usando o CapSolver com o TinyFish Browser" acima.
O CapSolver suporta reCAPTCHA v2 (caixa e invisível), reCAPTCHA v3, Cloudflare Turnstile, AWS WAF CAPTCHA e mais. A extensão detecta automaticamente o tipo de CAPTCHA e o resolve conforme apropriado.
O CapSolver oferece preços competitivos com base no tipo de CAPTCHA e volume. Acesse capsolver.com para ver os preços atuais.
O AgentQL oferece planos gratuitos e pagos. O SDK e a linguagem de consulta estão disponíveis para desenvolvimento e testes. Acesse tinyfish.ai para detalhes sobre preços.
Para a maioria dos CAPTCHAs, 30-60 segundos são suficientes. O tempo de resolução real é geralmente de 5-20 segundos, mas adicionar um buffer adicional garante confiabilidade. Se em dúvida, use 30 segundos.
Integre a resolução de CAPTCHA em agentes do LlamaIndex usando FunctionTool e CapSolver para pipelines de ingestão de dados da web.

Configure o serviço CapSolver MCP para solução de CAPTCHA sem código em Claude Desktop, Cursor e qualquer cliente MCP.
