Update changes
Dieser Commit ist enthalten in:
@ -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", []))
|
||||
}
|
||||
}
|
||||
In neuem Issue referenzieren
Einen Benutzer sperren