Análise Profunda do Patchright: Fechando Vazamentos de Detecção que o Playwright Deixa Abertos
O Patchright é um fork do Playwright que fecha os vazamentos mais comuns de detecção de automação que o Playwright original deixa expostos. Se você já tentou usar Playwright contra uma página protegida por Cloudflare Turnstile ou DataDome, sabe que o navegador é detectado em segundos — mesmo antes de qualquer JavaScript de desafio ser executado. Esta análise profunda do Patchright explica exatamente quais sinais são fechados, quais permanecem abertos, e por que proxies residenciais ainda são obrigatórios para passar limpo por sistemas anti-bot modernos.
O problema central é que o Playwright controla o Chrome através do Chrome DevTools Protocol (CDP), e esse canal de controle deixa vestígios detectáveis no próprio processo do navegador. O Patchright patches esses vestígios no nível do binário e do runtime, mas não resolve o problema de reputação de IP — que é onde proxies residenciais entram.
Como a Detecção Funciona: Os Sinais que o Patchright Fecha
navigator.webdriver
O sinal mais conhecido é navigator.webdriver, que retorna true quando o Chrome é lançado com a flag --enable-automation. O W3C WebDriver specification define essa propriedade, e navegadores automatizados a expõem por padrão. O Patchright remove essa flag e sobrescreve a propriedade no nível do V8, não apenas via Object.defineProperty no JavaScript — que é trivialmente detectável verificando o descriptor da propriedade.
Scripts anti-bot verificam não apenas o valor, mas se a propriedade é configurable: false e writable: true com o descriptor nativo correto. O Patchright garante que o descriptor corresponda exatamente ao de um Chrome real, onde navigator.webdriver é false por padrão e não pode ser diferenciado de um navegador manual.
Vazamentos do Chrome DevTools Protocol (CDP)
O sinal mais técnico e menos compreendido é o vazamento do Runtime.enable. Quando o Playwright se conecta ao Chrome via CDP, ele envia comandos como Runtime.enable, Page.enable e Network.enable. Esses comandos alteram o estado interno do Chrome de formas detectáveis:
- Runtime.enable ativa o console API, o que muda o comportamento de
console.loge pode ser detectado via timing differences noPerformance API. - Page.enable expõe eventos de frame que podem ser correlacionados com a ausência de eventos esperados em navegação manual.
- Network.enable ativa interceptação de rede, que muda a ordem e o timing de eventos
PerformanceObserver.
O Patchright evita enviar Runtime.enable desnecessariamente e patches o comportamento do Chrome para que os efeitos colaterais não sejam observáveis. Isso é significativamente mais profundo do que playwright-stealth, que apenas injeta scripts addInitScript para sobrescrever propriedades JavaScript — uma abordagem que falha contra qualquer detector que verifique o estado interno do runtime.
Para mais detalhes sobre o CDP, consulte a documentação oficial do Chrome DevTools Protocol, que descreve cada domínio e seus efeitos colaterais.
Flags de Comando e --disable-blink-features=AutomationControlled
O Chrome, quando lançado com automação, usa flags como --enable-automation, --disable-extensions e --password-store=basic. Cada uma dessas flags é detectável via /proc/self/cmdline em Linux (através de um exploit de leitura de arquivo) ou, mais relevantemente, via comportamento observável. A flag --enable-automation, por exemplo, faz o Chrome exibir uma barra de notificação "Chrome is being controlled by automated test software".
O Patchright injeta --disable-blink-features=AutomationControlled, que desativa o Blink feature que define navigator.webdriver = true e remove a barra de notificação. Mais importante, o Patchright não envia flags como --enable-automation em primeiro lugar, ao contrário do Playwright padrão.
channel='chrome' e o Stack TLS/JA3 Real
Um dos patches mais importantes do Patchright é o uso de channel='chrome' por padrão, que faz o Playwright usar a instalação real do Google Chrome em vez do Chromium bundled. Isso é crítico porque:
- O Chromium bundled tem um ClientHello TLS diferente do Chrome real — a ordem das cipher suites, as extensões TLS e os ALPN differem.
- O JA3 fingerprint do Chromium bundled não corresponde a nenhum navegador real, tornando-o imediatamente identificável por qualquer WAF que verifique TLS fingerprints.
- O Chrome real usa BoringSSL com configurações específicas de cipher ordering que o Chromium open-source pode não replicar exatamente.
Com channel='chrome', o Patchright herda o ClientHello TLS exato do Chrome estável, produzindo um JA3/JA4 fingerprint que corresponde a milhões de sessões Chrome reais. Isso fecha uma classe inteira de detecção que playwright-stealth não consegue resolver, porque o fingerprint TLS é determinado no nível do socket, antes de qualquer JavaScript rodar.
O Que o Patchright Fecha vs. O Que Permanece Aberto
O que o Patchright patches com sucesso
| Sinal de Detecção | Patchright | playwright-stealth | Camoufox |
|---|---|---|---|
| navigator.webdriver | Fechado no nível V8 | Sobrescrito via JS (detectável) | Fechado no nível Gecko |
| Runtime.enable CDP leak | Fechado | Não endereçado | N/A (usa Firefox/Gecko) |
| Flags de comando (--enable-automation) | Não enviadas | Não endereçado | N/A |
| TLS/JA3 fingerprint | Chrome real via channel='chrome' | Não endereçado | Firefox real (diferente de Chrome) |
| HTTP/2 SETTINGS frame | Chrome real | Não endereçado | Firefox real |
O que o Patchright NÃO patches
Aqui está onde a análise profunda do Patchright fica interessante. Existem categorias inteiras de fingerprinting que o Patchright não toca:
Canvas Fingerprinting
O Patchright não modifica o rendering do canvas. O canvas fingerprint é determinado pela GPU, driver gráfico, e implementação de rendering do Blink — que são específicos da máquina. Se você está rodando em um VPS sem GPU dedicada, o canvas fingerprint pode ser inconsistente com o que um Chrome real naquele sistema operacional produziria.
Detetores avançados verificam não apenas o hash do canvas, mas também:
- Valores individuais de pixel em posições específicas (para detectar noise injection).
- Consistência entre canvas 2D e WebGL rendering.
- Comportamento de
toDataURL()vsgetImageData()sob diferentes condições.
WebGL Fingerprinting
O WebGL expõe WEBGL_debug_renderer_info, que revela a GPU exata e o driver. Em um VPS, isso frequentemente mostra "SwiftShader" ou "llvmpipe", que são imediatamente identificáveis como ambientes de software rendering — algo que nenhum usuário real teria. O Patchright não spoofa isso; você precisaria de uma solução como Camoufox (que patches no nível do Gecko) ou ferramentas dedicadas de fingerprint spoofing.
Fonts e Sistema Operacional
A lista de fontes instaladas é um fingerprint poderoso. O Patchright não adiciona nem remove fontes. Se você está rodando em um container Docker baseado em Debian, a lista de fontes será drasticamente diferente de um Windows 11 ou macOS real, e isso é detectável via CSS measurement ou JavaScript font enumeration.
Sinais Comportamentais
Nenhum fork do Playwright endereça sinais comportamentais: velocidade de digitação, padrões de movimento do mouse, scroll velocity, tempo entre page load e primeira interação. Sistemas como DataDome coletam esses sinais via JavaScript injection no carregamento da página e os comparam contra modelos de comportamento humano. Um script que navega imediatamente após o load event, sem nenhum movimento de mouse, é trivialmente identificável.
Comparação: Patchright vs Camoufox vs playwright-stealth
O Camoufox é um fork do Firefox (Gecko) que patches fingerprinting no nível do engine — canvas, WebGL, fonts, e até WebRTC. É mais completo para fingerprint spoofing, mas usa Firefox, que tem uma base de usuários menor e pode ser mais suspeito em certos contextos onde Chrome domina.
O playwright-stealth é uma biblioteca de injeção de scripts que roda sobre o Playwright padrão. É a solução mais superficial: não fecha vazamentos de CDP, não corrige o TLS fingerprint, e seus overrides de JavaScript são detectáveis verificando os descriptors das propriedades. É suficiente para sites com proteção leve, mas falha contra Cloudflare Turnstile e DataDome.
O Patchright ocupa o meio-termo: fecha os vazamentos mais técnicos (CDP, flags, TLS) mas deixa canvas/WebGL/fonts por sua conta. Para máxima cobertura, alguns engenheiros combinam Patchright com fingerprint spoofing adicional via injeção de scripts cuidadosamente construída.
Por Que Reputação de IP Ainda Importa Depois dos Vazamentos de CDP
Aqui está o ponto crítico que muitos engenheiros de scraping subestimam: mesmo com todos os vazamentos de CDP fechados, navigator.webdriver = false, TLS fingerprint perfeito do Chrome real, e nenhuma flag de comando detectável — você ainda será bloqueado se seu IP tiver má reputação.
Sistemas como Cloudflare Turnstile e DataDome executam verificações em camadas:
- Camada 1 — Reputação de IP: ASN, geolocalização, histórico de abuso, tipo de IP (residencial vs datacenter). Esta verificação acontece antes de qualquer JavaScript ser executado.
- Camada 2 — TLS fingerprint: JA3/JA4 do ClientHello. Comparado contra fingerprints conhecidos de bots e navegadores reais.
- Camada 3 — JavaScript challenges: Detecção de navigator.webdriver, CDP leaks, canvas fingerprint, sinais comportamentais.
- Camada 4 — Challenge-response: CAPTCHA interativo, proof-of-work, ou challenge silencioso.
Se você falha na Camada 1, nunca chega à Camada 3 onde o Patchright brilha. Um IP de datacenter com ASN da AWS, DigitalOcean, ou OVH é imediatamente marcado como suspeito, independentemente do quão perfeito seja seu fingerprint de navegador. O Cloudflare mantém uma base de dados de ASNs conhecidos como fontes de tráfego automatizado, e proxies datacenter estão no topo dessa lista.
Segundo dados publicados pelo Cloudflare sobre o Turnstile, mais de 80% do tráfego de bots é bloqueado na camada de reputação de IP, antes mesmo de desafios JavaScript serem avaliados. Isso significa que mesmo o Patchright mais bem configurado falhará contra um proxy datacenter.
Proxies residenciais resolvem isso porque fornecem IPs de ISPs reais — Comcast, AT&T, Deutsche Telekom, Vodafone — com ASNs residenciais que passam pela Camada 1 sem levantar suspeitas. O IP parece um usuário doméstico comum acessando a página, o que é exatamente o que o sistema anti-bot espera ver.
Alinhamento de Fingerprint TLS/HTTP2 com o IP Residencial
Passar pela Camada 2 (TLS fingerprint) requer mais do que usar channel='chrome'. O fingerprint TLS precisa ser consistente com o IP de saída. Um IP residencial nos EUA que produz um ClientHello com cipher suites ordenadas de forma incomum para Chrome Windows ainda levanta suspeitas, mesmo que o JA3 hash corresponda a um Chrome real.
O alinhamento correto envolve:
- JA3/JA4 fingerprint que corresponde ao Chrome estável na plataforma correta (Windows, macOS, ou Linux). O Patchright com
channel='chrome'herda isso automaticamente da instalação real do Chrome. - HTTP/2 SETTINGS frame com os parâmetros corretos (HEADER_TABLE_SIZE, ENABLE_PUSH, INITIAL_WINDOW_SIZE). O Chrome usa valores específicos que diferem do Firefox e do Chromium puro.
- HTTP/2 pseudo-header order:
:method,:authority,:scheme,:path— o Chrome usa uma ordem específica que é verificada por alguns WAFs. - User-Agent consistency: o UA string deve corresponder à plataforma do IP de saída. Um IP residencial em Berlin com UA de Chrome no Windows é plausível; um IP em Tóquio com UA de Chrome no Linux é incomum.
O Patchright com channel='chrome' e um proxy residencial geolocalizado corretamente produz um fingerprint TLS que concorda com o IP: o IP diz "usuário residencial em Frankfurt" e o TLS fingerprint diz "Chrome estável", e essa combinação é exatamente o que o sistema anti-bot espera ver. Não há contradição entre as camadas.
Implementação Prática: Patchright com ProxyHat Residencial
Vamos a um exemplo concreto de automação legítima: um script de pesquisa de segurança que coleta dados públicos de uma página protegida por Cloudflare, usando Patchright com um proxy residencial sticky dos EUA via ProxyHat.
Instalação
pip install patchright proxyhat-sdk
python -m patchright install chromium
Nota: usamos patchright install chromium apenas para o navegador bundled; na prática, vamos usar channel='chrome' para obter o Chrome real instalado no sistema.
Script Python Completo
from patchright.sync_api import sync_playwright
import time
import random
# Credenciais ProxyHat — substitua pelas suas
PROXYHAT_USER = "user-country-US-session-abc123"
PROXYHAT_PASS = "sua_password_aqui"
PROXY_URL = f"http://{PROXYHAT_USER}:{PROXYHAT_PASS}@gate.proxyhat.com:8080"
def scrape_protegido(url: str):
with sync_playwright() as p:
# Contexto persistente com proxy residencial sticky
browser = p.chromium.launch_persistent_context(
user_data_dir="/tmp/patchright-profile",
channel="chrome", # Chrome real — TLS/JA3 correto
headless=False, # headless=False é mais confiável
proxy={
"server": PROXY_URL,
},
no_viewport=True, # não fixar viewport — evita sinal
args=[
"--disable-blink-features=AutomationControlled",
],
ignore_default_args=[
"--enable-automation", # remove flag de automação
],
)
page = browser.new_page()
# Navegação com timing humanizado
time.sleep(random.uniform(0.5, 1.5))
page.goto(url, wait_until="domcontentloaded")
# Aguarda desafio do Cloudflare resolver naturalmente
time.sleep(random.uniform(3, 6))
# Verifica se passou pelo desafio
if "challenge" in page.title().lower():
print("Ainda no desafio — aguardando mais...")
time.sleep(5)
# Coleta dados da página
content = page.content()
print(f"Página carregada: {len(content)} bytes")
# Comportamento humanizado antes de sair
page.mouse.move(
random.randint(100, 400),
random.randint(100, 400)
)
time.sleep(random.uniform(1, 2))
browser.close()
return content
if __name__ == "__main__":
html = scrape_protegido("https://exemplo-protegido.com/pagina")
print(f"Sucesso: {len(html)} caracteres coletados")
Usando o ProxyHat SDK para Construir a URL de Proxy
Em vez de construir a URL manualmente, você pode usar o ProxyHat SDK para gerenciar sessões e rotação de IP de forma programática:
from proxyhat import ProxyClient
client = ProxyClient(
username="seu_usuario",
password="sua_password"
)
# Sessão sticky residencial nos EUA
proxy_url = client.get_proxy_url(
country="US",
session_id="abc123",
proxy_type="residential"
)
# Retorna: http://user-country-US-session-abc123:pass@gate.proxyhat.com:8080
# Para rotação por requisição, omita session_id
proxy_url_rotating = client.get_proxy_url(
country="US",
proxy_type="residential"
)
Consulte a documentação oficial do ProxyHat para detalhes completos da API do SDK.
Exemplo com curl para Teste Rápido
# Teste rápido do proxy residencial via curl
curl -x http://user-country-US-session-abc123:pass@gate.proxyhat.com:8080 \
https://httpbin.org/ip
# SOCKS5 (porta 1080)
curl -x socks5://user-country-US-session-abc123:pass@gate.proxyhat.com:1080 \
https://httpbin.org/ip
Erros Comuns e Casos de Borda
1. Usar headless=True
O modo headless do Chrome tem diferenças detectáveis no rendering do canvas e em propriedades como navigator.plugins e navigator.permissions. Mesmo com Patchright, headless=True reduz significativamente a taxa de sucesso contra Cloudflare Turnstile. Se você precisa de headless, considere headless="new" (o novo headless mode do Chrome, que é mais próximo do headed), mas esteja ciente de que ainda há diferenças detectáveis.
2. Sessões não-sticky em fluxos multi-página
Se você navega por múltiplas páginas sem um session_id consistente, cada requisição sai de um IP diferente. O Cloudflare interpreta isso como um único navegador saltando entre IPs em segundos — um padrão claramente automatizado. Use session-abc123 no username do ProxyHat para manter o mesmo IP residencial durante toda a sessão.
3. User-Agent inconsistente com a plataforma do IP
Se seu proxy residencial está em Frankfurt (Alemanha) mas seu User-Agent diz Chrome no macOS em inglês americano, há uma inconsistência geolinguística. Sistemas anti-bot correlacionam navigator.language, navigator.languages, timezone via Date.getTimezoneOffset(), e geolocalização do IP. Tudo precisa concordar.
4. Concorrência excessiva
Mesmo com proxies residenciais, 100+ sessões simultâneas do mesmo ASN em poucos minutos é um padrão anômalo. Limite a concorrência a 10-20 sessões por ASN e distribua ao longo do tempo. O ProxyHat suporta até 100 sessões concorrentes por plano, mas isso não significa que você deve usar todas contra o mesmo alvo simultaneamente.
5. Ignorar robots.txt e ToS
Nenhum nível de sofisticação técnica substitui conformidade legal. Verifique robots.txt, leia os Termos de Serviço do site, e respeite Crawl-delay. Para dados pessoais de usuários da UE, o GDPR se aplica; para dados de residentes da Califórnia, o CCPA. Automação legítima coleta dados públicos em conformidade, não contorna barreiras de autenticação.
Onde Isso é Apropriado — e Onde Não É
Esta análise profunda do Patchright serve a um propósito específico: automação legítima de dados públicos e pesquisa de segurança autorizada. Isso inclui:
- Pesquisa de segurança autorizada: pentests com autorização escrita do alvo, onde você precisa testar se as defesas anti-bot do cliente estão funcionando.
- Coleta de dados públicos: dados que são visíveis sem login e não estão protegidos por medidas técnicas de acesso (DMCA anti-circumvention).
- Monitoramento de preços de e-commerce: dados públicos de listagens de produtos, respeitando
robots.txte limites de taxa. - Rastreamento de SERP: coleta de resultados de busca para SEO, em conformidade com os termos do motor de busca.
Não é apropriado para:
- Contornar login-walls ou paywalls — isso viola o Computer Fraud and Abuse Act (CFAA) nos EUA e legislações similares em outras jurisdições.
- Fraude de tickets, sneaker drops com contas falsas, ou qualquer atividade que envolva identidades fabricadas.
- Coleta de dados pessoais sem base legal (consentimento, interesse legítimo) sob GDPR/CCPA.
- Ataques de credential stuffing ou qualquer forma de acesso não autorizado.
O Patchright é uma ferramenta técnica, não uma licença ética. Use-o para reduzir fricção em automação legítima, nunca para contornar barreiras projetadas para proteger dados que não são seus.
Configuração Específica do ProxyHat
Para integrar o Patchright com o ProxyHat de forma robusta, aqui estão os detalhes de configuração:
Geo-targeting por País e Cidade
# Residencial nos EUA (qualquer cidade)
http://user-country-US-session-abc123:pass@gate.proxyhat.com:8080
# Residencial em Berlim, Alemanha
http://user-country-DE-city-berlin-session-abc123:pass@gate.proxyhat.com:8080
# Rotação por requisição (sem session)
http://user-country-US:pass@gate.proxyhat.com:8080
Escolhendo o Tipo de Proxy Correto
| Cenário | Tipo de Proxy | Razão |
|---|---|---|
| Cloudflare Turnstile / DataDome | Residencial | ASN residencial passa na Camada 1 |
| SERP tracking (Google, Bing) | Residencial | Google bloqueia ASNs de datacenter agressivamente |
| APIs sem proteção anti-bot | Datacenter | Menor latência, menor custo |
| Mobile-only endpoints (mDOT) | Mobile | ASN de operadora móvel (Verizon, T-Mobile) |
Veja os locais disponíveis do ProxyHat para a lista completa de países e cidades suportados, e confira os planos e preços para escolher o tipo de proxy adequado ao seu volume.
SOCKS5 para Casos Especiais
Para alguns casos de uso, SOCKS5 pode ser preferível — especialmente se você precisa de proxy DNS resolution no lado do proxy (evitando DNS leaks). O ProxyHat suporta SOCKS5 na porta 1080:
proxy = {
"server": "socks5://gate.proxyhat.com:1080",
"username": "user-country-US-session-abc123",
"password": "pass"
}
Principais Conclusões
- O Patchright fecha vazamentos que playwright-stealth não consegue: CDP Runtime.enable, flags de comando, e TLS fingerprint via channel='chrome'. Isso é necessário mas não suficiente.
- Reputação de IP é a primeira camada e a mais barata de verificar: proxies datacenter são bloqueados antes de qualquer JavaScript rodar. Proxies residenciais são obrigatórios contra Cloudflare Turnstile e DataDome.
- Alinhamento entre IP e fingerprint é crítico: o IP residencial e o TLS fingerprint do Chrome real precisam contar a mesma história. Um IP em Frankfurt com Chrome real no Windows é plausível; inconsistências são detectáveis.
- Canvas, WebGL, fonts e sinais comportamentais permanecem abertos no Patchright: para máxima cobertura, combine com fingerprint spoofing adicional ou considere Camoufox para casos que exigem spoofing de canvas/WebGL.
- Use para automação legítima apenas: pesquisa de segurança autorizada, dados públicos em conformidade com robots.txt e ToS. Nunca para contornar login-walls, fraudar sistemas, ou acessar dados que não são seus.
Para mais casos de uso de scraping com proxies residenciais, veja nosso guia de web scraping com ProxyHat e de rastreamento de SERP.






