Resolvendo CAPTCHAs Complexos com Puppeteer e Playwright Usando CapMonster Cloud
Puppeteer e Playwright são bibliotecas para automatizar ações no navegador. Com a ajuda delas, você pode controlar o navegador e realizar diversas tarefas, como abrir e navegar em páginas, preencher formulários, clicar em botões, extrair dados e outras atividades. Você também pode automatizar a resolução de captchas em sites ao adicionar o uso do serviço CapMonster Cloud. A seguir, vamos examinar a integração dessas ferramentas e fornecer exemplos de código prontos que podem ser usados para contornar captchas automaticamente.
Puppeteer e Playwright não são muito diferentes entre si. O Puppeteer foi criado pela equipe do Google. É uma biblioteca Node.js que roda em JavaScript. Possui um navegador embutido baseado no motor Chromium, não sendo necessário instalar manualmente um driver, como é necessário, por exemplo, no Selenium. O Playwright, desenvolvido pela Microsoft, é mais flexível e expande ligeiramente as capacidades do Puppeteer, permitindo trabalhar em várias linguagens, incluindo JavaScript, TypeScript, Python, C#, entre outras. Assim como o Puppeteer, o Playwright tem vários navegadores embutidos, permitindo que você teste no Chromium, Firefox e WebKit (Safari). Vamos explorar o uso do Puppeteer e Playwright em conjunto com o CapMonster Cloud.
Usaremos o VS Code, portanto, vamos focar neste ambiente. Todos os exemplos de código funcionarão sem o uso de um proxy. Se for necessário especificar um proxy, basta adicionar seus parâmetros e o user-agent atual ao criar uma tarefa, por exemplo:
"clientKey":"YOUR_API_KEY",
"task": {
"type":"RecaptchaV2Task",
"websiteURL":"https://lessons.zennolab.com/captchas/recaptcha/v2_simple.php?level=high",
"websiteKey":"EXAMPLE_SITE_KEY",
"proxyType":"http",
"proxyAddress":"8.8.8.8",
"proxyPort":8080,
"proxyLogin":"proxyLoginHere",
"proxyPassword":"proxyPasswordHere",
"userAgent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36"
Para instalar o Puppeteer, siga os seguintes passos:
- Instalar o Node.js: O Puppeteer requer o Node.js, portanto, certifique-se de ter a versão mais recente instalada.
- Criar um projeto: Crie um novo diretório para o seu projeto, caso ainda não tenha um.
- Inicializar o Node.js: Abra o terminal no VS Code (pressione Ctrl + ~ para abrir o terminal integrado), vá até o seu diretório e execute o comando npm init, depois siga as instruções no terminal. Esse comando iniciará um novo projeto Node.js e criará um arquivo package.json. Todas as dependências instaladas aparecerão nesse arquivo.
- Instalar o Puppeteer: No terminal do VS Code, execute npm install puppeteer para baixar o Puppeteer e suas dependências para o seu projeto.
Agora, é necessário instalar uma biblioteca conveniente para enviar e receber requisições HTTP. O CapMonster Cloud tem sua própria biblioteca para isso, e utilizaremos ela nos nossos exemplos. Instale-a com o comando npm i @zennolab_com/capmonstercloud-client.
ReCaptcha v.2
Você precisa descobrir o sitekey do captcha e outros dados necessários para enviar a solicitação com sucesso, receber uma resposta e inserir o token no elemento do captcha. Tudo isso pode ser encontrado no código nas ferramentas de desenvolvedor. Também é importante verificar a documentação oficial do CapMonster Cloud.
- Vamos criar um novo projeto em JavaScript e importar todas as dependências necessárias:
import { launch } from 'puppeteer';
import { CapMonsterCloudClientFactory, ClientOptions, RecaptchaV2ProxylessRequest } from '@zennolab_com/capmonstercloud-client';
- Em seguida, defina os valores (a propósito, para conveniência e para evitar o vazamento de dados, é melhor criar um arquivo .env no mesmo diretório e escrever todos esses dados lá, utilizando-os no código com a biblioteca dotenv instalada e importada no projeto):
const CAPMONSTER_API_KEY = 'YOUR_API_KEY';
const WEBSITE_KEY = 'EXAMPLE_SITE_KEY';
const WEBSITE_URL = 'https://lessons.zennolab.com/captchas/recaptcha/v2_simple.php?level=high';
- Vamos criar uma tarefa, enviá-la para o servidor do CapMonster Cloud, obter uma solução e inserir o token no formulário do captcha:
async function solveRecaptcha() {
const browser = await launch({ headless: false });
const page = await browser.newPage();
// Initializing the CapMonster client
const cmcClient = CapMonsterCloudClientFactory.Create(new ClientOptions({ clientKey: CAPMONSTER_API_KEY }));
try {
await page.goto(WEBSITE_URL);
console.log('Page open, reCAPTCHA solving...');
// Creating a request for a reCAPTCHA solving type V2 Proxyless
const recaptchaV2ProxylessRequest = new RecaptchaV2ProxylessRequest({
websiteURL: WEBSITE_URL,
websiteKey: WEBSITE_KEY,
});
// reCAPTCHA solving using CapMonster
const solution = await cmcClient.Solve(recaptchaV2ProxylessRequest);
console.log('Solution from CapMonster:', solution);
// Retrieving a token from a solution object
const token = solution.solution.gRecaptchaResponse;
// Inserting the result into a form
await page.evaluate((result) => {
document.getElementById('g-recaptcha-response').value = result;
console.log('Token in the console:', result); // Output the token to the console
}, token);
console.log('The token is inserted into the form!');
await page.click('#recaptcha-demo-submit');
console.log('Form submitted!'); // Optional step
await new Promise(resolve => setTimeout(resolve, 10000));
} catch (error) {
console.error('Error:', error);
} finally {
await browser.close();
}
}
solveRecaptcha();
Explicação do Código:
async function solveRecaptcha() {...}: Declarando uma função assíncrona solveRecaptcha que conterá todo o código.
const browser = await launch({ headless: false });: Iniciando o navegador com Puppeteer. A opção headless: false significa que o navegador será iniciado com uma interface gráfica (não em segundo plano).
const page = await browser.newPage();: Criando uma nova aba no navegador.
const cmcClient = CapMonsterCloudClientFactory.Create(new ClientOptions({ clientKey: CAPMONSTER_API_KEY }));: Inicializando o cliente CapMonster com a chave da API fornecida.
await page.goto(WEBSITE_URL);: Acessando o site especificado.
const recaptchaV2ProxylessRequest = new RecaptchaV2ProxylessRequest({ ... });: Criando um objeto de solicitação para resolver o reCAPTCHA do tipo V2 Proxyless. Aqui você define parâmetros como o URL do site e a chave do reCAPTCHA.
const solution = await cmcClient.Solve(recaptchaV2ProxylessRequest);: Enviando uma solicitação para o CapMonster resolver o reCAPTCHA. O resultado é salvo no objeto solution.
const token = solution.solution.gRecaptchaResponse;: Recuperando o token (resposta do reCAPTCHA) do objeto de solução do CapMonster.
await page.evaluate((result) => {...}, token);: Inserindo o token em um formulário na página web usando o método evaluate do Puppeteer.
await page.click('#recaptcha-demo-submit');: Clicando em um botão com o seletor especificado (neste caso, um botão com o id recaptcha-demo-submit).
await new Promise(resolve => setTimeout(resolve, 10000));: Esperando 10 segundos (neste caso, uma pausa) usando Promise.
} catch (error) { console.error('Error:', error); } finally { await browser.close(); }}: Tratamento de erros (se houver) e fechamento do navegador no bloco finally.
solveRecaptcha();: Chamando a função solveRecaptcha para concluir todo o processo.
Código Completo:
import { launch } from 'puppeteer';
import { CapMonsterCloudClientFactory, ClientOptions, RecaptchaV2ProxylessRequest } from '@zennolab_com/capmonstercloud-client';
const CAPMONSTER_API_KEY = 'YOUR_API_KEY';
const WEBSITE_KEY = 'EXAMPLE_SITE_KEY';
const WEBSITE_URL = 'https://lessons.zennolab.com/captchas/recaptcha/v2_simple.php?level=high';
async function solveRecaptcha() {
const browser = await launch({ headless: false });
const page = await browser.newPage();
// Initializing the CapMonster client
const cmcClient = CapMonsterCloudClientFactory.Create(new ClientOptions({ clientKey: CAPMONSTER_API_KEY }));
try {
await page.goto(WEBSITE_URL);
console.log('Page is open, reCAPTCHA solving...');
// Creating a request for a reCAPTCHA solving type V2 Proxyless
const recaptchaV2ProxylessRequest = new RecaptchaV2ProxylessRequest({
websiteURL: WEBSITE_URL,
websiteKey: WEBSITE_KEY,
});
// reCAPTCHA solving using CapMonster
const solution = await cmcClient.Solve(recaptchaV2ProxylessRequest);
console.log('Solution from CapMonster:', solution);
// Retrieving a token from a solution object
const token = solution.solution.gRecaptchaResponse;
// Inserting the result into a form
await page.evaluate((result) => {
document.getElementById('g-recaptcha-response').value = result;
console.log('Token is in the console:', result); // Output the token to the console
}, token);
console.log('The token is inserted into the form!');
await page.click('#recaptcha-demo-submit');
console.log('Form is submitted!'); // Optional step
await new Promise(resolve => setTimeout(resolve, 10000));
} catch (error) {
console.error('Error:', error);
} finally {
await browser.close();
}
}
solveRecaptcha();
- Execute o código com o comando no terminal: node your_project_name.js ou através do console de depuração. Se for bem-sucedido, uma página confirmada será aberta:

