Um navegador stealth para Playwright e Puppeteer
O Clearcote é Chromium, então a automação que você já tem continua funcionando. Troque a chamada de launch pelo launch() do SDK e você recebe um handle do Playwright que se comporta como um Browser (sobre um perfil descartável, então newContext() retorna esse mesmo contexto), rodando um build cujos controles de identidade são compilados no motor em vez de injetados como JavaScript.
O build aberto não exige conta. O build mais recente é grátis com GitHub para um navegador por vez.
Troque a linha do launch e mantenha todo o resto
# pip install clearcote
from clearcote import launch
browser = launch(fingerprint="account-42", light_stealth=True)
page = browser.new_page()
page.goto("https://example.com")
browser.close()Destaques
Uma migração de uma linha
O launch() devolve um handle do Playwright sobre um perfil descartável, então seletores e page objects continuam como estão; o newContext() dele retorna esse mesmo contexto, então passe ephemeralProfile: false onde precisar de contextos isolados. O Puppeteer se conecta ao endpoint CDP do serve() com puppeteer.connect.
Um binário verificado, baixado para você
No primeiro uso, o SDK baixa o build correspondente e confere o SHA-256 dele: o build aberto contra hashes embutidos no SDK, o build licenciado contra o hash que o próprio download retorna. A atualização automática opcional (só no build aberto) confere a versão mais nova contra os checksums publicados e, quando o gpg está instalado, contra a assinatura GPG deles.
Identidade como opções nomeadas
fingerprint, platform, brand, timezone, acceptLanguage, proxy e geoip são argumentos, não switches para decorar. Um seed mantém a identidade estável entre execuções.
Padrões coerentes
Launches em headed dispensam o viewport emulado, para que o tamanho da página bata com a janela real; o WebRTC mantém o endereço da sua máquina privado; e o QUIC fica desligado atrás de um proxy, para que nenhum UDP passe por fora dele.
Input humanizado com uma flag
humanize: true envia cliques, digitação, arrastes e rolagens como input nativo trusted em trajetos curvos, com o navigator.webdriver mantido em false.
Três linguagens
Python (síncrono e assíncrono), Node e .NET, no PyPI, npm e NuGet. O .NET também tem geoip, e input humanizado como chamadas explícitas no estilo HumanClickAsync; perfis salvos, verificações de coerência de renderização, Widevine e os helpers de agente são de Python e Node, por enquanto.
O que o SDK faz por você
O pacote encapsula o binário do Clearcote para que as opções de identidade virem argumentos nomeados. Ele resolve o navegador numa ordem fixa (um caminho explícito, a variável de ambiente CLEARCOTE_BINARY, uma version que você pediu, o build licenciado mais recente quando encontra uma chave de licença e, por fim, o build aberto fixado no SDK), verifica e guarda em cache, inicia pelo Playwright e devolve os objetos que o seu código já usa.
Como os controles ficam no motor C++, não há plugin stealth para carregar nem nada injetado na página. Um plugin altera propriedades via JavaScript, e dá para distinguir um getter alterado de um nativo. Aqui, o getter é o nativo, no frame principal, nos iframes e nos workers. Como a detecção funciona explica por que isso importa.
Duas coisas se comportam de forma diferente do Chromium de fábrica, ambas de propósito. Eventos de console e de erro de página não são repassados ao cliente de automação, porque esse repasse é justamente o que um probe de automação mede; colete-os na página e leia de volta com page.evaluate(). E no build licenciado (grátis com GitHub), um proxy SOCKS5 com usuário e senha funciona direto, com as credenciais passadas nos campos separados username e password, porque o motor implementa a autenticação que falta no Chromium de fábrica. O build aberto não consegue se autenticar num proxy SOCKS5.
Um plugin stealth lado a lado com um navegador que atua no nível do motor
Plugins stealth open source são um primeiro passo razoável, e muitos projetos começam por aí. Veja a comparação com o puppeteer-extra-plugin-stealth para ter um panorama mais completo.
Para que as pessoas usam
Scraping e coleta de dados
Mantenha o seu crawler atual de Playwright ou Puppeteer e troque o que está por baixo dele.
Testes end-to-end em páginas reais
Teste fluxos em sites que tratam um Chromium automatizado de fábrica de forma diferente de um navegador normal.
Migrar uma suíte existente
Seletores e page objects ficam onde estão e só a chamada de launch muda. Fixtures que abrem um contexto novo por teste precisam de ephemeralProfile: false, porque o newContext() do launch() retorna o único contexto de perfil dele.
Pesquisa sobre fingerprinting
Rode os mesmos scripts com e sem persona e compare o que a página mede.
O Clearcote foi feito para privacidade, testes, pesquisa e automação lícita. Você é responsável pela forma como o usa e por seguir os termos dos sites que visita.
Qual plano inclui
O SDK está nos três planos, assim como quase todas as opções de identidade (as poucas que exigem o build licenciado estão marcadas na lista de flags de fingerprint). Sem chave, ele roda o build aberto. Com uma chave de licença (grátis com uma conta do GitHub), roda o build mais recente, com os extras exclusivos do build licenciado listados na página de preços.
Comparar planosPerguntas frequentes
É mesmo um substituto drop-in?
Praticamente. O launch() síncrono de Python e de Node devolve um handle que se comporta como um browser, sobre um perfil descartável: newPage() e tudo o que vem depois funcionam como antes, mas newContext() retorna esse mesmo contexto, então código que precisa de contextos isolados deve passar ephemeralProfile: false ou abrir um navegador por contexto. O launchPersistentContext() retorna um BrowserContext padrão. O Puppeteer se conecta ao endpoint CDP do serve() com puppeteer.connect, e o SDK .NET retorna objetos Microsoft.Playwright padrão (IBrowserContext do LaunchEphemeralProfileAsync, IBrowser do LaunchAsync).
Ainda preciso do puppeteer-extra-plugin-stealth ou do playwright-stealth?
Não, e é melhor não adicionar. Esses plugins alteram os valores via JavaScript injetado, e a própria alteração pode ser percebida. O Clearcote define os valores no motor, então não sobra nada para um plugin alterar.
Funciona em headless?
Sim. O modo headed continua sendo o padrão mais seguro onde você puder rodá-lo, porque o modo headless tem os seus próprios indícios. Em containers, a imagem Docker oficial roda em headed sob um display virtual por padrão.
Quais linguagens são suportadas?
Python (APIs síncrona e assíncrona), Node.js e .NET. Os três têm correspondência por geoip e input humanizado (uma flag de launch em Python e Node, chamadas explícitas no estilo HumanClickAsync no .NET). Perfis salvos, verificações de coerência de renderização, Widevine e o agente embutido no navegador são só de Python e Node, por enquanto.
Como mantenho a mesma identidade entre execuções?
Reutilize o mesmo seed de fingerprint e use launchPersistentContext com um diretório de dados do usuário para que cookies e armazenamento persistam. Derivar o seed do id da sua própria conta ou do tenant o mantém reproduzível. Veja identidades persistentes.
Vá mais fundo na documentação
Recursos relacionados
Uma única opção dá aos cliques, à digitação, aos arrastes e às rolagens do Playwright trajetos curvos e timing humano, ainda como input nativo trusted.
Canvas, WebGL, WebGPU, áudio, fontes, tela e hardware derivados no motor C++ a partir de um único seed, com locale e fuso horário ajustados para combinar, para que todas as superfícies concordem entre si.
Defina um proxy com geoip ligado e o fuso horário, os idiomas e o WebRTC seguem o IP de saída. SOCKS5 com usuário e senha funciona direto no build licenciado.
Rode o Clearcote como endpoint CDP permanente pela imagem Docker oficial, pelo serve() ou por uma CLI, e conecte qualquer framework sem mudar o código.
Leituras relacionadas
Experimente o Clearcote
Plug-and-play no Playwright e no Puppeteer, coerente até o handshake TLS, com um build de código aberto para começar.
Grátis para um navegador com GitHub. Sem cartão.