Zurück zum Blog

Wie man die Verwendung von Selenium und Puppeteer verbirgt

Erfahren Sie, wie Sie die Verwendung von Selenium und Puppeteer effektiv vor Anti-Bot-Schutzsystemen verbergen können. Praktische Methoden, Codebeispiele und bewährte Techniken zur Maskierung von Automatisierung.

📅26. Dezember 2025
```html

Vollständiger Leitfaden zur Maskierung von Selenium und Puppeteer vor Erkennung

Moderne Anti-Bot-Schutzsysteme erkennen automatisierte Browser leicht anhand von Dutzenden von Merkmalen: von JavaScript-Variablen bis hin zu Verhaltensmerkmalen von WebDriver. Websites verwenden Cloudflare, DataDome, PerimeterX und eigene Lösungen, die bis zu 90 % der Anfragen von Selenium und Puppeteer in der Standardkonfiguration blockieren.

In diesem Leitfaden werden wir alle Methoden zur Maskierung von Automatisierung besprechen: von grundlegenden Einstellungen bis hin zu fortgeschrittenen Techniken zum Umgehen der Erkennung. Sie erhalten fertige Lösungen mit Codebeispielen für Python und Node.js, die gegen die meisten Schutzsysteme funktionieren.

Wie Websites Automatisierung erkennen

Anti-Bot-Schutzsysteme analysieren den Browser anhand vieler Parameter gleichzeitig. Selbst wenn Sie ein Merkmal verbergen, werden die anderen die Automatisierung verraten. Das Verständnis aller Erkennungsmethoden ist der Schlüssel zur effektiven Maskierung.

WebDriver-Indikatoren

Die einfachste Methode zur Erkennung besteht darin, JavaScript-Variablen zu überprüfen, die nur in automatisierten Browsern vorhanden sind:

// Diese Variablen verraten Selenium/Puppeteer
navigator.webdriver === true
window.navigator.webdriver === true
document.$cdc_ // ChromeDriver spezifische Variable
window.document.documentElement.getAttribute("webdriver")
navigator.plugins.length === 0 // Automatisierte Browser haben keine Plugins
navigator.languages === "" // Leere Sprachliste

Cloudflare und ähnliche Systeme überprüfen diese Eigenschaften zuerst. Wenn auch nur eine positiv zurückgegeben wird, wird die Anfrage blockiert.

Fingerprinting des Browsers

Fortgeschrittene Systeme erstellen einen einzigartigen Fingerabdruck des Browsers basierend auf Dutzenden von Parametern:

  • Canvas Fingerprinting — Rendering versteckter Bilder und Analyse von Pixel-Daten
  • WebGL Fingerprinting — Parameter des Grafikrenderers und der Grafikkarte
  • Audio Context — einzigartige Eigenschaften der Audioverarbeitung
  • Fonts Fingerprinting — Liste der installierten Schriftarten im System
  • Screen Resolution — Bildschirmauflösung, Farbtiefe, verfügbarer Bereich
  • Timezone & Language — Zeitzone, Browser-Sprachen, Systemlokalisierung

Automatisierte Browser haben oft untypische Kombinationen dieser Parameter. Zum Beispiel hat Headless Chrome keine Plugins, unterstützt jedoch WebGL — eine solche Kombination kommt bei echten Nutzern äußerst selten vor.

Verhaltensanalyse

Moderne Systeme verfolgen Verhaltensmuster:

  • Bewegungen der Maus — Bots bewegen den Cursor in geraden Linien oder bewegen ihn gar nicht
  • Geschwindigkeit der Aktionen — sofortiges Ausfüllen von Formularen, unnatürliche Klickgeschwindigkeit
  • Scrollmuster — plötzliche Sprünge anstelle von sanftem Scrollen
  • Tastaturereignisse — keine natürlichen Verzögerungen zwischen den Tastenanschlägen
  • Frequenz der Anfragen — zu regelmäßige Intervalle zwischen den Aktionen

Wichtig: DataDome und PerimeterX verwenden maschinelles Lernen zur Analyse des Verhaltens. Sie sind auf Millionen von Sitzungen trainiert und können einen Bot selbst bei korrekter Maskierung technischer Parameter erkennen, wenn das Verhalten unnatürlich aussieht.

Grundlegende Maskierung von Selenium

Selenium WebDriver hinterlässt in der Standardkonfiguration viele Spuren. Lassen Sie uns eine schrittweise Konfiguration zur Minimierung der Erkennung am Beispiel von Python und ChromeDriver betrachten.

Deaktivierung des Webdriver-Flags

Der erste Schritt besteht darin, die Variable navigator.webdriver zu verbergen. Dies geschieht über das Chrome DevTools-Protokoll:

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

# Konfiguration der Chrome-Optionen
chrome_options = Options()

# Deaktivieren des Automatisierungsflags
chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])
chrome_options.add_experimental_option('useAutomationExtension', False)

# Erstellen des Treibers
driver = webdriver.Chrome(options=chrome_options)

# Entfernen von webdriver über CDP
driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {
    'source': '''
        Object.defineProperty(navigator, 'webdriver', {
            get: () => undefined
        })
    '''
})

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

Konfiguration von User-Agent und anderen Headern

Headless-Browser verwenden häufig veraltete oder spezifische User-Agent-Strings. Es ist notwendig, einen aktuellen User-Agent eines echten Browsers festzulegen:

# Aktueller User-Agent von Chrome unter Windows
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}')

# Zusätzliche Argumente zur Maskierung
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')

# Fenstergröße wie bei einem echten Benutzer
chrome_options.add_argument('--window-size=1920,1080')
chrome_options.add_argument('--start-maximized')

Hinzufügen von Plugins und Sprachen

Automatisierte Browser haben keine Plugins und zeigen häufig eine leere Sprachliste an. Wir beheben dies über CDP:

driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {
    'source': '''
        Object.defineProperty(navigator, 'languages', {
            get: () => ['de-DE', 'de', 'en']
        });
        
        Object.defineProperty(navigator, 'plugins', {
            get: () => [
                {
                    0: {type: "application/x-google-chrome-pdf", suffixes: "pdf", description: "Portable Document Format"},
                    description: "Portable Document Format",
                    filename: "internal-pdf-viewer",
                    length: 1,
                    name: "Chrome PDF Plugin"
                },
                {
                    0: {type: "application/pdf", suffixes: "pdf", description: ""},
                    description: "",
                    filename: "mhjfbmdgcfjbbpaeojofohoefgiehjai",
                    length: 1,
                    name: "Chrome PDF Viewer"
                }
            ]
        });
        
        Object.defineProperty(navigator, 'platform', {
            get: () => 'Win32'
        });
    '''
})

Vollständiges Beispiel zur Konfiguration von Selenium

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

def create_stealth_driver():
    chrome_options = Options()
    
    # Grundlegende Maskierungseinstellungen
    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}')
    
    # Fenstergröße
    chrome_options.add_argument('--window-size=1920,1080')
    chrome_options.add_argument('--start-maximized')
    
    driver = webdriver.Chrome(options=chrome_options)
    
    # Maskierungsskript über CDP
    stealth_script = '''
        Object.defineProperty(navigator, 'webdriver', {get: () => undefined});
        Object.defineProperty(navigator, 'languages', {get: () => ['de-DE', 'de']});
        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

# Verwendung
driver = create_stealth_driver()
driver.get('https://bot.sannysoft.com/')  # Website zur Erkennungstest

Konfiguration von Puppeteer zum Umgehen der Erkennung

Puppeteer hat die gleichen Erkennungsprobleme wie Selenium. Für Node.js gibt es jedoch eine fertige Bibliothek puppeteer-extra-plugin-stealth, die die meisten Maskierungseinstellungen automatisiert.

Installation von puppeteer-extra

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

Grundkonfiguration mit dem Stealth-Plugin

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

// Stealth-Plugin aktivieren
puppeteer.use(StealthPlugin());

(async () => {
    const browser = await puppeteer.launch({
        headless: 'new', // Neuer Headless-Modus von Chrome
        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 festlegen
    await page.setViewport({
        width: 1920,
        height: 1080,
        deviceScaleFactor: 1
    });
    
    // User-Agent festlegen
    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');
    
    // Zusätzliche Header
    await page.setExtraHTTPHeaders({
        'Accept-Language': 'de-DE,de;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/');
    
    // Screenshot zur Überprüfung
    await page.screenshot({ path: 'test.png' });
    
    await browser.close();
})();

Manuelle Konfiguration ohne Plugins

Wenn Sie die vollständige Kontrolle wünschen oder keine Drittanbieterbibliotheken verwenden können, konfigurieren Sie die Maskierung manuell:

const puppeteer = require('puppeteer');

(async () => {
    const browser = await puppeteer.launch({
        headless: 'new',
        args: ['--no-sandbox', '--disable-setuid-sandbox']
    });
    
    const page = await browser.newPage();
    
    // Webdriver und andere Eigenschaften überschreiben
    await page.evaluateOnNewDocument(() => {
        Object.defineProperty(navigator, 'webdriver', {
            get: () => undefined
        });
        
        Object.defineProperty(navigator, 'languages', {
            get: () => ['de-DE', 'de']
        });
        
        Object.defineProperty(navigator, 'plugins', {
            get: () => [1, 2, 3, 4, 5]
        });
        
        // Chrome headless maskieren
        Object.defineProperty(navigator, 'platform', {
            get: () => 'Win32'
        });
        
        window.chrome = {
            runtime: {}
        };
        
        // Berechtigungen überschreiben
        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();
})();

Konfiguration zum Umgehen von Cloudflare

Cloudflare verwendet fortschrittliche Erkennungsmethoden. Um dies zu umgehen, müssen zufällige Verzögerungen und die Simulation von Aktionen hinzugefügt werden:

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();
    
    // Zufälliger 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)]);
    
    // Auf die Seite gehen
    await page.goto(url, { waitUntil: 'networkidle2' });
    
    // Warten auf die Cloudflare-Prüfung (normalerweise 5-10 Sekunden)
    await page.waitForTimeout(8000);
    
    // Zufällige Mausbewegung
    await page.mouse.move(100, 100);
    await page.mouse.move(200, 200);
    
    const content = await page.content();
    await browser.close();
    
    return content;
}

Bekämpfung von JavaScript-Fingerprinting

JavaScript-Fingerprinting ist die Erstellung eines einzigartigen Fingerabdrucks des Browsers basierend auf vielen Parametern. Selbst wenn Sie den Webdriver verborgen haben, analysieren Systeme Hunderte anderer Eigenschaften, um Automatisierung zu erkennen.

Hauptvektoren des Fingerprintings

Anti-Bot-Schutzsysteme überprüfen die folgenden Parameter:

Parameter Was wird überprüft Erkennungsrisiko
navigator.webdriver Vorhandensein des Automatisierungsflags Kritisch
navigator.plugins Anzahl und Typen von Plugins Hoch
window.chrome Vorhandensein der Chrome API Mittel
navigator.permissions Browser-Berechtigungs-API Mittel
screen.colorDepth Farbtiefe des Bildschirms Niedrig
navigator.hardwareConcurrency Anzahl der CPU-Kerne Niedrig

Komplexes Maskierungsskript

Das folgende Skript überschreibt die meisten problematischen Eigenschaften. Integrieren Sie es über CDP (Selenium) oder evaluateOnNewDocument (Puppeteer):

const stealthScript = `
    // Entfernen von webdriver
    Object.defineProperty(navigator, 'webdriver', {
        get: () => undefined
    });
    
    // Hinzufügen des chrome Objekts
    window.chrome = {
        runtime: {},
        loadTimes: function() {},
        csi: function() {},
        app: {}
    };
    
    // Überschreiben von Berechtigungen
    const originalQuery = window.navigator.permissions.query;
    window.navigator.permissions.query = (parameters) => (
        parameters.name === 'notifications' ?
            Promise.resolve({ state: Notification.permission }) :
            originalQuery(parameters)
    );
    
    // Maskierung von Plugins
    Object.defineProperty(navigator, 'plugins', {
        get: () => {
            return [
                {
                    0: {type: "application/x-google-chrome-pdf", suffixes: "pdf"},
                    description: "Portable Document Format",
                    filename: "internal-pdf-viewer",
                    length: 1,
                    name: "Chrome PDF Plugin"
                },
                {
                    0: {type: "application/pdf", suffixes: "pdf"},
                    description: "Portable Document Format",
                    filename: "internal-pdf-viewer",
                    length: 1,
                    name: "Chrome PDF Viewer"
                },
                {
                    0: {type: "application/x-nacl"},
                    description: "Native Client Executable",
                    filename: "internal-nacl-plugin",
                    length: 2,
                    name: "Native Client"
                }
            ];
        }
    });
    
    // Sprachen
    Object.defineProperty(navigator, 'languages', {
        get: () => ['de-DE', 'de']
    });
    
    // Plattform
    Object.defineProperty(navigator, 'platform', {
        get: () => 'Win32'
    });
    
    // Anbieter
    Object.defineProperty(navigator, 'vendor', {
        get: () => 'Google Inc.'
    });
    
    // Entfernen von Spuren von Selenium
    delete window.cdc_adoQpoasnfa76pfcZLmcfl_Array;
    delete window.cdc_adoQpoasnfa76pfcZLmcfl_Promise;
    delete window.cdc_adoQpoasnfa76pfcZLmcfl_Symbol;
    
    // Battery API (nicht in headless)
    if (!navigator.getBattery) {
        navigator.getBattery = () => Promise.resolve({
            charging: true,
            chargingTime: 0,
            dischargingTime: Infinity,
            level: 1
        });
    }