ReCaptcha v.3
- Importe todas as dependências necessárias:
import { launch } from 'puppeteer';
import { CapMonsterCloudClientFactory, ClientOptions, RecaptchaV3ProxylessRequest } from '@zennolab_com/capmonstercloud-client';
- Defina os valores:
const CAPMONSTER_API_KEY = 'YOUR_API_KEY';
const WEBSITE_KEY = 'EXAMPLE_SITE_KEY';
const WEBSITE_URL = 'https://lessons.zennolab.com/captchas/recaptcha/v3.php?level=beta';
- Vamos criar uma tarefa, enviá-la para o servidor CapMonster Cloud, obter uma solução e inserir um token no formulário de captcha:
async function solveRecaptcha() {
const browser = await launch({ headless: false });
const page = await browser.newPage();
console.log('Browser is initialized!');
// Initializing the CapMonster client
const cmcClient = CapMonsterCloudClientFactory.Create(new ClientOptions({ clientKey: CAPMONSTER_API_KEY }));
try {
await page.goto(WEBSITE_URL, {
waitUntil: 'domcontentloaded'
});
console.log('Browser page is switched to captcha page!');
const recaptchaV3ProxylessRequest = new RecaptchaV3ProxylessRequest({
websiteURL: WEBSITE_URL,
websiteKey: WEBSITE_KEY,
minScore: 0.7,
pageAction: "verify",
});
// Receiving a captcha solution from CapMonster
const solution = await cmcClient.Solve(recaptchaV3ProxylessRequest);
console.log('CapMonster Solution:', solution);
// Installing a custom userAgent (optional)
await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36'); // You can replace it with your own
await page.evaluate((result) => {
document.querySelector('#g-recaptcha-response-100000').style.display = 'block';
document.querySelector('#g-recaptcha-response-100000').style.visibility = 'visible';
document.querySelector('#g-recaptcha-response-100000').value = result;
}, solution);
console.log('Result injected into the page!');
await Promise.all([
page.waitForNavigation(),
page.click('#v3_submit')
]);
console.log('Button "Check" clicked!');
await new Promise(resolve => setTimeout(resolve, 10000));
} catch (e) {
console.error('An error occurred:', e);
} finally {
await browser.close();
}
}
solveRecaptcha();
Explicação desta parte do código:
async function solveRecaptcha() {...}: Declarando uma função assíncrona solveRecaptcha que contém todo o código.
const browser = await launch({ headless: false });: Iniciando o navegador usando Puppeteer. A opção headless: false significa que o navegador será iniciado com uma interface gráfica (não em segundo plano).
const page = await browser.newPage();: Criando uma nova aba no navegador.
console.log('Browser is initialized!');: Exibindo uma mensagem no console informando que o navegador foi inicializado.
const cmcClient = CapMonsterCloudClientFactory.Create(new ClientOptions({ clientKey: CAPMONSTER_API_KEY }));: Inicializando o cliente CapMonster com a chave de API fornecida.
await page.goto(WEBSITE_URL);: Acessando o site especificado.
const recaptchaV3ProxylessRequest = new RecaptchaV3ProxylessRequest({ ... });: Criando um objeto de solicitação para resolver o reCAPTCHA do tipo V3 Proxyless. Aqui, são definidos parâmetros como o URL do site e a chave do reCAPTCHA.
const solution = await cmcClient.Solve(recaptchaV3ProxylessRequest);: Enviando uma solicitação ao CapMonster para resolver o reCAPTCHA. O resultado é salvo no objeto solution.
await page.evaluate((result) => {...}, solution);: Inserindo a solução do reCAPTCHA em um formulário na página usando o método evaluate do Puppeteer.
await Promise.all([...]);: Aguardando a conclusão tanto da navegação quanto do clique no botão com o seletor especificado.
console.log('Result injected into the page!');: Exibindo uma mensagem no console informando que o resultado foi inserido na página.
await new Promise(resolve => setTimeout(resolve, 10000));: Esperando 10 segundos (pausa) utilizando Promise.
} catch (e) { console.error('An error occurred:', e); } finally { await browser.close(); }}: Tratamento de erros (se ocorrerem) e fechamento do navegador no bloco finally.
solveRecaptcha();: Chamando a função solveRecaptcha para completar todo o processo.
Código Completo:
import { launch } from 'puppeteer';
import { CapMonsterCloudClientFactory, ClientOptions, RecaptchaV3ProxylessRequest } from '@zennolab_com/capmonstercloud-client';
const CAPMONSTER_API_KEY = 'YOUR_API_KEY';
const WEBSITE_KEY = 'EXAMPLE_SITE_KEY';
const WEBSITE_URL = 'https://lessons.zennolab.com/captchas/recaptcha/v3.php?level=beta';
async function solveRecaptcha() {
const browser = await launch({ headless: false });
const page = await browser.newPage();
console.log('Browser is initialized!');
// Initializing the CapMonster client
const cmcClient = CapMonsterCloudClientFactory.Create(new ClientOptions({ clientKey: CAPMONSTER_API_KEY }));
try {
await page.goto(WEBSITE_URL, {
waitUntil: 'domcontentloaded'
});
console.log('Browser page is switched to captcha page!');
const recaptchaV3ProxylessRequest = new RecaptchaV3ProxylessRequest({
websiteURL: WEBSITE_URL,
websiteKey: WEBSITE_KEY,
minScore: 0.7,
pageAction: "verify",
});
// Getting a captcha solution from CapMonster
const solution = await cmcClient.Solve(recaptchaV3ProxylessRequest);
console.log('CapMonster Solution:', solution);
await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36');
await page.evaluate((result) => {
document.querySelector('#g-recaptcha-response-100000').style.display = 'block';
document.querySelector('#g-recaptcha-response-100000').style.visibility = 'visible';
document.querySelector('#g-recaptcha-response-100000').value = result;
}, solution);
console.log('Result embedded into the page!');
await Promise.all([
page.waitForNavigation(),
page.click('#v3_submit')
]);
console.log('Button "Check" clicked!');
await new Promise(resolve => setTimeout(resolve, 10000));
} catch (e) {
console.error('An error occurred:', e);
} finally {
await browser.close();
}
}
solveRecaptcha();
- Vamos executar o código:

