
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.