`;

Entfernen von WebDriver-Eigenschaften

ChromeDriver und andere WebDriver-Implementierungen fügen spezifische Variablen in den globalen Geltungsbereich ein. Diese Variablen beginnen mit dem Präfix cdc_ und werden von Schutzsystemen leicht erkannt.

Erkennung von cdc-Variablen

Die Überprüfung des Vorhandenseins dieser Variablen kann mit einem einfachen Skript erfolgen:

// Suche nach allen cdc-Variablen
for (let key in window) {
    if (key.includes('cdc_')) {
        console.log('WebDriver-Variable erkannt:', key);
    }
}

// Typische Variablen von ChromeDriver:
// cdc_adoQpoasnfa76pfcZLmcfl_Array
// cdc_adoQpoasnfa76pfcZLmcfl_Promise
// cdc_adoQpoasnfa76pfcZLmcfl_Symbol
// $cdc_asdjflasutopfhvcZLmcfl_

Methode 1: Entfernen über CDP

Der zuverlässigste Weg besteht darin, die Variablen vor dem Laden der Seite über das Chrome DevTools-Protokoll zu entfernen:

from selenium import webdriver

driver = webdriver.Chrome()

# Entfernen aller cdc-Variablen
driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {
    'source': '''
        // Entfernen bekannter cdc-Variablen
        const cdcProps = [
            'cdc_adoQpoasnfa76pfcZLmcfl_Array',
            'cdc_adoQpoasnfa76pfcZLmcfl_Promise',
            'cdc_adoQpoasnfa76pfcZLmcfl_Symbol',
            '$cdc_asdjflasutopfhvcZLmcfl_'
        ];
        
        cdcProps.forEach(prop => {
            delete window[prop];
        });
        
        // Entfernen aller Variablen, die 'cdc_' enthalten
        Object.keys(window).forEach(key => {
            if (key.includes('cdc_') || key.includes('$cdc_')) {
                delete window[key];
            }
        });
    '''
})

Methode 2: Modifikation von ChromeDriver

Ein radikalerer Ansatz besteht darin, die Binärdatei von ChromeDriver zu ändern, indem die Zeichenfolge cdc_ durch eine andere Zeichenfolge ersetzt wird. Dies verhindert die Erstellung dieser Variablen:

import re

def patch_chromedriver(driver_path):
    """
    Patcht ChromeDriver, indem 'cdc_' durch eine zufällige Zeichenfolge ersetzt wird
    """
    with open(driver_path, 'rb') as f:
        content = f.read()
    
    # Ersetzen aller Vorkommen von 'cdc_' durch 'dog_' (oder eine andere Zeichenfolge der gleichen Länge)
    patched = content.replace(b'cdc_', b'dog_')
    
    with open(driver_path, 'wb') as f:
        f.write(patched)
    
    print(f'ChromeDriver gepatcht: {driver_path}')

# Verwendung
patch_chromedriver('/path/to/chromedriver')

Achtung: Die Modifikation der Binärdatei von ChromeDriver kann dessen Funktionalität beeinträchtigen. Machen Sie immer eine Sicherungskopie, bevor Sie patchen. Diese Methode funktioniert nicht mit allen Versionen von ChromeDriver.

Methode 3: Verwendung von undetected-chromedriver

Die Bibliothek undetected-chromedriver patcht ChromeDriver automatisch beim Start:

pip install undetected-chromedriver
import undetected_chromedriver as uc

# Erstellen des Treibers mit automatischem Patchen
driver = uc.Chrome()

driver.get('https://nowsecure.nl/')  # Website zur Erkennungstest
input('Drücken Sie die Eingabetaste zum Schließen...')
driver.quit()

Maskierung von Canvas, WebGL und Audio API

Canvas, WebGL und Audio Fingerprinting sind Methoden zur Erstellung eines einzigartigen Fingerabdrucks basierend auf den Merkmalen der Grafikdarstellung und der Audioverarbeitung. Jede Kombination von Browser, OS und Hardware ergibt ein einzigartiges Ergebnis.

Canvas Fingerprinting

Systeme zeichnen ein verstecktes Bild auf Canvas und analysieren die resultierenden Pixel. Headless-Browser liefern häufig untypische Ergebnisse aufgrund des Fehlens von GPU-Beschleunigung.

// Typischer Code für Canvas Fingerprinting
const canvas = document.createElement('canvas');
const ctx = canvas.getContext('2d');
ctx.textBaseline = 'top';
ctx.font = '14px Arial';
ctx.fillText('Browser-Fingerabdruck', 2, 2);
const fingerprint = canvas.toDataURL();

Zum Schutz können Sie zufälligen Rauschen zur Canvas API hinzufügen:

const canvasNoiseScript = `
    // Fügen Sie zufälligen Rauschen zur Canvas hinzu
    const originalToDataURL = HTMLCanvasElement.prototype.toDataURL;
    const originalToBlob = HTMLCanvasElement.prototype.toBlob;
    const originalGetImageData = CanvasRenderingContext2D.prototype.getImageData;
    
    // Funktion zum Hinzufügen von Rauschen
    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) {
            // Fügen Sie minimales Rauschen zu RGB hinzu (nicht für das Auge sichtbar)
            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);
    };
    
    // Überschreiben von toDataURL
    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 Fingerprinting

