Pular para o conteúdo

Configurações recomendadas — o que ativar e o que deixar como está

A maioria dos bloqueios que conseguimos atribuir a uma configuração foi causada por fazer spoofing de mais coisas, e não de menos. Esta página é a versão curta do que medimos: as configurações que valem a pena, as que custam mais do que entregam e o punhado de problemas que nenhuma configuração resolve.

Comece por aqui

Se você não ler mais nada nesta página, esta é a configuração da qual partir. Ela varia os eixos que é seguro variar e deixa a renderização, o TLS e a versão do navegador como estão.

javascript
import { launch } from "clearcote";

const browser = await launch({
  lightStealth: true,        // metadata identity only — rendering, TLS and version stay real
  fingerprint: "account-42", // picks this identity's metadata bundle; keep it stable per identity
  proxy: { server: "http://gateway:8080", username: "u", password: "p" },
  geoip: true,               // timezone + languages + the address WebRTC reports follow the proxy exit
  humanize: true,            // trusted native input; navigator.webdriver stays false
});

Em Python, a interface é a mesma, em snake_case: light_stealth, fingerprint, geoip, humanize. Acrescente eixos de forma deliberada, um de cada vez, e só quando souber dizer o que no host vai corroborá-los. Várias linhas abaixo — os controles específicos do r12, o humanize com movimento gravado, socks5Udp, os switches de cookies de terceiros e de proxy — valem para o build licenciado (Grátis com GitHub ou Pro). O build aberto os ignora: o humanize volta a usar trajetórias geradas, e um proxy SOCKS5 protegido por senha recusa a conexão.

O princípio: um spoof é uma afirmação que o host precisa sustentar

A detecção não é uma busca por valores incomuns. É uma busca por contradições — dois sinais que não podem ser verdadeiros ao mesmo tempo numa mesma máquina. Um valor comum que ninguém falsificou não contradiz nada. Um valor falsificado sem nada por trás é um sinal positivo, e mais forte do que o valor que ele escondia.

Por isso, a pergunta útil antes de ativar qualquer opção não é “esse valor é plausível?”, mas “o que nesta máquina pode ser consultado para corroborá-lo, e a resposta vai bater?” As dimensões da tela são conferidas com a superfície de renderização. Uma string de GPU é conferida com os pixels que a GPU produz. Um sistema operacional declarado é conferido com as fontes que a plataforma resolve. Se o host não consegue sustentar a afirmação, o valor honesto é o mais seguro. Veja Como a detecção funciona para entender o mecanismo.

Faça isto

ConfiguraçãoPor quê
lightStealth: trueAplica um conjunto coerente, derivado da seed, apenas dos eixos de metadados — hardwareConcurrency, deviceMemory, colorDepth, devicePixelRatio, maxTouchPoints — por meio de switches nativos de valor único. A saída de canvas, WebGL e áudio, o TLS e a versão real do navegador ficam como estão. A seed só escolhe qual pacote, dentro de um conjunto pequeno, cada identidade recebe, e não há ruído de renderização, então contas na mesma máquina compartilham o mesmo hash de canvas. Numa tela com escala ou incomum, confira na auditoria se o pixel ratio que o pacote escolhe combina com a sua tela.
Uma seed de fingerprint estável por identidadeMesma seed ⇒ mesma identidade. Reutilize-a durante toda a vida da conta. Trocar a seed a cada requisição faz uma única conta logada chegar de uma máquina nova toda vez, o que é um sinal muito mais gritante do que qualquer um dos valores trocados. Para várias contas numa mesma máquina que não podem compartilhar um canvas, use a persona com seed (tire o lightStealth) para que cada conta tenha o próprio ruído de renderização.
geoip: true em todo launchFuso horário, idiomas e o endereço que o WebRTC informa acompanham o IP de saída — com ou sem proxy (ou defina timezone e acceptLanguage você mesmo). Sem nenhum dos dois, o SDK assume Nova York e en-US. Uma saída residencial nos EUA informando Europe/Amsterdam é detectada com uma verificação de uma linha, e é uma incoerência fácil de cometer sem querer. Se a região não puder ser resolvida, o launch para com GeoipError em vez de iniciar com o relógio desta máquina — corrija o proxy ou aumente CLEARCOTE_GEOIP_TIMEOUT_SECONDS.
humanize: trueO input é gerado como eventos nativos confiáveis, em trajetórias de cursor com formato humano (movimento humano gravado para cliques por coordenada no Pro; trajetórias geradas nos demais casos). Não coloque o seu próprio easing por etapa por cima — defina waypoints e deixe o humanize interpolar; um easing feito à mão produz estatísticas de movimento que o input padrão nunca produz.
widevine: true com a marca ChromeA persona padrão se apresenta como Google Chrome, que responde à consulta de DRM do Widevine. Sem o CDM, a consulta é recusada, e qualquer página consegue ver isso. Veja Widevine & DRM.
allowThirdPartyCookies: true se um login ou challenge incorporado quebrarA base sem serviços do Google bloqueia cookies de terceiros, que o Chrome padrão permite. Frames incorporados de login, pagamento e challenge que dependem deles passam a falhar de um jeito que num navegador normal não aconteceria (build licenciado, 152 r22+).
Um contexto persistente por identidadeCookies, armazenamento dos sites e cache fazem parte da identidade. Uma máquina que nunca viu o site antes, em toda visita, é um padrão por si só.
Headful com Xvfb em contêineresO Chrome headed evita por completo os indícios do modo headless. A imagem oficial já roda assim por padrão.
Rode no sistema operacional que você pretende declararAs palavras-chave de fontes de sistema do CSS2 são respondidas pela plataforma que está por baixo do navegador, e não por algo que a página ou o user agent controlem, então elas sobrevivem a uma troca de user agent. Onde isso não for possível, mantenha intacto o pacote de fontes do Linux — veja abaixo.
tlsProfile mantido em match-personaO ClientHello acompanha a versão do Chrome que a persona declara, então a camada de rede e o UA concordam. O padrão já está correto; o motivo para saber que a opção existe é evitar fixá-la em algo que não bata com a versão da marca que você declara.

