Pular para o conteúdo

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.

Coerência, em desenho: sinais independentes que se confirmam uns aos outros compõem uma única identidade. Os dois pontos desconectados — um valor falsificado sem nada por trás — são a emenda que uma verificação cruzada enxerga.

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ícioPor que ele pega um spoof em JS
Autodenúncia via toStringUm 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 / hasOwnPropertygetOwnPropertyDescriptor expõe propriedades redefinidas, e hasOwnProperty('toString') retorna true numa função adulterada, enquanto uma nativa retorna false.
TypeError com this erradoGetters 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 realmO 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:

CamadaOs indíciosOnde fica a correçãoClearcote
A · driver / bináriovariáveis cdc_ do ChromeDriver, a superfície do protocolo WebDriverControlar via CDP puro, sem o chromedriver✅ um binário Chromium comum — sem artefatos de driver
B · efeitos colaterais do CDPvazamentos de Runtime.enable, init-scripts injetados, execução no main world, viewport padrão de automaçãoA 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 fingerprintcanvas, WebGL, áudio, fontes, navigator, TLS — no frame principal, em iframes e em workersO 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ê):

javascript
await launch({ fingerprint: "u1", fingerprintNoise: false });   // identity on, per-site farbling off

Com 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.