WebGL liefert Informationen über die Grafikkarte und die Treiber. Headless-Browser zeigen häufig SwiftShader (Software-Renderer) anstelle einer echten GPU an:

const webglMaskScript = `
    // Maskierung von WebGL-Parametern
    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 Engine';
        }
        return getParameter.call(this, parameter);
    };
    
    // Auch für WebGL2
    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 Engine';
            }
            return getParameter2.call(this, parameter);
        };
    }
`;

Audio Context Fingerprinting

Die Audio-API liefert ebenfalls einen einzigartigen Fingerabdruck. Fügen Sie Rauschen zur Audioverarbeitung hinzu:

const audioMaskScript = `
    // Fügen Sie Rauschen zum Audio Context hinzu
    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);
                // Fügen Sie minimales Rauschen hinzu
                for (let i = 0; i < array.length; i++) {
                    array[i] += Math.random() * 0.0001;
                }
            };
            return analyser;
        };
    }
`;

Nachahmung menschlichen Verhaltens

Selbst mit perfekter technischer Maskierung verraten Bots sich durch ihr Verhalten. Maschinenlern-Systeme analysieren Bewegungsmuster der Maus, Geschwindigkeit der Aktionen und die Reihenfolge der Ereignisse.

Zufällige Verzögerungen zwischen Aktionen

