Bloga geri dön

Selenium ve Puppeteer Kullanımını Nasıl Gizlersiniz

Selenium ve Puppeteer kullanımını anti-bot koruma sistemlerinden etkili bir şekilde nasıl gizleyeceğinizi öğrenin. Pratik yöntemler, kod örnekleri ve otomasyonu maskelemek için kanıtlanmış teknikler.

📅26 Aralık 2025
```html

Selenium ve Puppeteer'i Tespitten Gizleme için Tam Kılavuz

Modern anti-bot sistemleri, otomatik tarayıcıları JavaScript değişkenlerinden WebDriver davranış özelliklerine kadar birçok belirti ile kolayca tanıyabilir. Siteler, Selenium ve Puppeteer'den gelen standart yapılandırmadaki isteklerin %90'ını engelleyen Cloudflare, DataDome, PerimeterX ve kendi çözümlerini kullanıyor.

Bu kılavuzda otomasyonu gizlemenin tüm yöntemlerini inceleyeceğiz: temel ayarlardan gelişmiş tespit aşma tekniklerine kadar. Çoğu koruma sistemine karşı çalışan Python ve Node.js için kod örnekleri ile hazır çözümler alacaksınız.

Siteler otomasyonu nasıl tespit eder

Anti-bot sistemleri, tarayıcıyı aynı anda birçok parametre ile analiz eder. Bir belirtiyi gizleseniz bile, diğerleri otomasyonu açığa çıkarır. Tespit yöntemlerini anlamak, etkili gizleme için anahtardır.

WebDriver göstergeleri

En basit tespit yöntemi, yalnızca otomatik tarayıcılarda bulunan JavaScript değişkenlerini kontrol etmektir:

// Bu değişkenler Selenium/Puppeteer'i açığa çıkarır
navigator.webdriver === true
window.navigator.webdriver === true
document.$cdc_ // ChromeDriver'a özgü değişken
window.document.documentElement.getAttribute("webdriver")
navigator.plugins.length === 0 // Otomatik tarayıcılarda eklenti yok
navigator.languages === "" // Boş dil listesi

Cloudflare ve benzeri sistemler bu özellikleri öncelikle kontrol eder. Eğer en az bir tanesi olumlu sonuç dönerse — istek engellenir.

Tarayıcı parmak izi

Gelişmiş sistemler, birçok parametreye dayalı olarak tarayıcıya özgü bir parmak izi oluşturur:

  • Canvas Parmak İzi — gizli görüntülerin işlenmesi ve piksel verilerinin analizi
  • WebGL Parmak İzi — grafik işleyici ve ekran kartı parametreleri
  • Audio Context — ses işleme için benzersiz özellikler
  • Fonts Parmak İzi — sistemdeki yüklü yazı tiplerinin listesi
  • Ekran Çözünürlüğü — ekran çözünürlüğü, renk derinliği, mevcut alan
  • Zaman Dilimi & Dil — zaman dilimi, tarayıcı dilleri, sistem yerel ayarı

Otomatik tarayıcılar genellikle bu parametrelerin alışılmadık kombinasyonlarına sahiptir. Örneğin, Headless Chrome eklentilere sahip değildir, ancak WebGL'yi destekler — bu tür bir kombinasyon gerçek kullanıcılar arasında son derece nadirdir.

Davranış analizi

Modern sistemler, davranış kalıplarını izler:

  • Fare hareketleri — botlar imleci düz çizgilerle hareket ettirir veya hiç hareket ettirmez
  • Hareket hızı — anında form doldurma, insan dışı tıklama hızı
  • Kaydırma kalıpları — pürüzsüz kaydırma yerine ani sıçramalar
  • Klavye olayları — tuşlamalar arasında doğal gecikmelerin olmaması
  • İstek sıklığı — eylemler arasındaki çok düzenli aralıklar

Önemli: DataDome ve PerimeterX, davranışı analiz etmek için makine öğrenimi kullanır. Milyonlarca oturum üzerinde eğitilmişlerdir ve teknik parametrelerin doğru gizlenmesi durumunda bile, davranışın doğal görünmemesi durumunda botu tanıyabilirler.

Selenium için temel gizleme

Standart yapılandırmadaki Selenium WebDriver birçok iz bırakır. Tespiti en aza indirmek için Python ve ChromeDriver örneği ile adım adım ayarları inceleyelim.

WebDriver bayrağını devre dışı bırakma

İlk adım, navigator.webdriver değişkenini gizlemektir. Bu, Chrome DevTools Protokolü aracılığıyla yapılır:

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options

# Chrome seçeneklerini ayarlama
chrome_options = Options()

# Otomasyon bayrağını devre dışı bırakma
chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])
chrome_options.add_experimental_option('useAutomationExtension', False)

# Sürücü oluşturma
driver = webdriver.Chrome(options=chrome_options)

# CDP aracılığıyla webdriver'ı kaldırma
driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {
    'source': '''
        Object.defineProperty(navigator, 'webdriver', {
            get: () => undefined
        })
    '''
})

driver.get('https://example.com')

User-Agent ve diğer başlıkları ayarlama

Headless tarayıcılar genellikle eski veya özel User-Agent dizeleri kullanır. Gerçek bir tarayıcının güncel User-Agent'ını ayarlamak gerekir:

# Windows'taki güncel User-Agent Chrome
user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
chrome_options.add_argument(f'user-agent={user_agent}')

# Gizleme için ek argümanlar
chrome_options.add_argument('--disable-blink-features=AutomationControlled')
chrome_options.add_argument('--disable-dev-shm-usage')
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-gpu')

# Gerçek bir kullanıcının pencere boyutu
chrome_options.add_argument('--window-size=1920,1080')
chrome_options.add_argument('--start-maximized')

Eklentiler ve diller ekleme

Otomatik tarayıcılar eklentilere sahip değildir ve genellikle boş bir dil listesi gösterir. Bunu CDP aracılığıyla düzeltiyoruz:

driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {
    'source': '''
        Object.defineProperty(navigator, 'languages', {
            get: () => ['en-US', 'en', 'ru']
        });
        
        Object.defineProperty(navigator, 'plugins', {
            get: () => [
                {
                    0: {type: "application/x-google-chrome-pdf", suffixes: "pdf", description: "Taşınabilir Belge Biçimi"},
                    description: "Taşınabilir Belge Biçimi",
                    filename: "internal-pdf-viewer",
                    length: 1,
                    name: "Chrome PDF Eklentisi"
                },
                {
                    0: {type: "application/pdf", suffixes: "pdf", description: ""},
                    description: "",
                    filename: "mhjfbmdgcfjbbpaeojofohoefgiehjai",
                    length: 1,
                    name: "Chrome PDF Görüntüleyici"
                }
            ]
        });
        
        Object.defineProperty(navigator, 'platform', {
            get: () => 'Win32'
        });
    '''
})

Selenium için tam ayar örneği

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import random

def create_stealth_driver():
    chrome_options = Options()
    
    # Gizleme için temel ayarlar
    chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])
    chrome_options.add_experimental_option('useAutomationExtension', False)
    chrome_options.add_argument('--disable-blink-features=AutomationControlled')
    
    # User-Agent
    user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
    chrome_options.add_argument(f'user-agent={user_agent}')
    
    # Pencere boyutu
    chrome_options.add_argument('--window-size=1920,1080')
    chrome_options.add_argument('--start-maximized')
    
    driver = webdriver.Chrome(options=chrome_options)
    
    # CDP aracılığıyla gizleme scripti
    stealth_script = '''
        Object.defineProperty(navigator, 'webdriver', {get: () => undefined});
        Object.defineProperty(navigator, 'languages', {get: () => ['en-US', 'en']});
        Object.defineProperty(navigator, 'platform', {get: () => 'Win32'});
        
        window.chrome = {
            runtime: {}
        };
        
        Object.defineProperty(navigator, 'plugins', {
            get: () => [1, 2, 3, 4, 5]
        });
    '''
    
    driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {
        'source': stealth_script
    })
    
    return driver

# Kullanım
driver = create_stealth_driver()
driver.get('https://bot.sannysoft.com/')  # Tespit kontrolü için site

Tespiti aşmak için Puppeteer ayarları

Puppeteer, Selenium ile aynı tespit sorunlarına sahiptir. Ancak Node.js için, gizleme ayarlarının çoğunu otomatikleştiren puppeteer-extra-plugin-stealth adlı bir kütüphane mevcuttur.

puppeteer-extra kurulum

npm install puppeteer puppeteer-extra puppeteer-extra-plugin-stealth

stealth eklentisi ile temel yapılandırma

const puppeteer = require('puppeteer-extra');
const StealthPlugin = require('puppeteer-extra-plugin-stealth');

// Gizleme eklentisini ekle
puppeteer.use(StealthPlugin());

(async () => {
    const browser = await puppeteer.launch({
        headless: 'new', // Yeni headless Chrome modu
        args: [
            '--no-sandbox',
            '--disable-setuid-sandbox',
            '--disable-dev-shm-usage',
            '--disable-accelerated-2d-canvas',
            '--disable-gpu',
            '--window-size=1920,1080',
            '--disable-web-security',
            '--disable-features=IsolateOrigins,site-per-process'
        ]
    });
    
    const page = await browser.newPage();
    
    // Viewport ayarla
    await page.setViewport({
        width: 1920,
        height: 1080,
        deviceScaleFactor: 1
    });
    
    // User-Agent ayarla
    await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36');
    
    // Ek başlıklar
    await page.setExtraHTTPHeaders({
        'Accept-Language': 'en-US,en;q=0.9',
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'
    });
    
    await page.goto('https://bot.sannysoft.com/');
    
    // Kontrol için ekran görüntüsü
    await page.screenshot({ path: 'test.png' });
    
    await browser.close();
})();

Eklenti olmadan manuel ayar

Eğer tam kontrol istiyorsanız veya üçüncü parti kütüphaneleri kullanamıyorsanız, gizlemeyi manuel olarak ayarlayın:

const puppeteer = require('puppeteer');

(async () => {
    const browser = await puppeteer.launch({
        headless: 'new',
        args: ['--no-sandbox', '--disable-setuid-sandbox']
    });
    
    const page = await browser.newPage();
    
    // webdriver ve diğer özellikleri yeniden tanımlama
    await page.evaluateOnNewDocument(() => {
        Object.defineProperty(navigator, 'webdriver', {
            get: () => undefined
        });
        
        Object.defineProperty(navigator, 'languages', {
            get: () => ['en-US', 'en']
        });
        
        Object.defineProperty(navigator, 'plugins', {
            get: () => [1, 2, 3, 4, 5]
        });
        
        // Chrome headless'i gizleme
        Object.defineProperty(navigator, 'platform', {
            get: () => 'Win32'
        });
        
        window.chrome = {
            runtime: {}
        };
        
        // izinleri yeniden tanımlama
        const originalQuery = window.navigator.permissions.query;
        window.navigator.permissions.query = (parameters) => (
            parameters.name === 'notifications' ?
                Promise.resolve({ state: Notification.permission }) :
                originalQuery(parameters)
        );
    });
    
    await page.goto('https://example.com');
    await browser.close();
})();

Cloudflare'ı aşmak için ayar

Cloudflare, gelişmiş tespit yöntemleri kullanır. Aşmak için rastgele gecikmeler ve eylem taklidi eklemek gerekir:

const puppeteer = require('puppeteer-extra');
const StealthPlugin = require('puppeteer-extra-plugin-stealth');

puppeteer.use(StealthPlugin());

async function bypassCloudflare(url) {
    const browser = await puppeteer.launch({
        headless: 'new',
        args: [
            '--no-sandbox',
            '--disable-setuid-sandbox',
            '--disable-web-security'
        ]
    });
    
    const page = await browser.newPage();
    
    // Rastgele User-Agent
    const userAgents = [
        'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
        'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
        'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
    ];
    await page.setUserAgent(userAgents[Math.floor(Math.random() * userAgents.length)]);
    
    // Sayfaya geçiş
    await page.goto(url, { waitUntil: 'networkidle2' });
    
    // Cloudflare kontrolü için bekleyin (genellikle 5-10 saniye)
    await page.waitForTimeout(8000);
    
    // Rastgele fare hareketi
    await page.mouse.move(100, 100);
    await page.mouse.move(200, 200);
    
    const content = await page.content();
    await browser.close();
    
    return content;
}

JavaScript parmak izi ile mücadele

JavaScript parmak izi, birçok parametreye dayalı olarak tarayıcıya özgü bir parmak izi oluşturmadır. WebDriver'ı gizleseniz bile, sistemler otomasyonu tespit etmek için yüzlerce diğer özelliği analiz eder.

Ana parmak izi vektörleri

Anti-bot sistemleri aşağıdaki parametreleri kontrol eder:

Parametre Kontrol edilen Tespit riski
navigator.webdriver Otomasyon bayrağının varlığı Kritik
navigator.plugins Eklenti sayısı ve türleri Yüksek
window.chrome Chrome API'sinin varlığı Orta
navigator.permissions Tarayıcı izin API'si Orta
screen.colorDepth Ekran renk derinliği Düşük
navigator.hardwareConcurrency İşlemci çekirdek sayısı Düşük

Kapsamlı gizleme scripti

Aşağıdaki script, çoğu sorunlu özelliği yeniden tanımlar. Bunu CDP (Selenium) veya evaluateOnNewDocument (Puppeteer) aracılığıyla entegre edin:

const stealthScript = `
    // webdriver'ı kaldır
    Object.defineProperty(navigator, 'webdriver', {
        get: () => undefined
    });
    
    // chrome nesnesini ekle
    window.chrome = {
        runtime: {},
        loadTimes: function() {},
        csi: function() {},
        app: {}
    };
    
    // izinleri yeniden tanımla
    const originalQuery = window.navigator.permissions.query;
    window.navigator.permissions.query = (parameters) => (
        parameters.name === 'notifications' ?
            Promise.resolve({ state: Notification.permission }) :
            originalQuery(parameters)
    );
    
    // eklentileri gizle
    Object.defineProperty(navigator, 'plugins', {
        get: () => {
            return [
                {
                    0: {type: "application/x-google-chrome-pdf", suffixes: "pdf"},
                    description: "Taşınabilir Belge Biçimi",
                    filename: "internal-pdf-viewer",
                    length: 1,
                    name: "Chrome PDF Eklentisi"
                },
                {
                    0: {type: "application/pdf", suffixes: "pdf"},
                    description: "Taşınabilir Belge Biçimi",
                    filename: "internal-pdf-viewer",
                    length: 1,
                    name: "Chrome PDF Görüntüleyici"
                },
                {
                    0: {type: "application/x-nacl"},
                    description: "Yerel İstemci Yürütülebilir",
                    filename: "internal-nacl-plugin",
                    length: 2,
                    name: "Yerel İstemci"
                }
            ];
        }
    });
    
    // Diller
    Object.defineProperty(navigator, 'languages', {
        get: () => ['en-US', 'en']
    });
    
    // Platform
    Object.defineProperty(navigator, 'platform', {
        get: () => 'Win32'
    });
    
    // Vendor
    Object.defineProperty(navigator, 'vendor', {
        get: () => 'Google Inc.'
    });
    
    // Selenium izlerini kaldır
    delete window.cdc_adoQpoasnfa76pfcZLmcfl_Array;
    delete window.cdc_adoQpoasnfa76pfcZLmcfl_Promise;
    delete window.cdc_adoQpoasnfa76pfcZLmcfl_Symbol;
    
    // Pil API'si (headless'da yok)
    if (!navigator.getBattery) {
        navigator.getBattery = () => Promise.resolve({
            charging: true,
            chargingTime: 0,
            dischargingTime: Infinity,
            level: 1
        });
    }