Cloudflare Turnstile
Aqui, vamos preencher um pequeno formulário de contato no site de teste tsmanaged.zlsupport.com e resolver um captcha Cloudflare Turnstile. Assim como nos tipos anteriores de captchas, precisamos descobrir a chave do site (sitekey) do captcha nas ferramentas de desenvolvedor do navegador.
- Vamos importar as dependências e escrever os valores:
import { launch } from 'puppeteer';
import { CapMonsterCloudClientFactory, ClientOptions, TurnstileProxylessRequest } from '@zennolab_com/capmonstercloud-client';
const CAPMONSTER_API_KEY = 'YOUR_API_KEY';
const WEBSITE_KEY = 'EXAMPLE_SITE_KEY';
const WEBSITE_URL = 'www.example.com';
- Vamos iniciar o navegador, criar uma tarefa para o CapMonster Cloud, enviá-la para o servidor, receber e inserir o resultado na página:
async function solveCloudflareTurnstileCaptcha() {
const browser = await launch({ headless: false });
const page = await browser.newPage();
// Initializing the CapMonster client
const cmcClient = CapMonsterCloudClientFactory.Create(new ClientOptions({ clientKey: CAPMONSTER_API_KEY }));
try {
await page.goto(WEBSITE_URL);
console.log('Page is open, solving Cloudflare Turnstile CAPTCHA...');
await page.type('#username', 'login');
await page.type('#password', 'pass');
const turnstileTaskRequest = new TurnstileProxylessRequest({
websiteURL: WEBSITE_URL,
websiteKey: WEBSITE_KEY,
});
// Getting a captcha solution from CapMonster
const solutionObject = await cmcClient.Solve(turnstileTaskRequest);
console.log('CapMonster Solution:', solutionObject);
const token = solutionObject.solution.token;
console.log('Captcha solved:', token);
// Inserting a token into the "token" field
await page.evaluate((extractedToken) => {
const tokenField = document.querySelector('#token');
if (tokenField) {
tokenField.value = extractedToken;
}
}, token);
console.log('Token inserted into the "token" field!');
// Click on the "Submit" button after inserting the token
await page.evaluate(() => {
const submitButton = document.querySelector('button[type="submit"]');
if (submitButton) {
submitButton.click();
}
});
console.log('Clicked on the "Submit" button after token insertion!');
await new Promise(resolve => setTimeout(resolve, 5000));
} catch (error) {
console.error('Error:', error);
} finally {
await browser.close();
}
}
solveCloudflareTurnstileCaptcha();
Explicação desta parte do código:
async function solveCloudflareTurnstileCaptcha() { ... }: Declarando uma função assíncrona solveCloudflareTurnstileCaptcha, que contém todo o código para resolver o CAPTCHA Cloudflare Turnstile.
const browser = await launch({ headless: false });: Iniciando o navegador usando o Puppeteer. A opção headless: false especifica que o navegador será iniciado com uma interface gráfica.
const page = await browser.newPage();: Criando uma nova aba (página) no navegador.
const cmcClient = CapMonsterCloudClientFactory.Create(new ClientOptions({ clientKey: CAPMONSTER_API_KEY }));: Inicializando o cliente CapMonster usando a chave de API fornecida.
await page.goto(WEBSITE_URL);: Acessando a página com o CAPTCHA Cloudflare Turnstile.
console.log('Page opened, solving Cloudflare Turnstile CAPTCHA...');: Exibindo uma mensagem no console indicando que a página foi aberta e que o processo de resolver o CAPTCHA Cloudflare Turnstile começou.
await page.type('#username', 'login');: Inserção de dados no campo "username".
await page.type('#password', 'pass');: Inserção de dados no campo "password".
const turnstileTaskRequest = new TurnstileProxylessRequest({ ... });: Criando um objeto de solicitação para a solução do CAPTCHA Turnstile. Definindo parâmetros como a URL do site e a chave do CAPTCHA Turnstile.
const solutionObject = await cmcClient.Solve(turnstileTaskRequest);: Enviando a solicitação ao CapMonster para a solução do CAPTCHA Turnstile. O resultado é salvo no solutionObject.
console.log('CapMonster Solution:', solutionObject);: Exibindo informações sobre a solução do CapMonster no console.
const token = solutionObject.solution.token;: Recuperando o token (resultado da solução) do solutionObject.
console.log('Captcha solved:', token);: Exibindo uma mensagem no console indicando que o CAPTCHA foi resolvido e mostrando o token.
await page.evaluate((extractedToken) => { ... }, token);: Inserindo o token no campo "token" em uma página da web usando o método evaluate do Puppeteer.
console.log('Token inserted into the "token" field!');: Exibindo uma mensagem no console indicando que o token foi inserido no campo "token".
await page.evaluate(() => { ... });: Clicando no botão "Submit" após inserir o token usando o método evaluate do Puppeteer.
console.log('Clicked on the "Submit" button after token insertion!');: Exibindo uma mensagem no console indicando que uma operação de clique foi realizada no botão "Submit" após inserir o token.
await new Promise(resolve => setTimeout(resolve, 5000));: Pausando por 5 segundos usando Promise.
} catch (error) { console.error('Error:', error); } finally { await browser.close(); }: Tratamento de erros (caso ocorram) com a exibição de uma mensagem de erro no console. Fechando o navegador no bloco finally para garantir que o processo seja concluído.
solveCloudflareTurnstileCaptcha();: Chamando a função solveCloudflareTurnstileCaptcha para completar todo o processo de resolução do CAPTCHA Cloudflare Turnstile.
Código Completo:
import { launch } from 'puppeteer';
import { CapMonsterCloudClientFactory, ClientOptions, TurnstileProxylessRequest } from '@zennolab_com/capmonstercloud-client';
const CAPMONSTER_API_KEY = 'YOUR_API_KEY';
const WEBSITE_KEY = 'EXAMPLE_SITE_KEY';
const WEBSITE_URL = 'www.example.com';
async function solveCloudflareTurnstileCaptcha() {
const browser = await launch({ headless: false });
const page = await browser.newPage();
// Initializing the CapMonster client
const cmcClient = CapMonsterCloudClientFactory.Create(new ClientOptions({ clientKey: CAPMONSTER_API_KEY }));
try {
await page.goto(WEBSITE_URL);
console.log('Page opened, solving Cloudflare Turnstile CAPTCHA...');
await page.type('#username', 'login');
await page.type('#password', 'pass');
const turnstileTaskRequest = new TurnstileProxylessRequest({
websiteURL: WEBSITE_URL,
websiteKey: WEBSITE_KEY,
});
// Getting a captcha solution from CapMonster
const solutionObject = await cmcClient.Solve(turnstileTaskRequest);
console.log('CapMonster Solution:', solutionObject);
const token = solutionObject.solution.token;
console.log('Captcha solved:', token);
// Inserting a token into the "token" field
await page.evaluate((extractedToken) => {
const tokenField = document.querySelector('#token');
if (tokenField) {
tokenField.value = extractedToken;
}
}, token);
console.log('Token inserted into the "token" field!');
// Click on the "Submit" button after inserting the token
await page.evaluate(() => {
const submitButton = document.querySelector('button[type="submit"]');
if (submitButton) {
submitButton.click();
}
});
console.log('Clicked on the "Submit" button after token insertion!');
await new Promise(resolve => setTimeout(resolve, 5000));
} catch (error) {
console.error('Error:', error);
} finally {
await browser.close();
}
}
solveCloudflareTurnstileCaptcha();
- Vamos executar o código. Se tudo estiver correto, o código resolverá o CAPTCHA e abrirá uma página de confirmação.