Verwenden Sie niemals feste Verzögerungen. Echte Benutzer machen Pausen unterschiedlicher Dauer:

import random
import time

def human_delay(min_seconds=1, max_seconds=3):
    """Zufällige Verzögerung, die einen Menschen imitiert"""
    delay = random.uniform(min_seconds, max_seconds)
    time.sleep(delay)

# Verwendung
driver.get('https://example.com')
human_delay(2, 4)  # Pause von 2-4 Sekunden

element = driver.find_element(By.ID, 'search')
human_delay(0.5, 1.5)  # Kurze Pause vor der Eingabe

element.send_keys('Suchanfrage')
human_delay(1, 2)

Sanfte Mausbewegung

Bots bewegen die Maus in geraden Linien oder teleportieren den Cursor. Echte Benutzer erzeugen kurvenreiche Trajektorien mit Beschleunigung und Verzögerung:

// Puppeteer: sanfte Mausbewegung
async function humanMouseMove(page, targetX, targetY) {
    const steps = 25; // Anzahl der Zwischenpunkte
    const currentPos = await page.evaluate(() => ({
        x: window.mouseX || 0,
        y: window.mouseY || 0
    }));
    
    for (let i = 0; i <= steps; i++) {
        const t = i / steps;
        // Verwenden Sie Easing für Sanftheit
        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);
    }
    
    // Position speichern
    await page.evaluate((x, y) => {
        window.mouseX = x;
        window.mouseY = y;
    }, targetX, targetY);
}

