Como funciona a detecção de bots — e por que o Clearcote aplica patches no motor
A abordagem de sempre aplica patch em navigator.webdriver, falsifica o fabricante do WebGL e sobrescreve navigator.plugins via script. Mesmo assim, os detectores acusam — e o motivo é estrutural, e não uma propriedade a mais que ficou sem cobertura.
Um spoof em JavaScript se denuncia sozinho
Um spoof em JS é uma função ocupando o lugar de uma nativa. O detector deixa de lado o valor retornado e investiga se aquilo que o retorna é nativo:
| O indício | Por que ele pega um spoof em JS |
|---|---|
Autodenúncia via toString | Um método nativo vira a string function get vendor() { [native code] }; um override vira o próprio código-fonte — um único .toString() já pega. |
Descritor / hasOwnProperty | getOwnPropertyDescriptor expõe propriedades redefinidas, e hasOwnProperty('toString') retorna true numa função adulterada, enquanto uma nativa retorna false. |
TypeError com this errado | Getters nativos lançam um TypeError específico quando recebem o receptor errado; um shim ingênuo fica quieto, e o silêncio é o sinal. |
| Reaquisição de realm | O detector pega um Function.prototype.toString intacto de um iframe ou Web Worker novo e o aplica ao seu getter — um realm diferente daquele do seu patch no main world. Ele retorna o seu código-fonte. Pego. |
O Clearcote não tem essa camada. O getter de navigator.userAgent é o getter em C++: ele reporta [native code] porque é código nativo, idêntico em todos os realms — frame principal, iframe e worker. Não há sequestro via JavaScript para detectar.
As três camadas da detecção de bots
Os sistemas antibot modernos leem três superfícies estruturalmente diferentes, em três lugares separados. Raramente uma única ferramenta resolve as três:
| Camada | Os indícios | Onde fica a correção | Clearcote |
|---|---|---|---|
| A · driver / binário | variáveis cdc_ do ChromeDriver, a superfície do protocolo WebDriver | Controlar via CDP puro, sem o chromedriver | ✅ um binário Chromium comum — sem artefatos de driver |
| B · efeitos colaterais do CDP | vazamentos de Runtime.enable, init-scripts injetados, execução no main world, viewport padrão de automação | A camada de controle / do cliente CDP | ✅ o motor neutraliza o vazamento de Runtime.enable, o SDK não injeta scripts por padrão, e os padrões de inicialização evitam o viewport padrão de automação (onde o seu cliente roda os próprios scripts fica a critério dele) |
| C · superfície de fingerprint | canvas, WebGL, áudio, fontes, navigator, TLS — no frame principal, em iframes e em workers | O motor (C++), porque overrides em JS se denunciam | ✅ isto é o Clearcote |
O que mais importa: nenhuma emenda entre o falso e o real
Como os controles ficam no motor, o JavaScript que a página vê e o handshake de rede por baixo dele vêm de um único Chromium real. Não existe emenda entre JS falsificado e TLS real para uma verificação cruzada pegar — justamente a falha que entrega as ferramentas baseadas em injeção. Uma seed de --fingerprint produz uma única máquina, internamente consistente, em canvas, WebGL, áudio, fontes e hardware. O handshake de TLS e HTTP/2 por baixo é o do próprio motor, e ele concorda porque a persona reporta a versão que o motor de fato é — deixe brandVersion sem definir para que continue assim.
E quando o próprio ruído é o indício, desligue-o — canvas e WebGL retornam seus valores naturais enquanto o spoof de identidade continua ativo (áudio renderizado e client rects nunca são perturbados, em nenhum dos casos, e os escalares de taxa/latência do AudioContext continuam seguindo a persona; veja por quê):
await launch({ fingerprint: "u1", fingerprintNoise: false }); // identity on, per-site farbling offCom o ruído desligado, as identidades na mesma máquina compartilham um único hash de canvas. canvasNoise: false desliga só o canvas 2D e mantém o ruído de WebGL (build licenciado, 150 r12+).
Coerência de rede e de locale
A persona é só metade da história: o fuso horário, o idioma e o endereço WebRTC também precisam concordar com a origem do tráfego. Atrás de um proxy, inicie com geoip — o SDK consulta o IP de saída do proxy, define o fuso horário, a lista de idiomas, a geolocalização e o endereço WebRTC dessa região, e interrompe a inicialização se não conseguir determinar uma. Sem ele, o fuso horário segue o idioma (en-US significa Nova York), qualquer que seja o país do proxy. Veja Playwright & Puppeteer para as opções.
É por isso que o Clearcote aplica patches no motor em C++ em vez de injetar JavaScript. Veja Flags de fingerprint para saber o que você controla, e Arquitetura para entender como o motor mantém todos os sinais coerentes entre si.
Leituras relacionadas