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 |