Playwright fornece automação confiável de navegador em Chromium, Firefox e WebKit. Quando as páginas de destino atendem CAPTCHAs, CaptchaAI os resolve no lado do servidor enquanto o Playwright cuida da interação do navegador.
Requisitos
| Requisito | Detalhes |
|---|---|
| Pitão | pip install playwright requests e depois playwright install |
| Node.js | npm install playwright axios |
| Chave de API CaptchaAI | Decaptchaai.com |
Python: Dramaturgo + CaptchaAI
Configuração
from playwright.sync_api import sync_playwright
import requests
import time
API_KEY = "YOUR_API_KEY"
def solve_recaptcha(site_key, page_url):
resp = requests.get("https://ocr.captchaai.com/in.php", params={
"key": API_KEY,
"method": "userrecaptcha",
"googlekey": site_key,
"pageurl": page_url
})
if not resp.text.startswith("OK|"):
raise Exception(resp.text)
task_id = resp.text.split("|")[1]
for _ in range(60):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY, "action": "get", "id": task_id
})
if result.text == "CAPCHA_NOT_READY": continue
if result.text.startswith("OK|"): return result.text.split("|")[1]
raise Exception(result.text)
raise TimeoutError()
Exemplo completo
def login_with_captcha(url, username, password):
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
context = browser.new_context(
user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
)
page = context.new_page()
page.goto(url)
# Fill login form
page.fill("#username", username)
page.fill("#password", password)
# Check for reCAPTCHA
recaptcha = page.query_selector(".g-recaptcha")
if recaptcha:
site_key = recaptcha.get_attribute("data-sitekey")
print(f"Solving reCAPTCHA: {site_key}")
token = solve_recaptcha(site_key, page.url)
# Inject token
page.evaluate(f"""
document.getElementById('g-recaptcha-response').innerHTML = '{token}';
document.getElementById('g-recaptcha-response').style.display = '';
""")
# Submit
page.click('button[type="submit"]')
page.wait_for_load_state("networkidle")
print(f"Current URL: {page.url}")
content = page.content()
browser.close()
return content
result = login_with_captcha(
"https://staging.example.com/qa-login",
"user@example.com",
"password123"
)
Versão assíncrona
from playwright.async_api import async_playwright
import aiohttp
import asyncio
async def solve_recaptcha_async(site_key, page_url):
async with aiohttp.ClientSession() as session:
params = {
"key": API_KEY, "method": "userrecaptcha",
"googlekey": site_key, "pageurl": page_url
}
async with session.get("https://ocr.captchaai.com/in.php", params=params) as resp:
text = await resp.text()
task_id = text.split("|")[1]
for _ in range(60):
await asyncio.sleep(5)
params = {"key": API_KEY, "action": "get", "id": task_id}
async with session.get("https://ocr.captchaai.com/res.php", params=params) as resp:
text = await resp.text()
if text == "CAPCHA_NOT_READY": continue
if text.startswith("OK|"): return text.split("|")[1]
raise Exception(text)
raise TimeoutError()
async def main():
async with async_playwright() as p:
browser = await p.chromium.launch(headless=True)
page = await browser.new_page()
await page.goto("https://example.com/form")
site_key = await page.get_attribute(".g-recaptcha", "data-sitekey")
token = await solve_recaptcha_async(site_key, page.url)
await page.evaluate(f"document.getElementById('g-recaptcha-response').innerHTML = '{token}'")
await page.click('button[type="submit"]')
await browser.close()
asyncio.run(main())
Node.js: Dramaturgo + CaptchaAI
const { chromium } = require("playwright");
const axios = require("axios");
const API_KEY = "YOUR_API_KEY";
async function solveRecaptcha(siteKey, pageUrl) {
const submit = await axios.get("https://ocr.captchaai.com/in.php", {
params: {
key: API_KEY,
method: "userrecaptcha",
googlekey: siteKey,
pageurl: pageUrl,
},
});
const taskId = submit.data.split("|")[1];
while (true) {
await new Promise((r) => setTimeout(r, 5000));
const result = await axios.get("https://ocr.captchaai.com/res.php", {
params: { key: API_KEY, action: "get", id: taskId },
});
if (result.data === "CAPCHA_NOT_READY") continue;
if (result.data.startsWith("OK|")) return result.data.split("|")[1];
throw new Error(result.data);
}
}
(async () => {
const browser = await chromium.launch({ headless: true });
const page = await browser.newPage();
await page.goto("https://staging.example.com/qa-login");
// Fill form
await page.fill("#username", "user@example.com");
await page.fill("#password", "password123");
// Solve CAPTCHA
const siteKey = await page.getAttribute(".g-recaptcha", "data-sitekey");
if (siteKey) {
const token = await solveRecaptcha(siteKey, page.url());
await page.evaluate(
(t) => (document.getElementById("g-recaptcha-response").innerHTML = t),
token
);
}
// Submit
await page.click('button[type="submit"]');
await page.waitForLoadState("networkidle");
console.log("Logged in:", page.url());
await browser.close();
})();
Tratamento de Cloudflare Turnstile
# Detect Turnstile
turnstile = page.query_selector(".cf-turnstile")
if turnstile:
site_key = turnstile.get_attribute("data-sitekey")
resp = requests.get("https://ocr.captchaai.com/in.php", params={
"key": API_KEY, "method": "turnstile",
"sitekey": site_key, "pageurl": page.url
})
task_id = resp.text.split("|")[1]
# Poll and inject...
Dramaturgo vs Selênio vs Titereiro
| Recurso | Dramaturgo | Selênio | Puppeteer |
|---|---|---|---|
| Idiomas | Python, Node.js, C#, Java | Python, Java, C#, Ruby, JS | Node.js |
| Navegadores | Cromo, Firefox, WebKit | Cromo, Raposa de fogo, Borda, Safári | Cromo |
| Espera automática | ✅ Embutido | ⏳ Esperas manuais | ⚠️ Parcial |
| Interceptação de rede | ✅ | ⚠️ Limitado | ✅ |
| Integração CaptchaAI | ✅ Mesma API | ✅ Mesma API | ✅ Mesma API |
CaptchaAI funciona de forma idêntica com todos os três – extrair a chave do site, resolver via API, injetar o token.
Solução de problemas
| Problema | Correção |
|---|---|
page.query_selector retorna nulo |
CAPTCHA carrega dinamicamente; usar page.wait_for_selector() |
| A envio controlado ao endpoint QA não funciona | Verifique se a área de texto da resposta possui um ID diferente |
| O dramaturgo trava no Docker | Instale as dependências do navegador: playwright install-deps |
| CAPTCHA reaparece após resolver | O site pode exigir execução de retorno de chamada; acione-o via page.evaluate() |
Perguntas frequentes
A espera automática do Playwright ajuda com CAPTCHAs?
A espera automática do Playwright garante que os elementos fiquem visíveis antes da interação, mas não resolverá CAPTCHAs. Você precisa de CaptchaAI para a solução real.
Posso usar o Playwright com todos os tipos de CAPTCHA?
Sim. CaptchaAI cuida da solução via API - o Playwright só precisa extrair a chave do site e injetar o token. Isso funciona para reCAPTCHA, Turnstile, hCaptcha e todos os outros tipos suportados.
O Playwright é mais adequado que o Selenium para automação CAPTCHA?
A espera automática integrada do Playwright e o mais adequado design da API tornam os fluxos de trabalho CAPTCHA mais confiáveis. A integração CaptchaAI é idêntica para ambos.
Guias Relacionados
- Manipulação de Selênio CAPTCHA com Python
- Puppeteer CAPTCHA resolvendo com Node.js
- Tratamento automatizado de CAPTCHA de login