Evite isto

Cada item aqui é algo que medimos dando errado, e não uma precaução genérica.

EviteO que dá errado
Falsificar screen / avail* num host cuja tela não correspondeUm tamanho de tela falso que não pode ser conciliado com a janela real e com a superfície de renderização é um gatilho de bloqueio confiável nos sistemas antibot mais rigorosos. É exatamente por isso que as dimensões da tela não fazem parte do lightStealth e são opt-in. Se você for defini-las, defina o conjunto coerente inteiro — screenWidth, screenHeight, availWidth, availHeight — e deixe um espaço plausível para a barra de tarefas em vez de fazer avail igual a screen. Em headless, o SDK já escolhe uma tela plausível para você.
Declarar uma GPU num host que renderiza por softwareNum contêiner, ou numa VM de nuvem que rasteriza via WARP, SwiftShader ou llvmpipe, uma persona que declara uma GPU de desktop está descrevendo um silício que não consegue produzir os pixels que a página pode ler de volta. A partir do build licenciado 150 r12 (o build aberto ignora isso), gpuStringSpoof: false informa o vendor e o renderer WebGL reais do host e deixa todo o resto como está — muitas vezes, a melhor troca nesse hardware. Atenção à ressalva: o WebGPU continua seguindo o disableGpuFingerprint, que é mais amplo, então, só com o switch específico, navigator.gpu continua descrevendo a persona enquanto o WebGL informa o dispositivo real.
Recorrer a disableGpuFingerprint ou fingerprintNoise: false para mudar uma única coisaOs dois são pacotes. disableGpuFingerprint altera as strings e a tabela de parâmetros e o farble do readPixels e a supressão de campos da persona; fingerprintNoise: false desliga o ruído do canvas 2D e o do WebGL de uma vez. Desde o build licenciado 150 r12 existem os controles específicos: gpuStringSpoof: false só para as strings e canvasNoise: false só para o canvas 2D. Os dois controles específicos têm um custo que vale conhecer: gpuStringSpoof: false altera as strings do WebGL, mas não o navigator.gpu, então WebGL e WebGPU acabam nomeando vendors diferentes na mesma página — pontua bem, mas pega mal para quem lê os valores. E canvasNoise: false junto com uma seed remove por completo o canvas por conta. Prefira o disableGpuFingerprint, mais amplo, que altera WebGL e WebGPU juntos.
Trocar de identidade no meio da sessãoMudar a seed, a saída do proxy ou o fuso horário com a sessão em andamento contradiz a sessão que veio antes. Troque entre identidades, nunca dentro de uma.
Uma persona Windows no Linux sem o pacote de fontesA versão para Linux traz clones com métricas compatíveis (Segoe UI→Selawik, Arial→Arimo, Times New Roman→Tinos, …) e o SDK os conecta via FONTCONFIG_FILE no launch. Remova esses clones, ou gere uma imagem personalizada que descarte <binDir>/fonts/, e todas as famílias do Windows que a persona declara colapsam numa única fonte padrão. Isso é visível sem nenhum dado de referência: duas fontes que o Windows distribui como distintas medem exatamente igual.
Empilhar um plugin de stealth em JS por cimaOs controles do Clearcote são compilados no motor. Acrescentar um shim em nível de script por cima deles reintroduz justamente a camada que se entrega sozinha e que a abordagem no motor existe para eliminar — um getter sobrescrito vira string com o próprio código-fonte, e basta um toString() para lê-lo.
Uma persona mobile num motor desktop, sem ressalvasplatform: "android" altera o UA, o touch, o tipo de ponteiro, a tela e a viewport, mas os pixels continuam vindo da GPU de desktop (sob um nome de GPU mobile) e a geometria fina da página continua sendo de desktop. É uma persona de melhor esforço; trate a superfície de renderização como a parte que você ainda precisa resolver.