Anteriormente, usamos Puppeteer em JavaScript. Agora, vamos tentar usar o Playwright em Python. Continuaremos trabalhando no VS Code, aqui estão os passos para instalar o Playwright:
- Instalando o Playwright. Crie uma nova pasta onde os arquivos do projeto serão armazenados, abra-a no VS Code e execute o seguinte comando no terminal: pip install playwright
- Instalando os navegadores. Após instalar o Playwright, para instalar todos os navegadores suportados (Chromium, Firefox, WebKit) de uma vez, execute o comando: python -m playwright install
Para instalar apenas um navegador, por exemplo, o Chromium, execute o comando: python -m playwright install chromium
Instale a biblioteca oficial do CapMonster Cloud com o comando: pip install capmonstercloudclient.
Agora você pode escrever o código para resolver o captcha automaticamente.
ReCaptcha v.2
- Importe todas as dependências necessárias e escreva os dados (você pode criar um arquivo .env separado para os dados):
import asyncio
from playwright.async_api import async_playwright
from capmonstercloudclient import CapMonsterClient, ClientOptions
from capmonstercloudclient.requests import RecaptchaV2ProxylessRequest
API_KEY = "YOUR_API_KEY"
WEBSITE_URL = "https://lessons.zennolab.com/captchas/recaptcha/v2_simple.php?level=high"
WEBSITE_KEY = "EXAMPLE_SITE_KEY"
- Crie uma tarefa para enviá-la ao servidor, utilizando os dados disponíveis, obteremos a resposta e inseriremos a solução no formulário do captcha:
client_options = ClientOptions(api_key=API_KEY)
cap_monster_client = CapMonsterClient(options=client_options)
async def solve_captcha():
# Creating a reCAPTCHA solution request type V2 Proxyless
recaptcha_request = RecaptchaV2ProxylessRequest(websiteUrl=WEBSITE_URL, websiteKey=WEBSITE_KEY)
return await cap_monster_client.solve_captcha(recaptcha_request)
async def main():
try:
async with async_playwright() as p:
# Launching the browser
browser = await p.chromium.launch(headless=False)
context = await browser.new_context()
page = await context.new_page()
# Opening a website
await page.goto(WEBSITE_URL)
print('Page is open, waiting for reCAPTCHA to load...')
# Wait a while for the CAPTCHA to load (you can configure the duration)
await asyncio.sleep(5)
# reCAPTCHA solution using CapMonster
responses = await solve_captcha()
print('Ответ от CapMonster:', responses)
# Inserting a solved reCAPTCHA into a page
await page.evaluate(f'document.getElementById("g-recaptcha-response").innerHTML = "{responses["gRecaptchaResponse"]}";')
print('The result is inserted into the page!')
# Performing additional actions if necessary (for example, submitting a form)
await page.click('#recaptcha-demo-submit')
print('Form is submitted!')
# Wait a while to observe changes
await asyncio.sleep(10)
except Exception as e:
print('Error:', e)
finally:
# Closing the browser
await browser.close()
asyncio.run(main())
Explicação desta parte do código:
client_options = ClientOptions(api_key=API_KEY): Inicializando as configurações do cliente CapMonster utilizando a chave da API fornecida.
cap_monster_client = CapMonsterClient(options=client_options): Criando o cliente CapMonster usando as opções definidas em client_options.
async def solve_captcha(): ...: Função assíncrona solve_captcha, que cria uma solicitação para resolver o captcha do tipo reCAPTCHA V2 Proxyless e a envia para o cliente CapMonster para ser resolvida.
async def main(): ...: Função assíncrona principal que inclui o código principal para abrir o navegador, carregar a página, resolver o captcha usando o CapMonster, inserir a solução na página e realizar ações adicionais.
async with async_playwright() as p: ...: Usando o async_playwright para controlar o navegador com Playwright de forma assíncrona.
browser = await p.chromium.launch(headless=False): Inicializando o navegador Chromium com a capacidade de exibir uma interface gráfica (não no modo headless).
await page.goto(WEBSITE_URL): Acessando o site especificado.
await asyncio.sleep(5): Pausa para aguardar o carregamento do CAPTCHA (neste caso, 5 segundos).
responses = await solve_captcha(): Chamando a função solve_captcha para resolver o reCAPTCHA usando o CapMonster.
await page.evaluate(f'document.getElementById("g-recaptcha-response").innerHTML = "{responses["gRecaptchaResponse"]}";'): Inserindo a solução do reCAPTCHA na página usando o método evaluate do Playwright.
await page.click('#recaptcha-demo-submit'): Clicando em um botão com o seletor especificado (neste caso, o botão "Submit" da página de demonstração do reCAPTCHA).
await asyncio.sleep(10): Pausa para observar as mudanças após enviar o formulário (neste caso, 10 segundos).
await browser.close(): Fechando o navegador dentro de um bloco finally para garantir a conclusão.
asyncio.run(main()): Executando a função assíncrona main.
Código completo:
import asyncio
from playwright.async_api import async_playwright
from capmonstercloudclient import CapMonsterClient, ClientOptions
from capmonstercloudclient.requests import RecaptchaV2ProxylessRequest
API_KEY = "YOUR_API_KEY"
WEBSITE_URL = "https://lessons.zennolab.com/captchas/recaptcha/v2_simple.php?level=high"
WEBSITE_KEY = "EXAMPLE_SITE_KEY"
client_options = ClientOptions(api_key=API_KEY)
cap_monster_client = CapMonsterClient(options=client_options)
async def solve_captcha():
# Creating a reCAPTCHA solution request type V2 Proxyless
recaptcha_request = RecaptchaV2ProxylessRequest(websiteUrl=WEBSITE_URL, websiteKey=WEBSITE_KEY)
return await cap_monster_client.solve_captcha(recaptcha_request)
async def main():
try:
async with async_playwright() as p:
# Launching the browser
browser = await p.chromium.launch(headless=False)
context = await browser.new_context()
page = await context.new_page()
# Opening a website
await page.goto(WEBSITE_URL)
print('Page is open, waiting for reCAPTCHA to load...')
# Wait a while for the CAPTCHA to load (you can configure the duration)
await asyncio.sleep(5)
# reCAPTCHA solution using CapMonster
responses = await solve_captcha()
print('CapMonster response:', responses)
# Inserting a solved reCAPTCHA into a page
await page.evaluate(f'document.getElementById("g-recaptcha-response").innerHTML = "{responses["gRecaptchaResponse"]}";')
print('The result is inserted into the page!')
# Perform additional actions if necessary (for example, submitting a form)
await page.click('#recaptcha-demo-submit')
print('Form is submitted!')
# Wait a while to observe changes
await asyncio.sleep(10)
except Exception as e:
print('Error:', e)
finally:
# Closing the browser
await browser.close()
asyncio.run(main())
- Solução bem-sucedida do captcha:

