Facebook - Workflow geht aber Popup nicht da mit Browser nicht anbtouchen
Dieser Commit ist enthalten in:
@ -13,7 +13,6 @@ from typing import Dict, List, Any, Optional, Tuple
|
||||
|
||||
from browser.playwright_manager import PlaywrightManager
|
||||
from browser.playwright_extensions import PlaywrightExtensions
|
||||
from browser.fingerprint_protection import FingerprintProtection
|
||||
from social_networks.base_automation import BaseAutomation
|
||||
from infrastructure.services.advanced_fingerprint_service import AdvancedFingerprintService
|
||||
from infrastructure.repositories.fingerprint_repository import FingerprintRepository
|
||||
@ -85,6 +84,9 @@ class FacebookAutomation(BaseAutomation):
|
||||
window_position=window_position
|
||||
)
|
||||
|
||||
# Zusätzliche Initialisierungen für Facebook
|
||||
self.window_position = window_position
|
||||
|
||||
# Facebook-spezifische Einstellungen
|
||||
self.language = language
|
||||
self.base_url = f"https://www.facebook.com/?locale={language}_DE" if language == "de" else "https://www.facebook.com"
|
||||
@ -118,33 +120,37 @@ class FacebookAutomation(BaseAutomation):
|
||||
|
||||
def _initialize_browser(self) -> bool:
|
||||
"""
|
||||
Initialisiert den Browser mit Anti-Bot Features.
|
||||
Identisch zu Instagram für konsistente Fingerprint-Protection.
|
||||
Initialisiert den Browser mit Facebook-spezifischen Einstellungen.
|
||||
Folgt dem Instagram-Pattern für saubere Implementierung.
|
||||
|
||||
Returns:
|
||||
bool: True bei Erfolg, False bei Fehler
|
||||
"""
|
||||
try:
|
||||
self._emit_customer_log("🔄 Sichere Verbindung wird aufgebaut...")
|
||||
|
||||
# Proxy-Konfiguration, falls aktiviert
|
||||
proxy_config = None
|
||||
if self.use_proxy:
|
||||
self._emit_customer_log("🌐 Optimale Verbindung wird ausgewählt...")
|
||||
proxy_config = self.proxy_rotator.get_proxy(self.proxy_type)
|
||||
if not proxy_config:
|
||||
logger.warning(f"Kein Proxy vom Typ '{self.proxy_type}' verfügbar, verwende direkten Zugriff")
|
||||
|
||||
# Browser initialisieren
|
||||
# Browser initialisieren (wie Instagram - direkt, ohne super())
|
||||
self.browser = PlaywrightManager(
|
||||
headless=self.headless,
|
||||
proxy=proxy_config,
|
||||
browser_type="chromium",
|
||||
screenshots_dir=self.screenshots_dir,
|
||||
slowmo=self.slowmo
|
||||
slowmo=self.slowmo,
|
||||
window_position=self.window_position
|
||||
)
|
||||
|
||||
# Browser starten
|
||||
self.browser.start()
|
||||
|
||||
# Erweiterten Fingerprint-Schutz aktivieren (wie bei Instagram)
|
||||
# Erweiterten Fingerprint-Schutz aktivieren, wenn gewünscht
|
||||
if self.enhanced_stealth:
|
||||
# Erstelle Extensions-Objekt
|
||||
extensions = PlaywrightExtensions(self.browser)
|
||||
@ -152,39 +158,55 @@ class FacebookAutomation(BaseAutomation):
|
||||
# Methoden anhängen
|
||||
extensions.hook_into_playwright_manager()
|
||||
|
||||
# Fingerprint-Schutz aktivieren
|
||||
# Fingerprint-Schutz aktivieren mit angepasster Konfiguration
|
||||
if self.provided_fingerprint:
|
||||
# Nutze den bereitgestellten Fingerprint
|
||||
logger.info("Verwende bereitgestellten Fingerprint für Account-Erstellung")
|
||||
# Konvertiere Dict zu BrowserFingerprint wenn nötig
|
||||
if isinstance(self.provided_fingerprint, dict):
|
||||
from infrastructure.models.browser_fingerprint import BrowserFingerprint
|
||||
from domain.entities.browser_fingerprint import BrowserFingerprint
|
||||
fingerprint_obj = BrowserFingerprint.from_dict(self.provided_fingerprint)
|
||||
else:
|
||||
fingerprint_obj = self.provided_fingerprint
|
||||
|
||||
|
||||
# Wende Fingerprint über FingerprintProtection an
|
||||
from browser.fingerprint_protection import FingerprintProtection
|
||||
protection = FingerprintProtection(
|
||||
context=self.browser.context,
|
||||
fingerprint_config=fingerprint_obj
|
||||
)
|
||||
protection.apply_to_context(self.browser.context)
|
||||
logger.info(f"Fingerprint {fingerprint_obj.fingerprint_id} angewendet")
|
||||
self.account_fingerprint = fingerprint_obj
|
||||
fingerprint_config = fingerprint_obj.to_config()
|
||||
else:
|
||||
# Generiere neuen Fingerprint
|
||||
self.account_fingerprint = self.fingerprint_service.generate_fingerprint("facebook")
|
||||
fingerprint_config = self.account_fingerprint.to_config()
|
||||
|
||||
# Fingerprint-Protection mit Noise-Level
|
||||
protection = FingerprintProtection(
|
||||
noise_level=self.fingerprint_noise,
|
||||
fingerprint_config=fingerprint_config
|
||||
)
|
||||
protection.apply(self.browser.page)
|
||||
|
||||
logger.info(f"Fingerprint-Schutz aktiviert (Noise-Level: {self.fingerprint_noise})")
|
||||
# Fallback: Zufällige Fingerprint-Konfiguration
|
||||
fingerprint_config = {
|
||||
"noise_level": self.fingerprint_noise,
|
||||
"canvas_noise": True,
|
||||
"audio_noise": True,
|
||||
"webgl_noise": True,
|
||||
"hardware_concurrency": random.choice([4, 6, 8]),
|
||||
"device_memory": random.choice([4, 8]),
|
||||
"language": self.language,
|
||||
"timezone_id": "Europe/Berlin"
|
||||
}
|
||||
|
||||
success = self.browser.enable_enhanced_fingerprint_protection(fingerprint_config)
|
||||
if success:
|
||||
logger.info("Erweiterter Fingerprint-Schutz erfolgreich aktiviert")
|
||||
else:
|
||||
logger.warning("Erweiterter Fingerprint-Schutz konnte nicht aktiviert werden")
|
||||
|
||||
# Facebook-spezifische Browser-Einstellungen
|
||||
self._apply_facebook_specific_settings()
|
||||
|
||||
self._emit_customer_log("✅ Verbindung erfolgreich hergestellt")
|
||||
logger.info("Browser erfolgreich initialisiert")
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Fehler bei der Browser-Initialisierung: {e}")
|
||||
self.status["error"] = f"Browser-Initialisierungsfehler: {str(e)}"
|
||||
return False
|
||||
|
||||
def _apply_facebook_specific_settings(self):
|
||||
@ -257,9 +279,10 @@ class FacebookAutomation(BaseAutomation):
|
||||
|
||||
# Passwort generieren wenn nicht vorhanden
|
||||
if not password:
|
||||
# Facebook-spezifische Passwort-Policy
|
||||
password = self.password_generator.generate_password(
|
||||
length=random.randint(12, 16),
|
||||
include_special=True
|
||||
platform="facebook", # Plattform-spezifische Regeln
|
||||
length=random.randint(12, 16) # Überschreibt default-Länge
|
||||
)
|
||||
logger.info("Passwort generiert")
|
||||
|
||||
@ -388,6 +411,82 @@ class FacebookAutomation(BaseAutomation):
|
||||
# Browser offen lassen für User-Kontrolle
|
||||
logger.info("Login abgeschlossen - Browser bleibt offen")
|
||||
|
||||
def verify_account(self, verification_code: str, **kwargs) -> Dict[str, Any]:
|
||||
"""
|
||||
Verifiziert einen Facebook-Account mit einem Bestätigungscode.
|
||||
Implementiert die abstrakte Methode aus BaseAutomation.
|
||||
|
||||
Args:
|
||||
verification_code: Der Bestätigungscode (5-stellig für Facebook)
|
||||
**kwargs: Weitere optionale Parameter
|
||||
|
||||
Returns:
|
||||
Dict[str, Any]: Ergebnis der Verifizierung mit Status
|
||||
"""
|
||||
logger.info(f"Starte Facebook-Account-Verifizierung mit Code: {verification_code}")
|
||||
|
||||
try:
|
||||
# Browser initialisieren falls noch nicht geschehen
|
||||
if not self.browser or not hasattr(self.browser, 'page'):
|
||||
if not self._initialize_browser():
|
||||
return {"success": False, "error": "Browser konnte nicht initialisiert werden"}
|
||||
|
||||
# Delegiere an Verification-Klasse
|
||||
# Die eigentliche Verifizierung wird bereits in registration.py gehandhabt
|
||||
# Diese Methode ist für standalone Verifizierung
|
||||
|
||||
# Prüfe ob wir auf der Verifizierungsseite sind
|
||||
current_url = self.browser.page.url if self.browser else ""
|
||||
if "confirmemail" not in current_url:
|
||||
logger.warning("Nicht auf der Verifizierungsseite - navigiere dorthin")
|
||||
# Könnte hier zur Verifizierungsseite navigieren wenn nötig
|
||||
|
||||
# Nutze die _enter_verification_code Methode aus registration
|
||||
from .facebook_registration import FacebookRegistration
|
||||
temp_registration = FacebookRegistration(self)
|
||||
success = temp_registration._enter_verification_code(verification_code)
|
||||
|
||||
if success:
|
||||
logger.info("Verifizierung erfolgreich abgeschlossen")
|
||||
result = {
|
||||
"success": True,
|
||||
"stage": "verified",
|
||||
"message": "Account erfolgreich verifiziert"
|
||||
}
|
||||
else:
|
||||
logger.error("Verifizierung fehlgeschlagen")
|
||||
result = {
|
||||
"success": False,
|
||||
"error": "Verifizierungscode konnte nicht bestätigt werden",
|
||||
"stage": "verification_failed"
|
||||
}
|
||||
|
||||
# Screenshot
|
||||
self._take_screenshot(f"verification_result_{int(time.time())}")
|
||||
|
||||
# Status aktualisieren
|
||||
self.status.update(result)
|
||||
|
||||
return result
|
||||
|
||||
except Exception as e:
|
||||
error_msg = f"Unerwarteter Fehler bei der Verifizierung: {str(e)}"
|
||||
logger.error(error_msg, exc_info=True)
|
||||
|
||||
# Fehler-Screenshot
|
||||
self._take_screenshot(f"verification_error_{int(time.time())}")
|
||||
|
||||
self.status.update({
|
||||
"success": False,
|
||||
"error": error_msg,
|
||||
"stage": "error"
|
||||
})
|
||||
|
||||
return self.status
|
||||
finally:
|
||||
# Browser offen lassen für weitere Aktionen
|
||||
logger.info("Verifizierung abgeschlossen - Browser bleibt offen")
|
||||
|
||||
def _initialize_browser_with_fingerprint(self, account_id: str) -> bool:
|
||||
"""
|
||||
Initialisiert den Browser mit einem Account-spezifischen Fingerprint.
|
||||
|
||||
In neuem Issue referenzieren
Einen Benutzer sperren