// Verwendung
await humanMouseMove(page, 500, 300);
await page.mouse.click(500, 300);

Natürliche Scrollbewegung

Echte Benutzer scrollen sanft, mit Pausen zum Lesen des Inhalts:

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) {
        // Zufälliger Scrollschritt (200-500px)
        const scrollStep = Math.floor(Math.random() * 300) + 200;
        currentPosition += scrollStep;
        
        // Sanftes Scrollen
        await page.evaluate((pos) => {
            window.scrollTo({
                top: pos,
                behavior: 'smooth'
            });
        }, currentPosition);
        
        // Pause zum "Lesen" des Inhalts (1-3 Sekunden)
        await page.waitForTimeout(Math.random() * 2000 + 1000);
    }
}

// Verwendung
await page.goto('https://example.com');
await humanScroll(page);

Natürliche Texteingabe

Menschen tippen mit unterschiedlicher Geschwindigkeit, machen Tippfehler und korrigieren diese:

async function humanTypeText(page, selector, text) {
    await page.click(selector);
    
    for (let char of text) {
        // Zufällige Verzögerung zwischen den Tastenanschlägen (50-200ms)
        const delay = Math.random() * 150 + 50;
        await page.waitForTimeout(delay);
        
        // 5% Chance auf einen Tippfehler
        if (Math.random() < 0.05) {
            // Einen zufälligen Buchstaben tippen
            const wrongChar = String.fromCharCode(97 + Math.floor(Math.random() * 26));
            await page.keyboard.type(wrongChar);
            await page.waitForTimeout(100 + Math.random() * 100);
            // Löschen (Backspace)
            await page.keyboard.press('Backspace');
            await page.waitForTimeout(50 + Math.random() * 50);
        }
        
        await page.keyboard.type(char);
    }
}

// Verwendung
await humanTypeText(page, '#search-input', 'Beispiel-Suchanfrage');

Integration von Proxys für vollständige Anonymität

Die Maskierung des Browsers ist nutzlos, wenn alle Anfragen von einer IP-Adresse kommen. Anti-Bot-Schutzsysteme verfolgen die Anzahl der Anfragen von jeder IP und blockieren verdächtige Aktivitäten. Proxys sind ein unverzichtbarer Bestandteil jeder ernsthaften Automatisierung.

Auswahl des Proxytyps

Verschiedene Aufgaben erfordern unterschiedliche Proxytypen:

Proxytyp Vorteile Anwendung
Datacenter-Proxys Hohe Geschwindigkeit, kostengünstig Web-Scraping, Massenanfragen
Residential-Proxys Echte IP-Adressen, schwerer zu erkennen Zugriff auf geografisch eingeschränkte Inhalte
Mobile-Proxys Echte mobile IP-Adressen, sehr schwer zu erkennen Zugriff auf mobile Dienste, Vermeidung von IP-Blockierungen
```