
Adélia Cruz
Neural Network Developer

TL;DR: Este guia mostra como burlar CAPTCHAs na automação de navegadores com o Playwright usando soluções baseadas em IA. Aprenda a lidar automaticamente com desafios reCAPTCHA e Cloudflare Turnstile com exemplos de código funcionais. Ver integração do CapSolver com o Playwright
Ao construir automação de navegadores com o Playwright, encontrar desafios CAPTCHA é uma obstáculo comum que pode interromper seus fluxos de trabalho. Seja você raspando dados, executando testes automatizados ou coletando inteligência de mercado, esses desafios interrompem o processo de automação e exigem intervenção manual, o que vai contra o propósito de script em primeiro lugar.
Este guia aborda como integrar soluções de burla de CAPTCHA baseadas em IA à sua automação com o Playwright, permitindo lidar com desafios reCAPTCHA e Cloudflare Turnstile de forma contínua sem interromper seu fluxo de trabalho.
Os CAPTCHAs aparecem quando os sites detectam comportamentos que diferem dos padrões típicos de navegação humana. Gatilhos comuns incluem:
Para desenvolvedores que usam o Playwright para tarefas de automação legítimas, entender por que os CAPTCHAs aparecem ajuda tanto a evitá-los quanto a lidar com eles de forma elegante quando ocorrerem.
Serviços de resolução de CAPTCHA baseados em IA, como o CapSolver, usam aprendizado de máquina e visão computacional para reconhecer e resolver desafios automaticamente. O fluxo de trabalho se integra de forma suave à automação com o Playwright:
Essa abordagem automatizada elimina a intervenção manual e mantém sua automação rodando continuamente.
Dados da indústria mostram que soluções baseadas em IA atingem taxas de acerto de 95-99% para tipos comuns de desafios, tornando-as confiáveis para fluxos de trabalho de automação em produção.
Primeiro, instale as dependências necessárias:
npm install playwright capsolver
Inicialize o cliente CapSolver com sua chave de API:
const CapSolver = require('capsolver');
const capSolver = new CapSolver({ apiKey: 'SUA_CHAVE_DE_API' });
O reCAPTCHA v2 geralmente apresenta desafios de caixa de seleção ou testes de seleção de imagens. Aqui está uma integração completa:
const { chromium } = require('playwright');
async function solveRecaptchaV2Example() {
// Inicialize o CapSolver
const CapSolver = require('capsolver');
const solver = new CapSolver({ apiKey: 'SUA_CHAVE_DE_API' });
// Inicie o navegador
const browser = await chromium.launch({ headless: false });
const page = await browser.newPage();
try {
// Navegue até a página alvo
await page.goto('https://exemplo.com/login');
// Detecte o reCAPTCHA v2
const siteKey = await page.evaluate(() => {
const element = document.querySelector('[data-sitekey]');
return element ? element.getAttribute('data-sitekey') : null;
});
if (siteKey) {
console.log('reCAPTCHA v2 detectado, resolvendo...');
// Resolva via CapSolver
const solution = await solver.recaptcha({
websiteURL: page.url(),
websiteKey: siteKey,
isEnterprise: false
});
// Defina o token de solução
await page.evaluate((token) => {
const textarea = document.getElementById('g-recaptcha-response');
if (textarea) textarea.value = token;
}, solution.gRecaptchaResponse);
// Dispare o callback se existir
const callback = await page.evaluate(() => {
const el = document.querySelector('[data-callback]');
return el ? el.getAttribute('data-callback') : null;
});
if (callback) {
await page.evaluate((cb) => {
eval(cb + '()');
}, callback);
}
console.log('reCAPTCHA v2 burlado com sucesso');
}
// Continue com sua automação
await page.fill('#username', 'usuario@exemplo.com');
await page.fill('#password', 'senha123');
await page.click('#login-btn');
} catch (error) {
console.error('Erro:', error.message);
} finally {
await browser.close();
}
}
solveRecaptchaV2Example();
O reCAPTCHA v3 roda em segundo plano e retorna uma pontuação em vez de desafios visuais. Aqui está como lidar com ele:
const { chromium } = require('playwright');
async function solveRecaptchaV3Example() {
// Inicialize o CapSolver
const CapSolver = require('capsolver');
const solver = new CapSolver({ apiKey: 'SUA_CHAVE_DE_API' });
// Inicie o navegador
const browser = await chromium.launch({ headless: false });
const page = await browser.newPage();
try {
await page.goto('https://exemplo.com/dashboard');
// Extraia a chave do site do reCAPTCHA v3
const siteKey = await page.evaluate(() => {
const scripts = document.querySelectorAll('script[src*="recaptcha"]');
for (const script of scripts) {
const src = script.src;
const keyMatch = src.match(/k=([^&]+)/);
if (keyMatch) return keyMatch[1];
}
return null;
});
if (siteKey) {
console.log('reCAPTCHA v3 detectado');
// Resolva com exigência de pontuação
const solution = await solver.recaptcha({
websiteURL: page.url(),
websiteKey: siteKey,
isEnterprise: false,
pageAction: 'homepage'
});
console.log('Token recebido, pontuação:', solution.score);
// Armazene o token para solicitações subsequentes
await page.evaluate((token) => {
window.__captchaToken = token;
}, solution.gRecaptchaResponse);
// Use o token em solicitações subsequentes
const response = await page.evaluate(async (token) => {
const res = await fetch('/api/perfil-de-usuario', {
headers: { 'X-Recaptcha-Token': token }
});
return await res.json();
}, solution.gRecaptchaResponse);
console.log('Dados recuperados:', response);
}
} catch (error) {
console.error('Erro:', error.message);
} finally {
await browser.close();
}
}
solveRecaptchaV3Example();
O Cloudflare Turnstile aparece como um desafio invisível ou widget de verificação. Aqui está uma abordagem completa:
const { chromium } = require('playwright');
async function solveCloudflareTurnstileExample() {
// Inicialize o CapSolver
const CapSolver = require('capsolver');
const solver = new CapSolver({ apiKey: 'SUA_CHAVE_DE_API' });
// Inicie o navegador com configurações de stealth
const browser = await chromium.launch({ headless: false });
const context = await browser.newContext({
viewport: { width: 1920, height: 1080 },
userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
});
const page = await context.newPage();
try {
await page.goto('https://exemplo-protegido.com/', {
waitUntil: 'domcontentloaded',
timeout: 30000
});
// Verifique se há desafio do Cloudflare
const isCFChallenge = await page.evaluate(() => {
return document.title.includes('Aguarde um momento') ||
document.querySelector('#cf-challenge') !== null;
});
if (isCFChallenge) {
console.log('Desafio do Cloudflare detectado');
// Aguarde o desafio ser renderizado
await page.waitForTimeout(2000);
// Detecte o widget do Turnstile
const siteKey = await page.evaluate(() => {
const turnstile = document.querySelector('.cf-turnstile');
return turnstile ? turnstile.getAttribute('data-sitekey') : null;
});
if (siteKey) {
console.log('Turnstile detectado, resolvendo...');
// Resolva o Turnstile
const solution = await solver.turnstile({
websiteURL: page.url(),
websiteKey: siteKey
});
console.log('Token recebido');
// Injete o token na página
await page.evaluate((token) => {
// Crie ou atualize o campo de token
let tokenField = document.querySelector('[name="cf-turnstile-response"]');
if (!tokenField) {
tokenField = document.createElement('input');
tokenField.type = 'hidden';
tokenField.name = 'cf-turnstile-response';
document.body.appendChild(tokenField);
}
tokenField.value = token;
// Dispare quaisquer callbacks
const turnstile = document.querySelector('.cf-turnstile');
if (turnstile && turnstile.dataset.callback) {
window[turnstile.dataset.callback](token);
}
}, solution.token);
// Aguarde o desafio ser resolvido
await page.waitForTimeout(3000);
console.log('Turnstile do Cloudflare burlado');
}
}
// Verifique se a página carregou
const title = await page.title();
console.log('Título da página:', title);
} catch (error) {
console.error('Erro:', error.message);
} finally {
await browser.close();
}
}
solveCloudflareTurnstileExample();
Aqui está um exemplo completo combinando detecção, resolução e lógica de retry para uso em produção:
const { chromium } = require('playwright');
const CapSolver = require('capsolver');
class PlaywrightAutomation {
constructor(apiKey) {
this.solver = new CapSolver({ apiKey });
}
async detectAndSolve(page) {
// Verifique por reCAPTCHA v2
const reCaptchaV2Key = await page.evaluate(() => {
const el = document.querySelector('[data-sitekey]');
return el?.getAttribute('data-sitekey');
});
// Verifique por Cloudflare Turnstile
const turnstileKey = await page.evaluate(() => {
const el = document.querySelector('.cf-turnstile');
return el?.getAttribute('data-sitekey');
});
if (reCaptchaV2Key) {
console.log('Resolvendo reCAPTCHA v2...');
return await this.solveRecaptchaV2(page, reCaptchaV2Key);
}
if (turnstileKey) {
console.log('Resolvendo Cloudflare Turnstile...');
return await this.solveTurnstile(page, turnstileKey);
}
return null;
}
async solveRecaptchaV2(page, siteKey) {
const solution = await this.solver.recaptcha({
websiteURL: page.url(),
websiteKey: siteKey
});
await page.evaluate((token) => {
const textarea = document.getElementById('g-recaptcha-response');
if (textarea) textarea.value = token;
}, solution.gRecaptchaResponse);
return solution;
}
async solveTurnstile(page, siteKey) {
const solution = await this.solver.turnstile({
websiteURL: page.url(),
websiteKey: siteKey
});
await page.evaluate((token) => {
let tokenField = document.querySelector('[name="cf-turnstile-response"]');
if (!tokenField) {
tokenField = document.createElement('input');
tokenField.type = 'hidden';
tokenField.name = 'cf-turnstile-response';
document.body.appendChild(tokenField);
}
tokenField.value = token;
}, solution.token);
return solution;
}
async run(url, steps) {
const browser = await chromium.launch({ headless: false });
const page = await browser.newPage();
try {
await page.goto(url);
// Verifique e resolva CAPTCHA se necessário
await this.detectAndSolve(page);
// Execute seus passos de automação
for (const step of steps) {
await step(page);
}
} finally {
await browser.close();
}
}
}
// Exemplo de uso
const automation = new PlaywrightAutomation('SUA_CHAVE_DE_API');
automation.run('https://exemplo.com/form', [
(page) => page.fill('#nome', 'João Silva'),
(page) => page.fill('#email', 'joao@exemplo.com'),
(page) => page.click('#enviar')
]).then(() => console.log('Automação concluída'))
.catch(err => console.error('Erro:', err));
O mercado de raspagem de web está experimentando um crescimento significativo à medida que as organizações priorizam a tomada de decisões baseada em dados, tornando soluções automatizadas cada vez mais importantes para fluxos de trabalho de desenvolvimento modernos.
Para exemplos mais detalhados, consulte a documentação completa da integração do Playwright e aprenda como integrar o CapSolver com o Playwright.
Sim, ao integrar-se a serviços de resolução de CAPTCHA baseados em IA, como o CapSolver, o Playwright pode detectar e resolver desafios automaticamente. O token de solução é enviado programaticamente, permitindo que a automação continue sem intervenção manual.
A resolução com inteligência artificial geralmente é concluída em 3-10 segundos para a maioria dos tipos de desafio. Isso é significativamente mais rápido do que alternativas comuns, que podem levar de 10 a 45 segundos, incluindo o tempo na fila.
Sim, o CapSolver suporta o reCAPTCHA v3 com requisitos de pontuação mínima configuráveis. Você pode definir o limiar de pontuação (0,1-0,9) de acordo com suas necessidades para diferentes níveis de rigor dos desafios.
Embora você não possa eliminar completamente os CAPTCHAs, pode reduzir sua frequência usando configurações de navegador stealth, randomizando o tempo entre as ações, rotacionando agentes de usuário e usando proxies residenciais. No entanto, alguns sites sempre apresentam desafios, independentemente das precauções.
Implemente lógica de repetição com backoff exponencial para tentativas falhas. O CapSolver lida com a maioria dos desafios com sucesso, mas variações complexas podem exigir ocasionalmente múltiplas tentativas. Um tratamento adequado de erros garante que sua automação permaneça resiliente.
Sim, CapSolver fornece SDKs e suporte à API para Playwright, Puppeteer, Selenium e extensões de navegador diretas. A abordagem de integração é semelhante entre as ferramentas, com diferenças mínimas na sintaxe.
Sim, quando usado de forma responsável para fins de automação legítima. O CapSolver se compromete com práticas éticas de tecnologia e oferece serviços que ajudam os desenvolvedores a automatizar seus próprios fluxos de trabalho autorizados de forma mais eficiente. Sempre certifique-se de que suas atividades de automação estejam em conformidade com os termos de serviço do site-alvo e com as leis aplicáveis. Revise as diretrizes de conformidade do CapSolver para melhores práticas.
Um guia de arquitetura de ferramentas para agentes MCP bloqueados pelo CAPTCHA, focado em modelagem de estado, transferência de navegador, memória de sessão, orçamentos de tentativa e política de acesso seguro.

Um guia voltado para a impressão digital para agentes de IA, abrangendo coerência do ambiente do navegador, sinais do WebDriver, consistência TLS, temporização da interação e validação de traços.
