Detectando navegadores headless: Playwright, Puppeteer e além
Nosso motor de Bot Detection identifica mais de 15 frameworks de automação por meio de inconsistências de sinal, APIs ausentes e padrões comportamentais que os bots não conseguem falsificar.
Navegadores headless são a arma preferida para web scraping sofisticado, credential stuffing e operações de fraude. Ao contrário de clientes HTTP simples, navegadores headless executam JavaScript, renderizam páginas e suportam APIs web modernas — o que os torna muito mais difíceis de detectar. Nosso motor de Bot Detection usa múltiplos métodos de detecção independentes para identificar mais de 15 frameworks de automação com falsos positivos próximos de zero.
A evolução da automação de navegadores
A automação de navegadores percorreu um longo caminho desde os simples scripts em curl. Ferramentas modernas como Playwright, Puppeteer e Selenium WebDriver controlam motores de navegador reais — Chromium, Firefox ou WebKit — em modo headless. Elas executam JavaScript, processam CSS, renderizam elementos de canvas e lidam com consultas WebGL como navegadores com interface. Isso as torna invisíveis para métodos de detecção que simplesmente verificam a capacidade de executar JavaScript.
A geração mais recente de ferramentas foi além. O modo stealth do Playwright corrige muitos dos sinais em que a detecção de bots tradicional se apoia. O puppeteer-extra-plugin-stealth modifica propriedades do navigator, sobrescreve strings de vendor do WebGL e falsifica eventos de interação do usuário. Essas medidas anti-detecção criaram uma corrida armamentista entre operadores de bots e sistemas de detecção.
Método de detecção 1: análise da flag WebDriver
A propriedade navigator.webdriver é definida como true quando um navegador é controlado por automação. A detecção inicial era tão simples quanto verificar essa propriedade. Mas ferramentas modernas de stealth a apagam ou sobrescrevem. Nossa detecção vai mais fundo — verificamos não só o valor da propriedade, mas seu descritor de propriedade, sua presença na cadeia de protótipos e se houve tentativas de redefini-la. Também verificamos propriedades relacionadas, como anomalias no comprimento de navigator.plugins que acompanham as sobrescritas de WebDriver.
Método de detecção 2: artefatos do Chrome DevTools Protocol
O Playwright e o Puppeteer controlam navegadores por meio do Chrome DevTools Protocol (CDP). Mesmo quando o modo stealth está ativo, o CDP deixa artefatos no runtime: variáveis globais específicas, funções getter modificadas e descritores de propriedade alterados nos objetos Window e Navigator. Sondamos esses artefatos usando técnicas resilientes a sobrescritas simples.
Método de detecção 3: fingerprinting de navegador headless
O Chrome headless tem um conjunto de capacidades diferente do Chrome com interface. Ele carece de certos plugins de navegador, tem características de renderização diferentes para algumas propriedades CSS e reporta valores diferentes para alguns resultados de MediaQuery. Mantemos um banco de dados de características conhecidas de navegadores headless e comparamos as impressões digitais recebidas com ele.
Indicadores-chave de headless incluem: chrome.runtime ausente (presente no Chrome com interface, mas ausente no headless), array navigator.plugins de comprimento zero, padrões específicos de user agent que foram associados ao modo headless em versões anteriores e diferenças na forma como o Chrome headless lida com os contextos de segurança de iframe.
Método de detecção 4: análise de comprimento de eval
Diferentes motores JavaScript têm implementações diferentes das funções embutidas, e essas implementações têm representações de string diferentes. Ao verificar o comprimento de Function.prototype.toString.call(eval) e compará-lo com valores conhecidos para cada motor de navegador, conseguimos detectar spoofing de ambiente — por exemplo, uma instância de Chrome headless que finge ser Firefox.
Método de detecção 5: cross-validação de TLS
Como discutido em nosso artigo sobre fingerprinting de TLS, a mensagem TLS Client Hello revela o navegador ou biblioteca HTTP real que faz a conexão. Quando um script do Playwright controla o Chrome, a impressão digital de TLS corresponde ao Chrome — isso é esperado. Mas quando um bot personalizado usa uma biblioteca requests do Python ou o net/http do Go, a impressão digital de TLS revela o engodo independentemente de qual string de user agent seja enviada.
Método de detecção 6: análise de temporização e comportamento
Usuários reais exibem variação natural na temporização de sua interação. Eles movem o mouse em curvas, não em linhas retas. Fazem uma pausa antes de clicar. Rolam a página em velocidades variáveis. Ferramentas automatizadas, mesmo as que simulam comportamento humano, produzem padrões estatisticamente distinguíveis — temporização consistente demais, trajetórias de mouse perfeitamente lineares e velocidades de rolagem não naturais.
Coletamos sinais comportamentais mínimos durante o próprio processo de fingerprinting — a temporização das chamadas de API, a ordem de coleta dos sinais e a responsividade de certas APIs do navegador. Esses sinais microcomportamentais são difíceis de as ferramentas de automação falsificarem porque dependem do ambiente de execução real, não de propriedades sobrescrevíveis.
Método de detecção 7: inconsistência de permissões e APIs
Navegadores reais têm estados de permissão e disponibilidade de APIs consistentes. Um navegador que alega suportar notificações mas não tem o construtor Notification, ou que reporta uma resolução de tela específica mas retorna valores diferentes de window.screen e das media queries CSS, está exibindo inconsistências que indicam adulteração ou emulação.
Verificamos dezenas desses pontos de cross-validação, procurando contradições que surgem quando ferramentas de automação sobrescrevem seletivamente alguns sinais sem manter a consistência entre todas as APIs relacionadas.
Método de detecção 8: detecção de VM e emulação
Muitas operações de bots rodam dentro de máquinas virtuais ou instâncias de nuvem. Embora isso por si só não seja prova de automação, é um sinal forte quando combinado com outros indicadores. Detectamos VMs por meio de strings de renderer do WebGL que contêm palavras-chave associadas a VMs (como "llvmpipe" ou "SwiftShader"), características de hardware inconsistentes com dispositivos de consumidor (exatamente 2 núcleos de CPU e 2GB de memória — padrões comuns de VMs) e faixas de IP conhecidas de provedores de nuvem.
A vantagem multimétodo
Cada método de detecção tem limitações individualmente — um operador de bots sofisticado poderia evadir qualquer método isolado. Mas evadir todos os métodos simultaneamente, mantendo a consistência de cross-validação entre todos eles, é proibitivamente caro. O custo de desenvolver e manter um bot que passe por todas as verificações excede o valor econômico da maioria das operações de bots.
Falsos positivos próximos de zero
Nossa detecção opera com um modelo de whitelist para bots de motores de busca (Googlebot, Bingbot etc.) verificados por reverse DNS, e um modelo multissinal para o restante do tráfego. Exigimos múltiplos sinais corroborantes antes de classificar o tráfego como automatizado. Essa abordagem conservadora garante uma taxa de falso positivo abaixo de 0,1% — verificada em bilhões de eventos de produção.