Dieser Commit ist enthalten in:
Claude Project Manager
2026-01-18 18:15:34 +01:00
Ursprung 4e82d5ef8f
Commit a25a26a01a
47 geänderte Dateien mit 4756 neuen und 2956 gelöschten Zeilen

Datei anzeigen

@ -383,19 +383,19 @@ class ProxyRotator:
def format_proxy_for_playwright(self, proxy: str) -> Dict[str, str]:
"""
Formatiert einen Proxy-String für die Verwendung mit Playwright.
Args:
proxy: Proxy-String im Format host:port:username:password
Returns:
Dictionary mit Playwright-Proxy-Konfiguration
"""
parts = proxy.split(":")
if len(parts) >= 4:
# Format: host:port:username:password
host, port, username, password = parts[:4]
return {
"server": f"{host}:{port}",
"username": username,
@ -404,10 +404,110 @@ class ProxyRotator:
elif len(parts) >= 2:
# Format: host:port
host, port = parts[:2]
return {
"server": f"{host}:{port}"
}
else:
logger.warning(f"Ungültiges Proxy-Format: {self.mask_proxy_credentials(proxy)}")
return {}
return {}
# ==========================================================================
# ANTI-DETECTION: Erzwungene Proxy-Rotation für Account-Registrierung
# ==========================================================================
def force_rotation(self, proxy_type: str = None) -> Optional[Dict[str, str]]:
"""
Erzwingt eine sofortige Proxy-Rotation.
Diese Methode sollte VOR jeder neuen Account-Registrierung aufgerufen
werden, um sicherzustellen, dass ein frischer Proxy verwendet wird.
Dies verhindert, dass mehrere Accounts von derselben IP erstellt werden.
Args:
proxy_type: Proxy-Typ ("ipv4", "ipv6", "mobile") oder None für zufällig
Returns:
Neue Proxy-Konfiguration (Dict) oder None wenn kein Proxy verfügbar
"""
logger.info("ERZWINGE Proxy-Rotation für neue Registrierung")
# Vorherigen Proxy vergessen
old_proxy = self.current_proxy
self.current_proxy = None
self.last_rotation_time = 0
# Neuen Proxy holen
new_proxy = self.get_proxy(proxy_type)
if new_proxy:
self.current_proxy = new_proxy.get('server', '')
self.last_rotation_time = time.time()
# Log mit maskierten Credentials
masked_server = self.mask_proxy_credentials(self.current_proxy)
logger.info(f"Proxy rotiert: {masked_server}")
if old_proxy:
logger.debug(f"Vorheriger Proxy: {self.mask_proxy_credentials(old_proxy)}")
else:
logger.warning("Kein Proxy verfügbar für erzwungene Rotation")
return new_proxy
def get_proxy_for_registration(self, proxy_type: str = None,
force_new: bool = True) -> Optional[Dict[str, str]]:
"""
Holt einen Proxy speziell für Account-Registrierung.
Diese Methode ist ein Wrapper um force_rotation() mit zusätzlicher
Logik für Registrierungen.
Args:
proxy_type: Gewünschter Proxy-Typ oder None für zufällig
force_new: Ob ein neuer Proxy erzwungen werden soll (Standard: True)
Returns:
Proxy-Konfiguration für Playwright oder None
"""
if force_new:
proxy_config = self.force_rotation(proxy_type)
else:
proxy_config = self.get_proxy(proxy_type)
if not proxy_config:
logger.warning("Kein Proxy für Registrierung verfügbar - Registrierung ohne Proxy")
return None
logger.info(f"Proxy für Registrierung bereit: {self.mask_proxy_credentials(proxy_config.get('server', ''))}")
return proxy_config
def should_rotate_for_registration(self) -> bool:
"""
Prüft, ob eine Proxy-Rotation vor der nächsten Registrierung empfohlen wird.
Returns:
True wenn Rotation empfohlen, False sonst
"""
# Immer True - jede Registrierung sollte einen neuen Proxy verwenden
# Dies ist die sicherste Anti-Detection-Strategie
return True
def get_rotation_stats(self) -> Dict[str, Any]:
"""
Gibt Statistiken über Proxy-Rotationen zurück.
Returns:
Dictionary mit Rotations-Statistiken
"""
return {
"current_proxy": self.mask_proxy_credentials(self.current_proxy) if self.current_proxy else None,
"last_rotation_time": self.last_rotation_time,
"time_since_last_rotation": time.time() - self.last_rotation_time if self.last_rotation_time > 0 else None,
"rotation_interval": self.config.get("rotation_interval", 300),
"available_proxies": {
"ipv4": len(self.config.get("ipv4", [])),
"ipv6": len(self.config.get("ipv6", [])),
"mobile": len(self.config.get("mobile", []))
}
}