`;

WebDriver özelliklerini kaldırma

ChromeDriver ve diğer WebDriver uygulamaları, küresel alana özgü değişkenler ekler. Bu değişkenler cdc_ ön eki ile başlar ve koruma sistemleri tarafından kolayca tespit edilir.

cdc değişkenlerini tespit etme

Bu değişkenlerin varlığını basit bir script ile kontrol edebilirsiniz:

// Tüm cdc değişkenlerini bulma
for (let key in window) {
    if (key.includes('cdc_')) {
        console.log('WebDriver değişkeni bulundu:', key);
    }
}

// Tipik ChromeDriver değişkenleri:
// cdc_adoQpoasnfa76pfcZLmcfl_Array
// cdc_adoQpoasnfa76pfcZLmcfl_Promise
// cdc_adoQpoasnfa76pfcZLmcfl_Symbol
// $cdc_asdjflasutopfhvcZLmcfl_

Yöntem 1: CDP aracılığıyla kaldırma

En güvenilir yöntem, sayfa yüklenmeden önce değişkenleri Chrome DevTools Protokolü aracılığıyla kaldırmaktır:

from selenium import webdriver

driver = webdriver.Chrome()

# Tüm cdc değişkenlerini kaldır
driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {
    'source': '''
        // Bilinen cdc değişkenlerini kaldır
        const cdcProps = [
            'cdc_adoQpoasnfa76pfcZLmcfl_Array',
            'cdc_adoQpoasnfa76pfcZLmcfl_Promise',
            'cdc_adoQpoasnfa76pfcZLmcfl_Symbol',
            '$cdc_asdjflasutopfhvcZLmcfl_'
        ];
        
        cdcProps.forEach(prop => {
            delete window[prop];
        });
        
        // 'cdc_' içeren tüm değişkenleri kaldır
        Object.keys(window).forEach(key => {
            if (key.includes('cdc_') || key.includes('$cdc_')) {
                delete window[key];
            }
        });
    '''
})

Yöntem 2: ChromeDriver'ı değiştirme

Daha radikal bir yaklaşım, ChromeDriver'ın ikili dosyasını değiştirerek cdc_ dizisini başka bir karakter dizisi ile değiştirmektir. Bu, bu değişkenlerin oluşturulmasını engeller:

import re

def patch_chromedriver(driver_path):
    """
    ChromeDriver'ı patlatır, 'cdc_' dizisini rastgele bir dizi ile değiştirir
    """
    with open(driver_path, 'rb') as f:
        content = f.read()
    
    # 'cdc_' dizisinin tüm geçişlerini 'dog_' (veya aynı uzunluktaki başka bir dizi) ile değiştir
    patched = content.replace(b'cdc_', b'dog_')
    
    with open(driver_path, 'wb') as f:
        f.write(patched)
    
    print(f'ChromeDriver patlatıldı: {driver_path}')

# Kullanım
patch_chromedriver('/path/to/chromedriver')

Dikkat: ChromeDriver ikili dosyasını değiştirmek, işlevselliğini bozabilir. Her zaman yedek alınmadan önce yedekleme yapın. Bu yöntem tüm ChromeDriver sürümleriyle çalışmaz.

Yöntem 3: undetected-chromedriver kullanma

undetected-chromedriver kütüphanesi, başlatıldığında ChromeDriver'ı otomatik olarak patlatır:

pip install undetected-chromedriver
import undetected_chromedriver as uc

# Otomatik patlatma ile sürücü oluşturma
driver = uc.Chrome()

driver.get('https://nowsecure.nl/')  # Tespit kontrolü için site
input('Kapatmak için Enter tuşuna basın...')
driver.quit()

Canvas, WebGL ve Audio API'yi gizleme

Canvas, WebGL ve Audio Parmak İzi, grafik işleme ve ses işleme özelliklerine dayalı olarak benzersiz bir parmak izi oluşturma yöntemleridir. Tarayıcı, işletim sistemi ve donanım kombinasyonu her zaman benzersiz bir sonuç verir.

Canvas Parmak İzi

Sistemler, Canvas üzerinde gizli bir görüntü çizer ve elde edilen pikselleri analiz eder. Headless tarayıcılar genellikle GPU hızlandırması eksikliği nedeniyle alışılmadık sonuçlar verir.

// Tipik Canvas Parmak İzi kodu
const canvas = document.createElement('canvas');
const ctx = canvas.getContext('2d');
ctx.textBaseline = 'top';
ctx.font = '14px Arial';
ctx.fillText('Tarayıcı parmak izi', 2, 2);
const fingerprint = canvas.toDataURL();

Koruma için Canvas API'sine rastgele gürültü ekleyebilirsiniz:

const canvasNoiseScript = `
    // Canvas'a rastgele gürültü ekle
    const originalToDataURL = HTMLCanvasElement.prototype.toDataURL;
    const originalToBlob = HTMLCanvasElement.prototype.toBlob;
    const originalGetImageData = CanvasRenderingContext2D.prototype.getImageData;
    
    // Gürültü ekleme fonksiyonu
    const addNoise = (canvas, context) => {
        const imageData = originalGetImageData.call(context, 0, 0, canvas.width, canvas.height);
        for (let i = 0; i < imageData.data.length; i += 4) {
            // RGB'ye minimum gürültü ekle (gözle görülmez)
            imageData.data[i] += Math.floor(Math.random() * 3) - 1;
            imageData.data[i + 1] += Math.floor(Math.random() * 3) - 1;
            imageData.data[i + 2] += Math.floor(Math.random() * 3) - 1;
        }
        context.putImageData(imageData, 0, 0);
    };
    
    // toDataURL'ı yeniden tanımla
    HTMLCanvasElement.prototype.toDataURL = function() {
        if (this.width > 0 && this.height > 0) {
            const context = this.getContext('2d');
            addNoise(this, context);
        }
        return originalToDataURL.apply(this, arguments);
    };
