Patchright derin inceleme, modern bot tespit sistemlerini aşmak için Playwright'ın ne kadarını yamadığını ve nerede hâlâ boşluklar kaldığını anlamak isteyen güvenlik araştırmacıları ve scraping mühendisleri için kritik bir konudur. Bu rehber, CDP sızıntılarından TLS parmak izi uyumuna kadar tüm teknik katmanları pratik kod örnekleriyle ele alır.
Patchright Derin İnceleme: Tespit Sinyalleri ve Teknik Bağlam
Modern anti-bot sistemleri — Cloudflare Turnstile, DataDome, PerimeterX, Kasada — artık tek bir sinyale güvenmiyor. Bunun yerine çok katmanlı bir tespit yığını kullanıyorlar: JavaScript ortamı sızıntıları, CDP (Chrome DevTools Protocol) runtime sızıntıları, komut satırı bayrakları, TLS/JA3 parmak izi, IP itibarı ve davranışsal analiz. Tek bir katmanı kapatmak yeterli değil; hepsini uyumlu hale getirmeniz gerekiyor.
Standart Playwright ile bir sayfa açtığınızda, en az dört belirgin sinyal sızar:
- navigator.webdriver = true — W3C WebDriver spesifikasyonuna göre MDN belgelerinde tanımlandığı üzere, bu özellik otomasyon bağlamında
truedöner. - CDP Runtime.enable sızıntısı — Playwright,
Runtime.enablekomutunu gönderdiğinde, bu durumwindow.cdc_benzeri global değişkenler ve runtime hook'ları aracılığıyla tespit edilebilir. Chrome DevTools Protocol spesifikasyonu, bu komutun runtime değerlendirmesini etkinleştirdiğini açıkça belirtir. - Otomasyon komut bayrakları —
--enable-automation,--disable-blink-features=AutomationControlledeksikliği,--remote-debugging-portgibi bayraklar process listesinde görülebilir. - Sahte Chrome kanalı — Playwright'ın Chromium'ı, gerçek Google Chrome'un TLS ClientHello'sundan farklı bir JA3/JA4 parmak izi üretir.
Patchright, GitHub deposunda açıklandığı üzere, Playwright'ın kaynak kodunu doğrudan yamayarak bu sinyalleri kapatır. Patches, browser binary'sini değil, Playwright'ın Chrome'u başlatma ve kontrol etme biçimini değiştirir.
navigator.webdriver ve CDP Sızıntıları
Patchright, navigator.webdriver özelliğini false döndürecek şekilde yamalar. Ancak asıl kritik nokta, CDP Runtime.enable komutunun yarattığı sızıntıları kapatmasıdır. Standart Playwright, Runtime.enable göndererek JavaScript değerlendirmesini etkinleştirir — bu, Error stack trace'lerinde CDP hook'larını ortaya çıkarır ve anti-bot sistemleri bunu tespit eder.
Patchright, Runtime.evaluate yerine doğrudan Page.evaluate benzeri alternatif yollar kullanır ve Runtime.enable göndermez. Bu, cdc_ önekli global değişkenlerin oluşmasını engeller.
Komut Bayrakları ve --disable-blink-features=AutomationControlled
Patchright, Chrome başlatılırken --disable-blink-features=AutomationControlled bayrağını enjekte eder. Bu bayrak, Blink motorunun otomasyon kontekstini algılamasını ve navigator.webdriver'ı true olarak ayarlamasını engeller. Ayrıca --enable-automation bayrağını kaldırır ve channel='chrome' kullanarak gerçek Google Chrome binary'sini başlatır — bu, Chromium yerine Chrome'un TLS stack'ini kullanmak anlamına gelir.
channel='chrome' kullanımı kritiktir çünkü Chromium'ın TLS ClientHello'su, gerçek Chrome'un ClientHello'sundan farklıdır. JA3 parmak izi, cipher suite listesi, uzantı sıralaması ve desteklenen gruplar açısından farklıdır. Anti-bot sistemleri bu farkı kolayca algılayabilir.
Patchright Ne Yamalar, Ne Yamaz?
Patchright'ın güçlü yönleri ve sınırlamaları net anlaşılmalıdır:
| Sinyal Kategorisi | Patchright | playwright-stealth | Camoufox |
|---|---|---|---|
| navigator.webdriver | Yamalı (kaynak düzeyinde) | Yamalı (JS enjeksiyonu) | Yamalı (Firefox tabanlı) |
| CDP Runtime.enable sızıntısı | Yamalı (komut gönderilmez) | Yamalı DEĞİL | Uygulanamaz (Firefox) |
| Komut bayrakları (--enable-automation) | Yamalı (bayrak kaldırılır) | Yamalı DEĞİL | Uygulanamaz |
| TLS/JA3 parmak izi (gerçek Chrome) | Yamalı (channel='chrome') | Yamalı DEĞİL | Farklı (Firefox JA3) |
| Canvas/WebGL parmak izi | Yamalı DEĞİL | Kısmen (noise ekleme) | Yamalı (rastgeleleştirme) |
| Font listesi parmak izi | Yamalı DEĞİL | Yamalı DEĞİL | Yamalı (sahte font listesi) |
| Davranışsal sinyaller (fare hareketi, scroll) | Yamalı DEĞİL | Yamalı DEĞİL | Yamalı DEĞİL |
Canvas ve WebGL: Kapatılmayan Boşluk
Patchright, canvas ve WebGL parmak izlerini değiştirmez. Canvas parmak izi, GPU sürücüsü, anti-aliasing algoritması ve font rendering motoruna bağlı olarak benzersiz bir hash üretir. İki aynı Chrome kurulumu, farklı GPU'larda farklı canvas hash'leri üretir. Anti-bot sistemleri bu hash'i kaydeder ve tekrar eden hash'leri bot olarak işaretler.
Benzer şekilde, WebGL parmak izi — WEBGL_debug_renderer_info uzantısından alınan GL_RENDERER ve GL_VENDOR değerleri — gerçek GPU bilgisini sızdırır. Bir veri merkezinde 1000 otomasyon örneği aynı GPU'yu raporluyorsa, bu bir bot çiftliği sinyalidir.
Davranışsal Sinyaller
Hiçbir framework doğrudan davranışsal sinyalleri yamaz. Fare hareketinin doğallığı, scroll hızı, sayfa etkileşim zamanlaması — bunlar geliştiricinin sorumluluğundadır. Cloudflare Turnstile, sayfa yüklendikten sonra kullanıcı etkileşimini bekler ve gerçek bir kullanıcının fare hareketini taklit eden basit bir bezier eğrisi bile yeterli olmayabilir; çünkü Turnstile, hareketin entropy'sini ve zamanlama dağılımını analiz eder.
playwright-stealth ve Camoufox ile Karşılaştırma
playwright-stealth, Playwright'ın üzerine JavaScript enjeksiyonları ekleyerek navigator.webdriver'ı gizler. Ancak CDP Runtime.enable komutu hâlâ gönderilir, bu da stack trace analizinde tespit edilebilir. Ayrıca TLS parmak izi düzeltilmez — Chromium JA3'i kullanılmaya devam eder.
Camoufox, Firefox tabanlı bir fork'tur. CDP sızıntıları Firefox'ta geçerli değildir, bu yüzden bu sorunu doğrudan çözülür. Canvas ve WebGL parmak izleri rastgeleleştirilir. Ancak Firefox'un TLS parmak izi Chrome'dan tamamen farklıdır ve bir site Chrome trafiğinin çoğunluğunu bekliyorsa, Firefox JA3'i bir azınlık sinyali olarak işaretlenebilir.
IP İtibarı: CDP Sızıntıları Kapandıktan Sonra Geriye Ne Kalır?
Patchright tüm JavaScript ve CDP sızıntılarını kapatsa bile, anti-bot sistemleri hâlâ IP katmanında sizi puanlar. Cloudflare Turnstile ve DataDome, IP itibarını en az üç boyutta değerlendirir:
- ASN tipi — Veri merkezi ASN'leri (AWS, GCP, Azure, DigitalOcean) otomatik olarak yüksek risk puanı alır. Cloudflare, ASN veritabanını sürekli günceller ve bilinen cloud sağlayıcı IP aralıklarını işaretler.
- Tarihsel davranış — Bir IP'den daha önce şüpheli istekler geldiyse, o IP kalıcı olarak işaretlenir. Veri merkezi IP'leri genellikle çok sayıda farklı istemci tarafından paylaşılır, bu yüzden birinin kötü davranışı diğerini de etkiler.
- Coğrafi tutarlılık — IP'nin coğrafi konumu ile tarayıcının dil ayarları ve Accept-Language başlığı arasındaki uyumsuzluk bir sinyaldir. Örneğin, ABD çıkış IP'si ile Almanca
Accept-Languagebaşlığı bir uyuşmazlık sinyalidir.
Veri merkezi proxy'leri, ne kadar iyi yapılandırılmış olursa olsun, ASN düzeyinde tespit edilir. Rezidansiyel proxy'ler, gerçek ISP'lere atanmış IP'leri kullandığı için ASN sinyalini sıfırlar. Mobil proxy'ler ise operatör IP aralıklarını kullanır ve genellikle en yüksek itibara sahiptir çünkü gerçek mobil cihaz trafiğinden ayırt edilemez.
Cloudflare Turnstile, özellikle IP itibarını ve TLS parmak izini birlikte değerlendirir. Eğer IP veri merkezinden geliyorsa, TLS parmak izi ne kadar mükemmel olursa olsun, challenge gösterilir. Bu yüzden patchright proxy kombinasyonu — yani Patchright ile rezidansiyel proxy kullanımı — pratik bir zorunluluktur.
TLS/HTTP2 Parmak İzi Uyumu
TLS parmak izi (JA3/JA4), ClientHello mesajındaki şu alanlardan hesaplanır:
- Cipher suite listesi ve sıralaması
- TLS uzantıları ve sıralaması
- Elliptic curve listesi
- EC point formatları
Gerçek Chrome 120+, ClientHello'sunda yaklaşık 17 cipher suite, 20+ TLS uzantısı ve belirli bir sıralama kullanır. Örneğin, Chrome'un cipher suite listesi genellikle TLS_AES_256_GCM_SHA384 ile başlar ve TLS_CHACHA20_POLY1305_SHA256 ile devam eder. Chromium'ın sıralaması farklıdır ve bu fark JA3 hash'inde ortaya çıkar.
Patchright, channel='chrome' kullandığında, gerçek Google Chrome binary'si başlatılır ve bu binary, gerçek Chrome TLS stack'ini kullanır. Bu, JA3 parmak izinin gerçek Chrome ile birebir aynı olmasını sağlar.
Ancak TLS parmak izi tek başına yeterli değildir. HTTP/2 SETTINGS frame'i de bir parmak izi kaynağıdır. Chrome, HTTP/2 bağlantısında belirli SETTINGS değerleri gönderir — HEADER_TABLE_SIZE: 65536, INITIAL_WINDOW_SIZE: 6291456, MAX_CONCURRENT_STREAMS: 1000 gibi. Bu değerler, gerçek Chrome ile Chromium arasında farklılık gösterebilir.
Önemli olan nokta şudur: TLS parmak izi, IP adresi ile uyumlu olmalıdır. Bir rezidansiyel IP'den gelen isteğin JA3'ü, o IP'nin coğrafi konumunda yaygın olan Chrome sürümüne uygun olmalıdır. Örneğin, ABD'deki bir Comcast IP'sinden gelen istek, ABD'de yaygın olan Chrome sürümünün JA3'ünü üretmelidir. Patchright + gerçek Chrome + rezidansiyel proxy bu uyumu sağlar.
Pratik Uygulama: Patchright + ProxyHat Rezidansiyel Proxy
Aşağıdaki örnek, yasal güvenlik araştırması veya halka açık veri toplama senaryosu için Patchright'ı ProxyHat rezidansiyel proxy ile birlikte kullanır. ProxyHat SDK, proxy URL'sini otomatik olarak oluşturur.
Python ile Patchright Kurulumu
Önce gerekli paketleri yükleyin:
pip install patchright proxyhat-sdk
python -m patchright install chrome
Sonra, proxy URL'sini ProxyHat SDK ile oluşturun ve Patchright'ı başlatın:
from patchright.sync_api import sync_playwright
from proxyhat import ProxyBuilder
# ProxyHat SDK ile sticky rezidansiyel proxy URL'si oluştur
proxy_url = ProxyBuilder.build_http(
username="user-country-US-session-abc123",
password="pass",
host="gate.proxyhat.com",
port=8080
)
# Sonuç: http://user-country-US-session-abc123:pass@gate.proxyhat.com:8080
with sync_playwright() as p:
# channel='chrome' ile gerçek Chrome başlat
browser = p.chromium.launch_persistent_context(
user_data_dir="./chrome_profile",
channel="chrome",
headless=False,
proxy={"server": proxy_url},
no_viewport=True,
args=[
"--disable-blink-features=AutomationControlled",
],
)
page = browser.new_page()
# Korumalı sayfaya git
page.goto("https://example-protected-site.com", timeout=60000)
# Sayfanın yüklenmesini bekle
page.wait_for_load_state("networkidle")
# İçeriği al
title = page.title()
content = page.content()
print(f"Sayfa başlığı: {title}")
print(f"İçerik uzunluğu: {len(content)} karakter")
browser.close()
Bu örnekte dikkat edilmesi gereken noktalar:
channel="chrome"kullanılarak gerçek Google Chrome başlatılır — Chromium değil.launch_persistent_contextkullanılarak kalıcı bir profil oluşturulur. Bu, çerezlerin ve localStorage'ın oturumlar arasında korunmasını sağlar ve daha gerçekçi bir kullanıcı profili yaratır.country-US-session-abc123flag'i, ProxyHat'e ABD çıkış IP'si veabc123oturum kimliği ile sticky bir rezidansiyel IP atamasını söyler. Aynı oturum kimliği kullanıldıkça aynı IP korunur — bu, çok adımlı oturumlar için kritiktir.headless=Falseönerilir çünkü bazı anti-bot sistemleri headless Chrome'u ek sinyallerle tespit eder. Sunucu ortamında Xvfb kullanabilirsiniz.
Node.js ile Patchright
const { chromium } = require('patchright');
const proxyUrl = 'http://user-country-US-session-abc123:pass@gate.proxyhat.com:8080';
(async () => {
const browser = await chromium.launchPersistentContext('./chrome_profile', {
channel: 'chrome',
headless: false,
proxy: { server: proxyUrl },
args: ['--disable-blink-features=AutomationControlled'],
});
const page = await browser.newPage();
await page.goto('https://example-protected-site.com', { timeout: 60000 });
await page.waitForLoadState('networkidle');
const title = await page.title();
console.log(`Sayfa başlığı: ${title}`);
await browser.close();
})();
curl ile SOCKS5 Proxy Testi
ProxyHat SOCKS5 proxy'sini doğrulamak için hızlı bir test:
curl -x socks5://user-country-US-session-abc123:pass@gate.proxyhat.com:1080 \
https://httpbin.org/ip
Bu, çıkış IP'nizi döndürmelidir. Eğer ABD IP'si görüyorsanız, proxy doğru çalışıyor demektir.
Yaygın Hatalar ve Sınır Durumları
1. Headless Kullanımı
Headless Chrome, headful Chrome'dan farklı User-Agent string'i gönderir (HeadlessChrome alt string'i). Patchright bunu yamalar, ancak bazı anti-bot sistemleri ek headless sinyalleri arar: window.outerWidth === 0, navigator.permissions davranış farklılıkları, ve WebGL renderer bilgisi. Mümkün olduğunda headful mod + Xvfb kullanın.
2. Oturum Kimliği Tutarlılığı
Sticky session kullanırken, session-abc123 kimliği aynı kaldıkça aynı IP korunur. Ancak oturum kimliğini her istekte değiştirirseniz, IP her seferinde değişir ve bu, çok adımlı oturumları (login → browse → action) bozar. Login gerektiren sitelerde aynı oturum kimliğini kullanın.
3. User-Agent ile IP Uyumsuzluğu
Eğer ABD çıkış IP'si kullanıyorsanız ve tarayıcı dilini Almanca olarak ayarlıyorsanız, bu bir uyuşmazluk sinyalidir. Accept-Language başlığı ve tarayıcı dili, IP'nin coğrafi konumuyla uyumlu olmalıdır. ProxyHat'in country flag'i ile tarayıcı dilini eşleştirin.
4. Çok Hızlı İstek Hızı
İnsanlar ortalama 2-5 saniyede bir sayfa etkileşiminde bulunur. Saniyede 10 istek gönderen bir otomasyon, davranışsal analiz tarafından tespit edilir. İstekler arasına rastgele 2-8 saniyelik gecikmeler ekleyin.
5. Canvas Parmak İzi Tekrarı
Aynı makinede çalışan 50 Patchright örneği, aynı canvas hash'ini üretir. Bu, bir bot çiftliği sinyalidir. Her örnek için farklı bir GPU profeli kullanmak zordur; bu durumda Camoufox gibi canvas rastgeleleştirme yapan bir araç düşünülebilir.
ProxyHat'e Özel Kurulum
ProxyHat, residential, mobile ve datacenter proxy tiplerini destekler. Patchright ile kullanım için residential veya mobile proxy'ler önerilir. ProxyHat fiyatlandırması, GB bazlı ve sınırsız eşzamanlı bağlantı seçenekleri sunar.
ProxyHat'in resmi belgeleri, tüm flag formatlarını ve kullanım örneklerini içerir. İşte bazı yaygın konfigürasyonlar:
# ABD, şehir seviyesinde hedefleme
http://user-country-US-city-newyork-session-abc123:pass@gate.proxyhat.com:8080
# Almanya, Berlin çıkışı
http://user-country-DE-city-berlin-session-xyz789:pass@gate.proxyhat.com:8080
# Mobil proxy (en yüksek itibar)
http://user-mobile-country-US-session-abc123:pass@gate.proxyhat.com:8080
ProxyHat lokasyonları sayfasından, mevcut tüm ülkeleri ve şehirleri görebilirsiniz. SERP izleme ve web scraping senaryoları için web scraping kullanım senaryosu ve SERP izleme kullanım senaryosu sayfalarımızda daha fazla bilgi bulabilirsiniz.
Etik ve Yasal Çerçeve
Bu tekniklerin kullanımı yalnızca aşağıdaki durumlar için uygundur:
- Yetkili güvenlik araştırması — Kendi sisteminizde veya yazılı izin aldığınız sistemlerde pentest yapılması.
- Halka açık veri toplama — robots.txt'e saygı gösteren, halka açık sayfalardan veri çıkarma.
- SERP izleme — Arama motoru sonuç pozisyonlarını takip etme.
- Fiyat karşılaştırma — Rakip fiyatlarını izleme (ToS ihlali oluşturmayan).
Bu teknikler aşağıdaki durumlar için uygun DEĞİLDİR:
- Giriş yapma gerektiren hesaplara izinsiz erişim
- Kredi kartı sahtekarlığı veya finansal kötüye kullanım
- Toplu hesap oluşturma veya spam
- Bilet/sneaker satın alım botları (site ToS ihlali)
- Kişisel verilerin GDPR/CCPA ihlali oluşturacak şekilde toplanması
RFC 9110 (HTTP Semantics), otomatik istemcilerin robots.txt ve rate limit kurallarına uymasını önerir. Her zaman hedef sitenin kullanım şartlarını kontrol edin.
Key Takeaways
Önemli Çıkarımlar:
- Patchright, navigator.webdriver, CDP Runtime.enable sızıntısı ve komut bayraklarını kaynak düzeyinde yamar — playwright-stealth bunu JS enjeksiyonuyla yapar ve daha kolay tespit edilir.
channel='chrome'kullanımı, gerçek Chrome TLS/JA3 stack'ini sağlar ve Chromium parmak izinden kaçınır.- Canvas, WebGL, font ve davranışsal sinyaller Patchright tarafından yamalanmaz — bu katmanlar için ek araçlar gerekebilir.
- IP itibarı, CDP sızıntıları kapandıktan sonra bile tespit yığınında kritik bir faktördür — veri merkezi IP'leri ASN düzeyinde işaretlenir.
- Rezidansiyel veya mobil proxy'ler, ASN sinyalini sıfırlar ve Cloudflare Turnstile/DataDome'a karşı en temiz geçişi sağlar.
- TLS parmak izi ile IP coğrafi konumu uyumlu olmalıdır — ABD IP'si ile Almanca dil ayarı bir uyuşmazlık sinyalidir.
- Sticky session, çok adımlı oturumlar için zorunludur; oturum kimliğini koruyun.
- Bu teknikler yalnızca yetkili güvenlik araştırması ve halka açık veri toplama için kullanılmalıdır.
Sonuç
Patchright, undetected playwright ihtiyacının şu anki en güçlü çözümüdür. CDP sızıntılarını kaynak düzeyinde kapatır, gerçek Chrome TLS stack'ini kullanır ve komut bayraklarını temizler. Ancak tek başına yeterli değildir — canvas/WebGL parmak izleri, davranışsal sinyaller ve en önemlisi IP itibarı hâlâ açık yüzeylerdir.
Patchright cloudflare korumasını aşmak isteyen araştırmacılar için rezidansiyel proxy kullanımı bir lüks değil, bir zorunluluktur. ProxyHat'in residential ve mobile proxy'leri, gerçek ISP ASN'lerinden gelen IP'lerle ASN sinyalini sıfırlar ve sticky session ile çok adımlı oturumları destekler.
Unutmayın: en gelişmiş tespit önleme teknikleri bile kötü niyetli kullanımda etik ve yasal sorunlar yaratır. Bu araçları yalnızca yetkili araştırma ve halka açık veri toplama için kullanın.