Proxies

O proxy costuma pesar mais no resultado do que qualquer flag do navegador, e é o item que mais vezes fica no padrão.

  • Saídas sticky. Um IP de saída por identidade, mantido durante a sessão. Uma sessão cujo IP muda no meio do fluxo se contradiz, por melhor que seja o fingerprint.
  • Alinhe a geografia com a persona e deixe que o geoip: true derive o fuso horário e os idiomas em vez de defini-los à mão.
  • Proxies com credenciais ficam a cargo do motor. As senhas de proxy HTTP(S) são respondidas pelo próprio navegador (build licenciado 151 r19+, SDKs de Python & Node), então o cache das páginas continua ativo e as requisições não ficam marcadas pela interceptação. SOCKS5 com senha funciona diretamente no build licenciado — passe o usuário e a senha como campos separados. transparentProxy: true (152 r22+) esconde o proxy dos cabeçalhos das requisições e do timing das conexões.
  • Entenda o trade-off do WebRTC. O Chromium nunca envia mídia por um proxy HTTP ou SOCKS, então o tráfego entre peers sairia pela sua conexão real, onde um relay consegue ler o seu endereço verdadeiro. Por isso, o SDK bloqueia o UDP do WebRTC que passaria por fora do proxy. No build aberto, geoip / webrtcIp suspende esse bloqueio; o build licenciado o mantém. Combine-o com geoip: true (ou webrtcIp) para que a página continue vendo os candidatos que um Chrome de verdade produz, informando o endereço do proxy; sem isso, o WebRTC não coleta nada, o que parece bloqueio. Para conexões entre peers que funcionem através de um proxy SOCKS5, defina socks5Udp: true (build licenciado; o seu provedor precisa permitir relay de UDP), ou use um túnel completo (WireGuard/OpenVPN) sem proxy no navegador e passe a sua própria --webrtc-ip-handling-policy em args. Fora isso, mantenha a política de bloqueio padrão.

O que nenhuma configuração resolve

Algumas das superfícies mais lidas são definidas pela máquina que você aluga, e não pelo navegador que roda nela.

SuperfícieO que o host define
RenderizaçãoUm host sem GPU rasteriza por software. Todo produto desta categoria fica reduzido a duas saídas: declarar um hardware que não consegue renderizar ou admitir o rasterizador por software. Se os pixels renderizados importam para o seu alvo, a solução é um host com GPU — ou o canvas bridge, que encaminha o trabalho para um.
FontesUma lista de fontes é limitada pelo que o host consegue de fato desenhar — a partir do build licenciado 150 r12, a lista canônica é derivada de três mil máquinas reais e ainda é cruzada com o host, então uma página nunca fica sabendo de uma fonte que não pode ser renderizada. No Linux, o SDK usa o pacote de fontes que vem com o navegador e ignora as fontes instaladas no host, então instalar pacotes na sua imagem não muda o que as páginas veem. O pacote do build aberto não tem fontes CJK, então texto em chinês, japonês e coreano aparece ali com glifos faltando; o pacote do build licenciado as inclui. No Windows, são usadas as fontes do próprio host. As imitações das fontes do Windows que vêm no pacote deixam as larguras plausíveis, mas uma página também pode carregar uma fonte pelo nome com local(), e uma imitação não carrega o nome real: numa medição com uma persona Windows no Linux, Segoe UI e Georgia apareceram como instaladas pelas medidas, mas não puderam ser carregadas.
Escalonador de textoCada glifo é dimensionado pelo escalonador de fontes do sistema operacional: DirectWrite no Windows, FreeType no Linux. Nenhuma configuração chega até ele. Variar o tamanho de uma fonte em passos de 0,01 px muda a largura do texto em 99% dos passos no Windows e em 66% no Linux, e um host Linux que se apresenta como Windows continua dando 66%. Se uma página lê o seu texto de perto, rode no sistema operacional que você declara. Veja a pilha de fontes por baixo do user agent.

Confira em vez de supor

Toda afirmação desta página pode ser medida de dentro do navegador. Aponte a sua sessão já configurada para a auditoria e leia as linhas das quais ela discorda — é a mesma ferramenta que usamos para encontrar os problemas descritos acima, e ela vai dizer quais destas recomendações a sua configuração está quebrando no momento.