ReCaptcha v.3
- Importe todas as dependências necessárias e insira os dados:
import asyncio
from playwright.async_api import async_playwright
from capmonstercloudclient import CapMonsterClient, ClientOptions
from capmonstercloudclient.requests import RecaptchaV3ProxylessRequest
CAPMONSTER_API_KEY = 'YOUR_API_KEY'
WEBSITE_KEY = 'EXAMPLE_SITE_KEY'
WEBSITE_URL = 'https://lessons.zennolab.com/captchas/recaptcha/v3.php?level=beta'
- Crie uma tarefa, envie-a para o servidor e obtenha a solução:
async def solve_recaptcha():
# Initializing Playwright
async with async_playwright() as p:
browser = await p.chromium.launch(headless=False)
context = await browser.new_context()
page = await context.new_page()
print('Browser initialized!')
# Initializing the CapMonster client
client_options = ClientOptions(api_key=CAPMONSTER_API_KEY)
cap_monster_client = CapMonsterClient(options=client_options)
try:
# Setting a custom userAgent
(optional)
user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36' #Insert yours
await page.set_extra_http_headers({'User-Agent': user_agent})
# Going to the specified page
await page.goto(WEBSITE_URL, wait_until='domcontentloaded')
print('Browser switched to page with captcha!')
# Creating a request for a reCAPTCHA solving type V3 Proxyless
recaptcha_request = RecaptchaV3ProxylessRequest(
websiteUrl=WEBSITE_URL,
websiteKey=WEBSITE_KEY,
action='verify',
min_score=0.7,
)
# reCAPTCHA solving using CapMonster
task_result = await cap_monster_client.solve_captcha(recaptcha_request)
print('reCAPTCHA V3 solved:', task_result)
# Inserting the result into the page
await page.evaluate(f'document.querySelector(\'#g-recaptcha-response-100000\').style.display = "block";')
await page.evaluate(f'document.querySelector(\'#g-recaptcha-response-100000\').style.visibility = "visible";')
await page.evaluate(f'document.querySelector(\'#g-recaptcha-response-100000\').value = "{task_result}";')
print('The result is inserted into the page!')
# Click on the button to check
await page.click('#v3_submit')
print('"Check" button pressed!')
# Pause for 10 seconds
await page.wait_for_timeout(10000)
finally:
# Closing the browser
await browser.close()
# Running an asynchronous function to solve reCAPTCHA
asyncio.run(solve_recaptcha())
Explicação desta parte do código:
async with async_playwright() as p: ...: Usando o async_playwright para controlar o navegador com o Playwright de forma assíncrona.
browser = await p.chromium.launch(headless=False): Iniciando o navegador Chromium com a capacidade de exibir uma interface gráfica (não no modo headless).
await page.goto(URL): Acessando o site especificado.
client_options = ClientOptions(api_key=API_KEY): Inicializando as configurações do cliente CapMonster usando a chave da API fornecida.
cap_monster_client = CapMonsterClient(options=client_options): Criando o cliente CapMonster utilizando as opções definidas em client_options.
recaptcha_request = RecaptchaV3ProxylessRequest(...): Criando um objeto de solicitação para a solução reCAPTCHA V3 Proxyless. Aqui, parâmetros como URL do site, chave do reCAPTCHA, ação e pontuação mínima são definidos.
task_result = await cap_monster_client.solve_captcha(recaptcha_request): Resolvendo o reCAPTCHA usando o CapMonster. O resultado é salvo em task_result.
await page.evaluate(f'document.querySelector(\'#g-recaptcha-response-100000\').style.display = "block";'): Inserindo o resultado na página usando o método evaluate do Playwright. Nesse caso, o estilo do elemento é alterado para que ele se torne visível.
await page.click('[data-action="demo_action"]'): Clicando no botão com o seletor especificado (neste caso, o botão “Check”).
await asyncio.sleep(10): Pausa de 10 segundos para observar as mudanças.
await browser.close(): Fechando o navegador no bloco finally para concluir.
asyncio.run(solve_recaptcha()): Executando a função assíncrona solve_recaptcha.
Código completo:
import asyncio
from playwright.async_api import async_playwright
from capmonstercloudclient import CapMonsterClient, ClientOptions
from capmonstercloudclient.requests import RecaptchaV3ProxylessRequest
CAPMONSTER_API_KEY = 'YOUR_API_KEY'
WEBSITE_KEY = 'EXAMPLE_SITE_KEY'
WEBSITE_URL = 'https://lessons.zennolab.com/captchas/recaptcha/v3.php?level=beta'
async def solve_recaptcha():
# Initializing Playwright
async with async_playwright() as p:
browser = await p.chromium.launch(headless=False)
context = await browser.new_context()
page = await context.new_page()
print('Browser initialized!')
# Initializing the CapMonster client
client_options = ClientOptions(api_key=CAPMONSTER_API_KEY)
cap_monster_client = CapMonsterClient(options=client_options)
try:
# Installing the user agent
user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36'
await page.set_extra_http_headers({'User-Agent': user_agent})
# Going to the specified page
await page.goto(WEBSITE_URL, wait_until='domcontentloaded')
print('Browser switched to page with captcha!')
# Creating a request for a reCAPTCHA solution type V3 Proxyless
recaptcha_request = RecaptchaV3ProxylessRequest(
websiteUrl=WEBSITE_URL,
websiteKey=WEBSITE_KEY,
action='verify',
min_score=0.7,
)
# reCAPTCHA solution using CapMonster
task_result = await cap_monster_client.solve_captcha(recaptcha_request)
print('reCAPTCHA V3 solved:', task_result)
# Inserting the result into the page
await page.evaluate(f'document.querySelector(\'#g-recaptcha-response-100000\').style.display = "block";')
await page.evaluate(f'document.querySelector(\'#g-recaptcha-response-100000\').style.visibility = "visible";')
await page.evaluate(f'document.querySelector(\'#g-recaptcha-response-100000\').value = "{task_result}";')
print('The result is inserted into the page!')
# Click on the button to check
await page.click('#v3_submit')
print('"Check" button pressed!')
# Pause for 10 seconds
await page.wait_for_timeout(10000)
finally:
# Closing the browser
await browser.close()
# Running an asynchronous function to solve reCAPTCHA
asyncio.run(solve_recaptcha())
- Se tudo for feito corretamente, o código resolverá automaticamente o captcha e abrirá uma página com a verificação bem-sucedida.

