Os navegadores headless acionam CAPTCHAs com mais frequência do que os navegadores normais. Os sites detectam Chrome, Firefox e WebKit headless por meio de sinal de navegador de JavaScript e apresentam desafios para bloquear a automação. Veja como lidar com cada problema.
Por que os navegadores modo headless obtêm mais CAPTCHAs
| Método de detecção | Quais sites verificam |
|---|---|
sinal de navegador automatizado |
Defina como true no modo modo headless |
| Dimensões da janela | Headless geralmente usa o padrão 800x600 |
| Renderizador WebGL | Headless retorna "SwiftShader" |
| Protocolo Chrome DevTools | Porta CDP aberta |
| Plug-ins ausentes | Sem visualizador de PDF, Flash, etc. |
| API de permissões | Respostas diferentes em headless |
| String do agente do usuário | Substring "HeadlessChrome" |
Quando esses sinais se combinam, os sistemas anti-bot (reCAPTCHA, Cloudflare, DataDome) atribuem pontuações de confiança mais baixas e mostram CAPTCHAs.
Solução 1: Resolva CAPTCHAs via API
Em vez de tentar evitar totalmente os CAPTCHAs, resolva-os quando eles aparecerem. CaptchaAI funciona com qualquer navegador headless porque resolve CAPTCHAs do lado do servidor.
Selênio (Python)
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import requests
import time
API_KEY = "YOUR_API_KEY"
options = Options()
options.add_argument("--headless=new")
options.add_argument("--disable-blink-features=AutomationControlled")
driver = webdriver.Chrome(options=options)
driver.get("https://staging.example.com/qa-login")
# Check for CAPTCHA
recaptcha = driver.find_elements("class name", "g-recaptcha")
if recaptcha:
site_key = recaptcha[0].get_attribute("data-sitekey")
# Solve via CaptchaAI
resp = requests.get("https://ocr.captchaai.com/in.php", params={
"key": API_KEY, "method": "userrecaptcha",
"googlekey": site_key, "pageurl": driver.current_url
})
task_id = resp.text.split("|")[1]
while True:
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
token = result.text.split("|")[1]
break
# Inject token
driver.execute_script(
f"document.getElementById('g-recaptcha-response').innerHTML = '{token}';"
)
driver.find_element("css selector", "form").submit()
Puppeteer (Node.js)
const puppeteer = require("puppeteer");
const axios = require("axios");
const API_KEY = "YOUR_API_KEY";
const browser = await puppeteer.launch({ headless: "new" });
const page = await browser.newPage();
await page.goto("https://staging.example.com/qa-login");
// Check for CAPTCHA
const siteKey = await page
.$eval(".g-recaptcha", (el) => el.getAttribute("data-sitekey"))
.catch(() => null);
if (siteKey) {
const submit = await axios.get("https://ocr.captchaai.com/in.php", {
params: {
key: API_KEY,
method: "userrecaptcha",
googlekey: siteKey,
pageurl: page.url(),
},
});
const taskId = submit.data.split("|")[1];
let token;
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;
token = result.data.split("|")[1];
break;
}
await page.evaluate((t) => {
document.getElementById("g-recaptcha-response").innerHTML = t;
}, token);
await page.click('button[type="submit"]');
}
Solução 2: Reduza a frequência CAPTCHA
Embora você sempre possa resolver CAPTCHAs via API, reduzir a frequência com que eles aparecem economiza tempo e custos.
Patch navegador.webdriver
# Selenium
options.add_argument("--disable-blink-features=AutomationControlled")
options.add_experimental_option("excludeSwitches", ["enable-automation"])
// Puppeteer
await page.evaluateOnNewDocument(() => {
Object.defineProperty(navigator, "webdriver", { get: () => false });
});
Definir tamanho realista da janela
# Selenium
driver.set_window_size(1920, 1080)
// Puppeteer
await page.setViewport({ width: 1920, height: 1080 });
Use plug-ins controle de QAs
# Puppeteer
npm install puppeteer-extra configuração padrão do Puppeteer
const puppeteer = require("puppeteer-extra");
const QaPlugin = require("configuração padrão do Puppeteer");
puppeteer.use(QaPlugin());
# Selenium
pip install undetected-chromedriver
import undetected_chromedriver as uc
driver = uc.Chrome(headless=True)
Solução 3: Manuseio de Cloudflare Turnstile em staging
As páginas de desafio da Cloudflare exigem mais do que um token – você precisa do cookie cookie_qa_validacao:
# CaptchaAI handles full Cloudflare Turnstile em stagings
resp = requests.get("https://ocr.captchaai.com/in.php", params={
"key": API_KEY,
"method": "turnstile_staging",
"pageurl": "https://example.com",
"proxy": "http://user:pass@proxy:port",
"proxytype": "HTTP"
})
task_id = resp.text.split("|")[1]
# Result includes cookie_qa_validacao cookie and user_agent
# Use both to make subsequent requests
Problemas comuns por navegador
| Navegador | Problema | Correção |
|---|---|---|
| Cromo modo headless | sinal de navegador automatizado = true |
Usar sinalizador --disable-blink-features |
| Puppeteer | Plugins de navegador ausentes | Usar configuração padrão do Puppeteer |
| Selênio | Interruptor enable-automation |
excludeSwitches: ["enable-automation"] |
| Dramaturgo | sinal de navegador do WebKit | Use o canal Chromium com patches controle de QAs |
| Todos | Tamanho consistente da janela de visualização | Defina para 1920x1080 ou randomize |
Perguntas frequentes
O modo modo headless é sempre detectado?
Nem sempre. Com a configuração controle de QA adequada, muitos sites não sinalizarão seu navegador headless. Mas sistemas anti-bot sofisticados (Cloudflare, PerimeterX) ainda podem detectar o modo modo headless por meio de sinal de navegador avançada.
Devo usar o modo dirigido?
O modo headed reduz a detecção, mas requer um servidor de exibição (Xvfb no Linux). A abordagem API do CaptchaAI funciona independentemente do modo head/headless, tornando-o a solução mais confiável.
Posso evitar totalmente os CAPTCHAs?
Não é confiável. Mesmo navegadores headless bem configurados eventualmente acionam CAPTCHAs em grande escala. Usar CaptchaAI como uma camada de manipulação de CAPTCHA garante que sua automação continue quando surgirem desafios.
Guias Relacionados
- Manipulação de Selênio CAPTCHA com Python
- Puppeteer CAPTCHA resolvendo com Node.js
- Raspar sem ficar bloqueado