Problem bei X gelöst
Dieser Commit ist enthalten in:
@ -121,8 +121,15 @@ class MainController:
|
||||
gmail_controller.session_controller = self.session_controller
|
||||
self.platform_controllers["gmail"] = gmail_controller
|
||||
|
||||
# Hier können in Zukunft weitere Controller hinzugefügt werden:
|
||||
# self.platform_controllers["facebook"] = FacebookController(...)
|
||||
# Facebook Controller hinzufügen
|
||||
from controllers.platform_controllers.facebook_controller import FacebookController
|
||||
facebook_controller = FacebookController(
|
||||
self.db_manager,
|
||||
self.proxy_rotator,
|
||||
self.email_handler,
|
||||
self.language_manager
|
||||
)
|
||||
self.platform_controllers["facebook"] = facebook_controller
|
||||
|
||||
# Signals verbinden
|
||||
self.connect_signals()
|
||||
|
||||
233
controllers/platform_controllers/facebook_controller.py
Normale Datei
233
controllers/platform_controllers/facebook_controller.py
Normale Datei
@ -0,0 +1,233 @@
|
||||
"""
|
||||
Controller für Facebook-spezifische Funktionalität.
|
||||
Mit Fingerprint-Protection und Anti-Bot Features.
|
||||
"""
|
||||
|
||||
import logging
|
||||
import time
|
||||
import random
|
||||
from PyQt5.QtCore import QThread, pyqtSignal
|
||||
from typing import Dict, Any
|
||||
|
||||
from controllers.platform_controllers.base_controller import BasePlatformController
|
||||
from controllers.platform_controllers.base_worker_thread import BaseAccountCreationWorkerThread
|
||||
from views.tabs.facebook_generator_tab import FacebookGeneratorTab
|
||||
|
||||
from social_networks.facebook.facebook_automation import FacebookAutomation
|
||||
from utils.birthday_generator import BirthdayGenerator
|
||||
from utils.logger import setup_logger
|
||||
|
||||
logger = setup_logger("facebook_controller")
|
||||
|
||||
class FacebookWorkerThread(BaseAccountCreationWorkerThread):
|
||||
"""Worker-Thread für die Facebook-Account-Erstellung."""
|
||||
|
||||
def __init__(self, params):
|
||||
super().__init__(params, "Facebook")
|
||||
self.birthday_generator = BirthdayGenerator()
|
||||
|
||||
def get_automation_class(self):
|
||||
"""Gibt die Facebook Automation Klasse zurück"""
|
||||
return FacebookAutomation
|
||||
|
||||
def get_error_interpretations(self) -> Dict[str, str]:
|
||||
"""Facebook-spezifische Fehlerinterpretationen"""
|
||||
return {
|
||||
"email already in use": "Diese E-Mail-Adresse wird bereits verwendet",
|
||||
"phone number required": "Telefonnummer erforderlich",
|
||||
"invalid birth date": "Ungültiges Geburtsdatum",
|
||||
"account suspended": "Account wurde gesperrt",
|
||||
"verification required": "Verifizierung erforderlich"
|
||||
}
|
||||
|
||||
def run(self):
|
||||
"""Führt die Account-Erstellung aus."""
|
||||
try:
|
||||
self.log_signal.emit("Facebook-Account-Erstellung gestartet...")
|
||||
self.progress_signal.emit(10)
|
||||
|
||||
# Facebook-Automation initialisieren (mit Anti-Bot Features wie Instagram)
|
||||
automation = FacebookAutomation(
|
||||
headless=self.params.get("headless", False),
|
||||
use_proxy=self.params.get("use_proxy", False),
|
||||
proxy_type=self.params.get("proxy_type"),
|
||||
save_screenshots=True,
|
||||
debug=self.params.get("debug", False),
|
||||
email_domain=self.params.get("email_domain", "z5m7q9dk3ah2v1plx6ju.com"),
|
||||
enhanced_stealth=True, # Anti-Bot Features aktivieren
|
||||
fingerprint_noise=0.5, # Fingerprint-Verschleierung
|
||||
language="de" # Deutsche Version
|
||||
)
|
||||
|
||||
self.update_signal.emit("Browser wird vorbereitet...")
|
||||
self.progress_signal.emit(20)
|
||||
|
||||
# Namen aufteilen (falls zusammen übergeben)
|
||||
full_name = self.params.get("full_name", "")
|
||||
name_parts = full_name.split(" ", 1)
|
||||
first_name = name_parts[0] if name_parts else "Test"
|
||||
last_name = name_parts[1] if len(name_parts) > 1 else "User"
|
||||
|
||||
# Geburtsdatum aus Alter generieren
|
||||
age = self.params.get("age", random.randint(18, 65))
|
||||
birth_date_components = self.birthday_generator.generate_birthday_components("facebook", age)
|
||||
|
||||
# Geschlecht aus den Parametern oder default
|
||||
gender = self.params.get("gender", random.choice(["male", "female"]))
|
||||
logger.info(f"Geschlecht: {gender}")
|
||||
|
||||
self.log_signal.emit(f"Registriere Account für: {first_name} {last_name} (Alter: {age})")
|
||||
|
||||
# Account registrieren
|
||||
result = automation.register_account(
|
||||
first_name=first_name,
|
||||
last_name=last_name,
|
||||
birth_date=birth_date_components,
|
||||
gender=gender,
|
||||
email=self.params.get("email"), # Wird generiert wenn nicht vorhanden
|
||||
phone_number=self.params.get("phone_number"),
|
||||
password=self.params.get("password"), # Wird generiert wenn nicht vorhanden
|
||||
**self.params.get("additional_params", {})
|
||||
)
|
||||
|
||||
self.progress_signal.emit(100)
|
||||
|
||||
if result["success"]:
|
||||
self.log_signal.emit("Account erfolgreich erstellt!")
|
||||
self.finished_signal.emit(result)
|
||||
else:
|
||||
error_msg = result.get("error", "Unbekannter Fehler")
|
||||
self.log_signal.emit(f"Fehler bei der Account-Erstellung: {error_msg}")
|
||||
self.error_signal.emit(error_msg)
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Fehler im Worker-Thread: {e}")
|
||||
self.log_signal.emit(f"Schwerwiegender Fehler: {str(e)}")
|
||||
self.error_signal.emit(str(e))
|
||||
finally:
|
||||
self.running = False
|
||||
|
||||
class FacebookController(BasePlatformController):
|
||||
"""Controller für die Facebook-Plattform."""
|
||||
|
||||
def __init__(self, db_manager=None, proxy_rotator=None, email_handler=None, language_manager=None):
|
||||
super().__init__("Facebook", db_manager, proxy_rotator, email_handler, language_manager)
|
||||
self.worker_thread = None
|
||||
logger.info("Facebook Controller initialisiert")
|
||||
|
||||
def get_generator_tab(self):
|
||||
"""
|
||||
Erstellt und konfiguriert den Generator-Tab für Facebook.
|
||||
|
||||
Returns:
|
||||
FacebookGeneratorTab: Konfigurierter Tab für Facebook mit Geschlechtsauswahl
|
||||
"""
|
||||
# Erstelle Facebook-spezifischen Generator-Tab mit Geschlechtsfeld
|
||||
generator_tab = FacebookGeneratorTab(
|
||||
"Facebook",
|
||||
self.language_manager
|
||||
)
|
||||
|
||||
# Facebook-spezifische Konfiguration
|
||||
self._configure_facebook_fields(generator_tab)
|
||||
|
||||
# Verbinde Signale
|
||||
generator_tab.start_requested.connect(self.handle_generation_request)
|
||||
generator_tab.stop_requested.connect(self.stop_generation)
|
||||
|
||||
return generator_tab
|
||||
|
||||
def _configure_facebook_fields(self, generator_tab):
|
||||
"""
|
||||
Konfiguriert Facebook-spezifische Felder im Generator-Tab.
|
||||
|
||||
Args:
|
||||
generator_tab: Der zu konfigurierende Tab
|
||||
"""
|
||||
# Facebook-spezifische Konfiguration
|
||||
# Der FacebookGeneratorTab hat bereits das Geschlechtsfeld integriert
|
||||
# Vor- und Nachnamen werden im Worker-Thread aus full_name extrahiert
|
||||
|
||||
logger.debug("Facebook-spezifische Felder konfiguriert (inkl. Geschlechtsauswahl)")
|
||||
|
||||
def handle_generation_request(self, params: Dict[str, Any]):
|
||||
"""
|
||||
Behandelt eine Anfrage zur Account-Generierung.
|
||||
|
||||
Args:
|
||||
params: Parameter für die Generierung
|
||||
"""
|
||||
logger.info(f"Facebook-Account-Generierung angefordert: {params}")
|
||||
|
||||
# Prüfe ob bereits ein Thread läuft
|
||||
if self.worker_thread and self.worker_thread.isRunning():
|
||||
logger.warning("Ein Account wird bereits erstellt")
|
||||
return
|
||||
|
||||
# Facebook-spezifische Parameter hinzufügen
|
||||
params["platform"] = "facebook"
|
||||
|
||||
# Starte Worker-Thread
|
||||
self.worker_thread = FacebookWorkerThread(params)
|
||||
|
||||
# Verbinde Signale
|
||||
self.worker_thread.update_signal.connect(
|
||||
lambda msg: self.status_update.emit(msg)
|
||||
)
|
||||
self.worker_thread.log_signal.connect(
|
||||
lambda msg: self.log_message.emit(msg)
|
||||
)
|
||||
self.worker_thread.progress_signal.connect(
|
||||
lambda val: self.progress_update.emit(val)
|
||||
)
|
||||
self.worker_thread.finished_signal.connect(
|
||||
self._handle_generation_success
|
||||
)
|
||||
self.worker_thread.error_signal.connect(
|
||||
self._handle_generation_error
|
||||
)
|
||||
|
||||
# Starte Thread
|
||||
self.worker_thread.start()
|
||||
self.generation_started.emit()
|
||||
|
||||
def _handle_generation_success(self, result: Dict[str, Any]):
|
||||
"""
|
||||
Behandelt erfolgreiche Account-Erstellung.
|
||||
|
||||
Args:
|
||||
result: Ergebnis der Erstellung
|
||||
"""
|
||||
logger.info("Facebook-Account erfolgreich erstellt")
|
||||
|
||||
# Speichere Account in Datenbank
|
||||
if self.db_manager and result.get("account_data"):
|
||||
account_data = result["account_data"]
|
||||
account_data["platform"] = "facebook"
|
||||
|
||||
# Speichere in DB
|
||||
# TODO: DB-Integration
|
||||
|
||||
self.generation_completed.emit(result)
|
||||
|
||||
def _handle_generation_error(self, error_msg: str):
|
||||
"""
|
||||
Behandelt Fehler bei der Account-Erstellung.
|
||||
|
||||
Args:
|
||||
error_msg: Fehlermeldung
|
||||
"""
|
||||
logger.error(f"Fehler bei Facebook-Account-Erstellung: {error_msg}")
|
||||
self.generation_failed.emit(error_msg)
|
||||
|
||||
def stop_generation(self):
|
||||
"""Stoppt die laufende Account-Generierung."""
|
||||
if self.worker_thread and self.worker_thread.isRunning():
|
||||
logger.info("Stoppe Facebook-Account-Generierung")
|
||||
self.worker_thread.stop()
|
||||
self.worker_thread.wait()
|
||||
|
||||
def cleanup(self):
|
||||
"""Räumt Ressourcen auf."""
|
||||
self.stop_generation()
|
||||
logger.info("Facebook Controller aufgeräumt")
|
||||
In neuem Issue referenzieren
Einen Benutzer sperren