`;

WebGL Parmak İzi

WebGL, ekran kartı ve sürücüler hakkında bilgi sağlar. Headless tarayıcılar genellikle gerçek GPU yerine SwiftShader (yazılım işleyici) gösterir:

const webglMaskScript = `
    // WebGL parametrelerini gizle
    const getParameter = WebGLRenderingContext.prototype.getParameter;
    WebGLRenderingContext.prototype.getParameter = function(parameter) {
        // UNMASKED_VENDOR_WEBGL
        if (parameter === 37445) {
            return 'Intel Inc.';
        }
        // UNMASKED_RENDERER_WEBGL
        if (parameter === 37446) {
            return 'Intel Iris OpenGL Motoru';
        }
        return getParameter.call(this, parameter);
    };
    
    // WebGL2 için de
    if (typeof WebGL2RenderingContext !== 'undefined') {
        const getParameter2 = WebGL2RenderingContext.prototype.getParameter;
        WebGL2RenderingContext.prototype.getParameter = function(parameter) {
            if (parameter === 37445) {
                return 'Intel Inc.';
            }
            if (parameter === 37446) {
                return 'Intel Iris OpenGL Motoru';
            }
            return getParameter2.call(this, parameter);
        };
    }
`;

Audio Context Parmak İzi

Audio API de benzersiz bir parmak izi sağlar. Ses işleme için gürültü ekleyin:

const audioMaskScript = `
    // Audio Context'e gürültü ekle
    const AudioContext = window.AudioContext || window.webkitAudioContext;
    if (AudioContext) {
        const originalCreateAnalyser = AudioContext.prototype.createAnalyser;
        AudioContext.prototype.createAnalyser = function() {
            const analyser = originalCreateAnalyser.call(this);
            const originalGetFloatFrequencyData = analyser.getFloatFrequencyData;
            analyser.getFloatFrequencyData = function(array) {
                originalGetFloatFrequencyData.call(this, array);
                // Minimum gürültü ekle
                for (let i = 0; i < array.length; i++) {
                    array[i] += Math.random() * 0.0001;
                }
            };
            return analyser;
        };
    }