Cloudflare Turnstile
- Importe as dependências necessárias:
import asyncio
from playwright.async_api import async_playwright
from capmonstercloudclient import CapMonsterClient, ClientOptions
from capmonstercloudclient.requests import TurnstileProxylessRequest
- Digite os dados (ou importe-os de um arquivo .env):
API_KEY = 'YOUR_API_KEY'
WEBSITE_KEY = 'EXAMPLE_SITE_KEY'
WEBSITE_URL = 'www.example.com'
- Crie uma tarefa, envie-a para o servidor CapMonster Cloud para resolver o captcha, obtenha o resultado e insira o token no elemento de captcha apropriado:
async def solve_turnstile_captcha():
async with async_playwright() as p:
browser = await p.chromium.launch(headless=False)
context = await browser.new_context()
page = await context.new_page()
try:
await page.goto(WEBSITE_URL)
print('Page opened, solving Cloudflare Turnstile CAPTCHA...')
# Fill in the "username" and "password" fields with your credentials
await page.fill('input[name="username"]', 'yourlogin')
await page.fill('input[name="password"]', 'yourpass')
# Initializing the CapMonster client
client_options = ClientOptions(api_key=API_KEY)
cap_monster_client = CapMonsterClient(options=client_options)
turnstile_request = TurnstileProxylessRequest(
websiteURL=WEBSITE_URL,
websiteKey=WEBSITE_KEY,
)
# Cloudflare Turnstile CAPTCHA Solution Using CapMonster
task_result = await cap_monster_client.solve_captcha(turnstile_request)
token = task_result.get('token')
print('Captcha solved:', token)
# Inserting a token into the "token" field
await page.evaluate(f'document.querySelector(\'#token\').value = \'{token}\';')
print('Token inserted into the "token" field!')
# Clicking the "Submit" button after inserting the token
await page.click('button[type="submit"]')
print('Clicked on the "Submit" button after token insertion!')
await asyncio.sleep(5)
except Exception as e:
print(f"An error occurred: {e}")
finally:
await browser.close()
asyncio.run(solve_turnstile_captcha())
Explicação desta parte do código:
async with async_playwright() as p:: Usando async_playwright para controlar o navegador com Playwright de forma assíncrona.
browser = await p.chromium.launch(headless=False):: Iniciando o navegador Chromium com a capacidade de exibir uma interface gráfica (não no modo headless).
context = await browser.new_context():: Criando um novo contexto para uma página.
page = await context.new_page():: Criando uma nova página dentro do novo contexto.
await page.goto(WEBSITE_URL):: Acessando o website especificado.
await page.fill('input[name="username"]', 'yourlogin'):: Preenchendo o campo "username" com o login especificado.
await page.fill('input[name="password"]', 'yourpass'):: Preenchendo o campo "password" com a senha especificada.
client_options = ClientOptions(api_key=API_KEY):: Inicializando as configurações do cliente CapMonster usando a chave de API fornecida.
cap_monster_client = CapMonsterClient(options=client_options):: Criando um cliente CapMonster usando as opções definidas em client_options.
turnstile_request = TurnstileProxylessRequest(...):: Criando um objeto de solicitação para a solução do CAPTCHA Cloudflare Turnstile Proxyless. Aqui, são definidos parâmetros como o URL do site e a chave do Turnstile.
task_result = await cap_monster_client.solve_captcha(turnstile_request):: Solucionando o CAPTCHA Cloudflare Turnstile usando o CapMonster. O resultado é salvo em task_result.
token = task_result.get('token'):: Recuperando o token dos resultados da solução.
await page.evaluate(f'document.querySelector(\'#token\').value = \'{token}\';'):: Inserindo o token no campo "token" usando o método evaluate do Playwright.
await page.click('button[type="submit"]'):: Clicando no botão "Submit".
await asyncio.sleep(5):: Pausando por 5 segundos para observar as mudanças.
await browser.close():: Fechando o navegador dentro de um bloco finally para garantir que o navegador será fechado após a execução.
asyncio.run(solve_cloudflare_turnstile_captcha()):: Executando a função assíncrona solve_cloudflare_turnstile_captcha.
Código completo:
import asyncio
from playwright.async_api import async_playwright
from capmonstercloudclient import CapMonsterClient, ClientOptions
from capmonstercloudclient.requests import TurnstileProxylessRequest
API_KEY = 'YOUR_API_KEY'
WEBSITE_KEY = 'EXAMPLE_SITE_KEY'
WEBSITE_URL = 'www.example.com'
async def solve_turnstile_captcha():
async with async_playwright() as p:
browser = await p.chromium.launch(headless=False)
context = await browser.new_context()
page = await context.new_page()
try:
await page.goto(WEBSITE_URL)
print('Page opened, solving Cloudflare Turnstile CAPTCHA...')
# Fill in the "username" and "password" fields with your data
await page.fill('input[name="username"]', 'yourlogin')
await page.fill('input[name="password"]', 'yourpass')
# Initializing the CapMonster client
client_options = ClientOptions(api_key=API_KEY)
cap_monster_client = CapMonsterClient(options=client_options)
turnstile_request = TurnstileProxylessRequest(
websiteURL=WEBSITE_URL,
websiteKey=WEBSITE_KEY,
)
# Cloudflare Turnstile CAPTCHA solution using CapMonster
task_result = await cap_monster_client.solve_captcha(turnstile_request)
token = task_result.get('token')
print('Captcha solved:', token)
# Inserting a token into the "token" field
await page.evaluate(f'document.querySelector(\'#token\').value = \'{token}\';')
print('Token inserted into the "token" field!')
# Clicking the "Submit" button after inserting the token
await page.click('button[type="submit"]')
print('Clicked on the "Submit" button after token insertion!')
await asyncio.sleep(5)
except Exception as e:
print(f"An error occurred: {e}")
finally:
await browser.close()
asyncio.run(solve_turnstile_captcha())
- Execute o projeto e veja o resultado. Se tudo estiver correto, você verá a página com a verificação concluída.

Como você pode ver, contornar captchas parece ser uma tarefa difícil. Tudo o que você precisa é conhecer os dados do site e os dados do captcha, indicar seu tipo e criar corretamente a tarefa, enviá-la e receber/inserir o token no elemento necessário. O CapMonster Cloud fará o resto. Ele pode ser usado junto com praticamente qualquer biblioteca e framework, e integrar esse serviço com Puppeteer ou Playwright usando código permitirá que você obtenha rapidamente e de forma eficiente soluções para até mesmo os captchas mais complexos nos sites necessários.
NB: Como lembrete, o produto é usado para automatizar testes em seus próprios sites e em sites aos quais você tem acesso legal.