Pular para o conteúdo
SDK · Python · Node · .NET

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

Plugin stealth em JavaScript
Clearcote
Onde a mudança fica
Script injetado em cada página e frame
Compilada no motor do Chromium
Verificações de função nativa
Um getter com patch, convertido em string, mostra o próprio código-fonte
O getter é código nativo, então reporta [native code]
Workers e iframes
Cada realm precisa de um novo patch, e as falhas aparecem
Os mesmos valores em todo lugar, vindos de um único motor
TLS e HTTP/2
O que quer que o navegador por baixo envie
O handshake de Chrome do próprio motor, compatível com a versão que a persona reporta
Configuração
Um plugin, as evasões dele e as opções de cada uma
Uma chamada a launch()

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 planos

Perguntas 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

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.