`;

İnsan davranışını taklit etme

Mükemmel teknik gizlemeye sahip olsanız bile, botlar davranışlarıyla kendilerini açığa çıkarır. Makine öğrenimi sistemleri, fare hareketleri, eylem hızları ve olay sıralarını analiz eder.

Eylemler arasında rastgele gecikmeler

Asla sabit gecikmeler kullanmayın. Gerçek kullanıcılar farklı sürelerde duraklamalar yapar:

import random
import time

def human_delay(min_seconds=1, max_seconds=3):
    """İnsanı taklit eden rastgele gecikme"""
    delay = random.uniform(min_seconds, max_seconds)
    time.sleep(delay)

# Kullanım
driver.get('https://example.com')
human_delay(2, 4)  # 2-4 saniye bekleme

element = driver.find_element(By.ID, 'search')
human_delay(0.5, 1.5)  # Girişten önce kısa bir bekleme

element.send_keys('arama sorgusu')
human_delay(1, 2)

Pürüzsüz fare hareketi

Botlar fareyi düz çizgilerle hareket ettirir veya imleci teleport eder. Gerçek kullanıcılar, hızlanma ve yavaşlama ile kıvrımlı yollar oluşturur:

// Puppeteer: pürüzsüz fare hareketi
async function humanMouseMove(page, targetX, targetY) {
    const steps = 25; // Ara noktaların sayısı
    const currentPos = await page.evaluate(() => ({
        x: window.mouseX || 0,
        y: window.mouseY || 0
    }));
    
    for (let i = 0; i <= steps; i++) {
        const t = i / steps;
        // Pürüzsüzlük için easing kullan
        const ease = t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t;
        
        const x = currentPos.x + (targetX - currentPos.x) * ease;
        const y = currentPos.y + (targetY - currentPos.y) * ease;
        
        await page.mouse.move(x, y);
        await page.waitForTimeout(Math.random() * 10 + 5);
    }
    
    // Pozisyonu kaydet
    await page.evaluate((x, y) => {
        window.mouseX = x;
        window.mouseY = y;
    }, targetX, targetY);
}

// Kullanım
await humanMouseMove(page, 500, 300);
await page.mouse.click(500, 300);

Doğal kaydırma

Gerçek kullanıcılar, içerikleri okumak için duraklamalarla pürüzsüz bir şekilde kaydırır:

async function humanScroll(page) {
    const scrollHeight = await page.evaluate(() => document.body.scrollHeight);
    const viewportHeight = await page.evaluate(() => window.innerHeight);
    
    let currentPosition = 0;
    
    while (currentPosition < scrollHeight - viewportHeight) {
        // Rastgele kaydırma adımı (200-500px)
        const scrollStep = Math.floor(Math.random() * 300) + 200;
        currentPosition += scrollStep;
        
        // Pürüzsüz kaydırma
        await page.evaluate((pos) => {
            window.scrollTo({
                top: pos,
                behavior: 'smooth'
            });
        }, currentPosition);
        
        // İçeriği "okumak" için bekleme (1-3 saniye)
        await page.waitForTimeout(Math.random() * 2000 + 1000);
    }
}

// Kullanım
await page.goto('https://example.com');
await humanScroll(page);

Doğal metin girişi

İnsanlar farklı hızlarda yazar, yazım hataları yapar ve bunları düzeltir:

async function humanTypeText(page, selector, text) {
    await page.click(selector);
    
    for (let char of text) {
        // Tuşlamalar arasındaki rastgele gecikme (50-200ms)
        const delay = Math.random() * 150 + 50;
        await page.waitForTimeout(delay);
        
        // %5 yazım hatası olasılığı
        if (Math.random() < 0.05) {
            // Rastgele bir karakter yaz
            const wrongChar = String.fromCharCode(97 + Math.floor(Math.random() * 26));
            await page.keyboard.type(wrongChar);
            await page.waitForTimeout(100 + Math.random() * 100);
            // Sil (Backspace)
            await page.keyboard.press('Backspace');
            await page.waitForTimeout(50 + Math.random() * 50);
        }
        
        await page.keyboard.type(char);
    }
}

// Kullanım
await humanTypeText(page, '#search-input', 'örnek arama sorgusu');

Tam anonimlik için proxy entegrasyonu

Tarayıcı gizleme, tüm isteklerin tek bir IP adresinden geldiği durumlarda işe yaramaz. Anti-bot sistemleri, her IP'den gelen istek sayısını izler ve şüpheli etkinlikleri engeller. Proxy, her ciddi otomasyonun zorunlu bir bileşenidir.

Proxy türü seçimi

Farklı görevler, farklı proxy türleri gerektirir:

Proxy Türü Avantajlar Uygulama
Özel Proxy Yüksek hız ve güvenlik Hassas görevler
Paylaşımlı Proxy Daha düşük maliyet Genel görevler
Açık Proxy Ücretsiz erişim Düşük güvenlik gereksinimleri
```