128 Zeilen
4.8 KiB
Python
128 Zeilen
4.8 KiB
Python
# browser/playwright_extensions.py
|
|
|
|
"""
|
|
Erweiterungen für den PlaywrightManager - Fügt zusätzliche Funktionalität hinzu
|
|
"""
|
|
|
|
import logging
|
|
from typing import Dict, Any, Optional
|
|
from browser.fingerprint_protection import FingerprintProtection
|
|
|
|
logger = logging.getLogger("playwright_extensions")
|
|
|
|
class PlaywrightExtensions:
|
|
"""
|
|
Erweiterungsklasse für den PlaywrightManager.
|
|
Bietet zusätzliche Funktionalität, ohne die Hauptklasse zu verändern.
|
|
"""
|
|
|
|
def __init__(self, playwright_manager):
|
|
"""
|
|
Initialisiert die Erweiterungsklasse.
|
|
|
|
Args:
|
|
playwright_manager: Eine Instanz des PlaywrightManager
|
|
"""
|
|
self.playwright_manager = playwright_manager
|
|
self.fingerprint_protection = None
|
|
self.enhanced_stealth_enabled = False
|
|
|
|
def enable_enhanced_fingerprint_protection(self, config: Optional[Dict[str, Any]] = None) -> bool:
|
|
"""
|
|
Aktiviert den erweiterten Fingerprint-Schutz.
|
|
|
|
Args:
|
|
config: Optionale Konfiguration für den Fingerprint-Schutz
|
|
|
|
Returns:
|
|
bool: True bei Erfolg, False bei Fehler
|
|
"""
|
|
try:
|
|
# Sicherstellen, dass der Browser gestartet wurde
|
|
if not hasattr(self.playwright_manager, 'context') or self.playwright_manager.context is None:
|
|
logger.warning("Browser muss zuerst gestartet werden, bevor der Fingerprint-Schutz aktiviert werden kann")
|
|
return False
|
|
|
|
# Basis-Stealth-Konfiguration aus dem PlaywrightManager verwenden
|
|
stealth_config = getattr(self.playwright_manager, 'stealth_config', {})
|
|
|
|
# Mit der benutzerdefinierten Konfiguration erweitern, falls vorhanden
|
|
if config:
|
|
stealth_config.update(config)
|
|
|
|
# Fingerprint-Schutz initialisieren
|
|
self.fingerprint_protection = FingerprintProtection(
|
|
context=self.playwright_manager.context,
|
|
stealth_config=stealth_config
|
|
)
|
|
|
|
# Schutzmaßnahmen auf den Kontext anwenden
|
|
self.fingerprint_protection.apply_to_context()
|
|
|
|
# Status aktualisieren
|
|
self.enhanced_stealth_enabled = True
|
|
|
|
logger.info("Erweiterter Fingerprint-Schutz aktiviert")
|
|
return True
|
|
|
|
except Exception as e:
|
|
logger.error(f"Fehler beim Aktivieren des erweiterten Fingerprint-Schutzes: {e}")
|
|
return False
|
|
|
|
def rotate_fingerprint(self, noise_level: Optional[float] = None) -> bool:
|
|
"""
|
|
Rotiert den Browser-Fingerprint.
|
|
|
|
Args:
|
|
noise_level: Optionales neues Rauschniveau (0.0-1.0)
|
|
|
|
Returns:
|
|
bool: True bei Erfolg, False bei Fehler
|
|
"""
|
|
if not self.enhanced_stealth_enabled or self.fingerprint_protection is None:
|
|
logger.warning("Erweiterter Fingerprint-Schutz ist nicht aktiviert")
|
|
return False
|
|
|
|
return self.fingerprint_protection.rotate_fingerprint(noise_level)
|
|
|
|
def get_fingerprint_status(self) -> Dict[str, Any]:
|
|
"""
|
|
Gibt den aktuellen Status des Fingerprint-Schutzes zurück.
|
|
|
|
Returns:
|
|
Dict[str, Any]: Status des Fingerprint-Schutzes
|
|
"""
|
|
if not self.enhanced_stealth_enabled or self.fingerprint_protection is None:
|
|
return {"active": False, "message": "Erweiterter Fingerprint-Schutz ist nicht aktiviert"}
|
|
|
|
return self.fingerprint_protection.get_fingerprint_status()
|
|
|
|
def hook_into_playwright_manager(self) -> None:
|
|
"""
|
|
Hängt die Erweiterungsmethoden an den PlaywrightManager.
|
|
"""
|
|
if not self.playwright_manager:
|
|
logger.error("Kein PlaywrightManager zum Anhängen der Erweiterungen")
|
|
return
|
|
|
|
# Originalstart-Methode speichern
|
|
original_start = self.playwright_manager.start
|
|
|
|
# Die start-Methode überschreiben, um den Fingerprint-Schutz automatisch zu aktivieren
|
|
def enhanced_start(*args, **kwargs):
|
|
result = original_start(*args, **kwargs)
|
|
|
|
# Wenn start erfolgreich war und erweiterter Schutz aktiviert ist,
|
|
# wenden wir den Fingerprint-Schutz auf den neuen Kontext an
|
|
if result and self.enhanced_stealth_enabled and self.fingerprint_protection:
|
|
self.fingerprint_protection.set_context(self.playwright_manager.context)
|
|
self.fingerprint_protection.apply_to_context()
|
|
|
|
return result
|
|
|
|
# Methoden dynamisch zum PlaywrightManager hinzufügen
|
|
self.playwright_manager.enable_enhanced_fingerprint_protection = self.enable_enhanced_fingerprint_protection
|
|
self.playwright_manager.rotate_fingerprint = self.rotate_fingerprint
|
|
self.playwright_manager.get_fingerprint_status = self.get_fingerprint_status
|
|
self.playwright_manager.start = enhanced_start
|