Você saiu do HTTP cru e passou para um navegador de verdade. Fingerprint TLS: genuinamente o do Chrome. IP: residencial. E o site ainda assim sabe. Em 2026, a detecção de navegadores headless avançou muito além de navigator.webdriver — a geração atual de verificações detecta o próprio protocolo de automação, e a maioria dos plugins "stealth" remenda os sinais de ontem enquanto exibe ruidosamente os de hoje.
Este artigo mapeia o que os sites realmente verificam hoje, aproximadamente na ordem em que verificam, e o que de fato ajuda em cada camada. Ele completa a trilogia da detecção com o fingerprinting TLS JA3/JA4 (camada de rede) e a reputação de IP e ASN (camada de endereço) — esta é a camada do navegador.
navigator.webdriver — exigido pela especificação como true sob automação. Configurações stealth de Playwright/Puppeteer o escondem; o --disable-blink-features=AutomationControlled do Chrome lida com isso nativamente. Os sites ainda verificam porque é gratuito e pega bots ingênuos.HeadlessChrome/ no User-Agent. Corrigido pelo novo modo headless (headless=new), que usa o caminho do binário real do Chrome.navigator.plugins, nenhum chrome.runtime, outerWidth 0×0. O modo headless antigo falhava em todos esses; o novo headless passa na maioria.Se um alvo só verifica o Nível 1, o Playwright moderno com headless=new passa direto. Alvos sérios deixaram isso para trás anos atrás.
O Playwright e o Puppeteer controlam o Chrome pelo Chrome DevTools Protocol, e o CDP deixa efeitos colaterais em tempo de execução que o JavaScript da página pode observar:
// The classic CDP leak: serialization callbacks
const err = new Error();
Object.defineProperty(err, "stack", {
get() {
// This getter fires DURING console serialization -
// which only happens when DevTools/CDP is attached
window.__cdp_detected = true;
},
});
console.debug(err);
Variantes disso — efeitos colaterais de getters durante a serialização do console, anomalias de timing em Runtime.evaluate, o comportamento de toString() em funções nativas remendadas — estão em todo pacote comercial anti-bot. O ponto crucial: isto detecta o protocolo, não o modo headless. Um Chrome com cabeçalho (headed), remendado com stealth e de aparência perfeitamente humana ainda falha se for controlado por CDP.
O que ajuda:
Além dos artefatos, os sistemas modernos verificam se a história do seu navegador é internamente consistente:
| Verificação | Sinal de bot |
|---|---|
| Hash de renderização Canvas / WebGL | Renderização por software SwiftShader/llvmpipe = GPU de servidor; ou um hash compartilhado por 10.000 "usuários diferentes" |
| Fontes e codecs | Conjunto de fontes de servidor Linux sob um User-Agent Windows |
| Fuso horário × locale × geo do IP | Intl diz UTC, o IP diz Texas, Accept-Language diz de-DE |
| Métricas de tela | 1920×1080 sem barra de tarefas, devicePixelRatio exatamente 1, janela nunca redimensionada |
| Concorrência de hardware / memória | 96 núcleos reportados a uma página que afirma ser um celular |
| Microssinais comportamentais | Sem entropia de mouse, preenchimentos de formulário instantâneos, rolagens em passos idênticos de 100px |
É aqui que o stealth caseiro morre: cada remendo que você aplica precisa concordar com todos os outros sinais. Um UA Windows falsificado em um contêiner Linux contradiz fontes, strings de GPU e fingerprints TCP simultaneamente. Coerência vence perfeição — um Chrome Linux headed honesto pontua melhor do que um "Windows" mal falsificado.
Nada disso importa se a camada de endereço estiver queimada: um navegador impecável em um ASN de datacenter ainda é "um navegador impecável em um datacenter" — e os limiares de detecção de headless são adaptáveis à reputação do IP. O mesmo navegador recebe mais desafios de JavaScript de um IP sinalizado. Saídas residenciais efetivamente reduzem o escrutínio que a camada do navegador precisa sobreviver:
browser = p.chromium.launch(
headless=False, # headed survives more checks
args=["--disable-blink-features=AutomationControlled"],
proxy={
"server": "us.jibaoproxy.com:913",
"username": "USERNAME", "password": "PASSWORD",
},
)
toString() não remendado é em si um sinal. Menos remendos, coerentes, vencem.IPs residenciais que combinam com a história que seu fingerprint conta — 500MB de tráfego grátis, sem cartão.
Comece o Teste GrátisNovos usuários recebem 500MB ao se cadastrar, mais um bônus na primeira recarga. Oferta por tempo limitado.