Files
AccountForger-neuerUpload/views/tabs/facebook_generator_tab.py
Claude Project Manager 3101e41451 Problem bei X gelöst
2025-08-12 00:38:23 +02:00

340 Zeilen
12 KiB
Python

"""
Facebook-spezifischer Generator-Tab mit Geschlechtsauswahl.
"""
import logging
import random
from PyQt5.QtWidgets import (
QWidget, QVBoxLayout, QHBoxLayout, QGridLayout,
QLabel, QLineEdit, QSpinBox, QPushButton,
QGroupBox, QRadioButton, QButtonGroup, QProgressBar
)
from PyQt5.QtCore import pyqtSignal, Qt
logger = logging.getLogger("facebook_generator_tab")
class FacebookGeneratorTab(QWidget):
"""
Facebook-spezifischer Generator-Tab mit Geschlechtsauswahl.
"""
# Signale
start_requested = pyqtSignal(dict)
stop_requested = pyqtSignal()
account_created = pyqtSignal(str, dict) # (platform, account_data)
def __init__(self, platform_name, language_manager=None):
super().__init__()
self.platform_name = platform_name
self.language_manager = language_manager
self.init_ui()
if self.language_manager:
self.language_manager.language_changed.connect(self.update_texts)
self.update_texts()
def init_ui(self):
"""Initialisiert die UI mit Facebook-spezifischen Feldern."""
layout = QVBoxLayout(self)
layout.setContentsMargins(20, 20, 20, 20)
layout.setSpacing(20)
# Formular-Gruppe
self.form_group = QGroupBox("Account-Informationen")
grid_layout = QGridLayout()
grid_layout.setHorizontalSpacing(15)
grid_layout.setVerticalSpacing(10)
self.form_group.setLayout(grid_layout)
# Zeile 0: Vorname und Nachname
self.first_name_label = QLabel("Vorname:")
self.first_name_input = QLineEdit()
self.first_name_input.setPlaceholderText("Max")
self.last_name_label = QLabel("Nachname:")
self.last_name_input = QLineEdit()
self.last_name_input.setPlaceholderText("Mustermann")
grid_layout.addWidget(self.first_name_label, 0, 0)
grid_layout.addWidget(self.first_name_input, 0, 1)
grid_layout.addWidget(self.last_name_label, 0, 2)
grid_layout.addWidget(self.last_name_input, 0, 3)
# Zeile 1: Alter
self.age_label = QLabel("Alter:")
self.age_input = QLineEdit()
self.age_input.setMaximumWidth(100)
grid_layout.addWidget(self.age_label, 1, 0)
grid_layout.addWidget(self.age_input, 1, 1)
# Zeile 2: Geschlecht
self.gender_label = QLabel("Geschlecht:")
# Geschlechts-Widget
gender_widget = QWidget()
gender_layout = QHBoxLayout(gender_widget)
gender_layout.setContentsMargins(0, 0, 0, 0)
# Radio Buttons
self.gender_male = QRadioButton("Männlich")
self.gender_female = QRadioButton("Weiblich")
self.gender_custom = QRadioButton("Divers")
# Standard: Weiblich
self.gender_female.setChecked(True)
# Button Group für exklusive Auswahl
self.gender_group = QButtonGroup()
self.gender_group.addButton(self.gender_male, 1)
self.gender_group.addButton(self.gender_female, 2)
self.gender_group.addButton(self.gender_custom, 3)
# Füge Radio Buttons zum Layout
gender_layout.addWidget(self.gender_male)
gender_layout.addWidget(self.gender_female)
gender_layout.addWidget(self.gender_custom)
gender_layout.addStretch()
grid_layout.addWidget(self.gender_label, 2, 0)
grid_layout.addWidget(gender_widget, 2, 1, 1, 3)
layout.addWidget(self.form_group)
# Fortschrittsanzeige
self.progress_bar = QProgressBar()
self.progress_bar.setRange(0, 100)
self.progress_bar.setValue(0)
self.progress_bar.setMaximumHeight(20)
self.progress_bar.setMinimumWidth(300)
self.progress_bar.hide() # Versteckt bis zur Nutzung
layout.addWidget(self.progress_bar)
# Buttons
button_layout = QHBoxLayout()
button_layout.addStretch()
self.start_button = QPushButton("Account erstellen")
self.start_button.setMinimumWidth(150)
self.start_button.clicked.connect(self.on_start_clicked)
self.stop_button = QPushButton("Abbrechen")
self.stop_button.setMinimumWidth(150)
self.stop_button.clicked.connect(self.on_stop_clicked)
self.stop_button.setEnabled(False)
button_layout.addWidget(self.start_button)
button_layout.addWidget(self.stop_button)
layout.addLayout(button_layout)
# Spacer am Ende
layout.addStretch()
def get_params(self):
"""Sammelt alle Parameter für die Account-Erstellung."""
# Namen sammeln
first_name = self.first_name_input.text().strip()
last_name = self.last_name_input.text().strip()
full_name = f"{first_name} {last_name}"
# Alter verarbeiten
age_text = self.age_input.text().strip()
age = self.parse_age(age_text)
# Geschlecht bestimmen
gender = self.get_selected_gender()
params = {
"first_name": first_name,
"last_name": last_name,
"full_name": full_name,
"age": age,
"age_text": age_text,
"gender": gender,
"registration_method": "email",
"headless": False,
"debug": True,
"email_domain": "z5m7q9dk3ah2v1plx6ju.com"
}
logger.debug(f"Facebook Formulardaten: {params}")
return params
def parse_age(self, age_text):
"""Parst den Alters-Text und gibt ein numerisches Alter zurück."""
if not age_text:
return random.randint(18, 65)
# Versuche Range zu parsen (z.B. "18-25")
if '-' in age_text:
try:
min_age, max_age = age_text.split('-')
min_age = int(min_age.strip())
max_age = int(max_age.strip())
return random.randint(min_age, max_age)
except:
pass
# Versuche als einzelne Zahl
try:
return int(age_text)
except:
return random.randint(18, 65)
def get_selected_gender(self):
"""Gibt das ausgewählte Geschlecht zurück."""
if self.gender_group:
checked_button = self.gender_group.checkedButton()
if checked_button:
gender_id = self.gender_group.id(checked_button)
if gender_id == 1:
return 'male'
elif gender_id == 2:
return 'female'
else:
return 'custom'
# Fallback: zufällige Auswahl
return random.choice(['male', 'female'])
def validate_inputs(self, params):
"""Validiert die Eingaben."""
# Name prüfen
if not params.get('first_name') or not params.get('last_name'):
return False, "Vor- und Nachname sind erforderlich"
# Alter prüfen
age = params.get('age', 0)
if age < 13:
return False, "Mindestalter für Facebook ist 13 Jahre"
if age > 100:
return False, "Bitte geben Sie ein realistisches Alter ein"
return True, None
def on_start_clicked(self):
"""Behandelt den Start-Button-Klick."""
# Parameter sammeln
params = self.get_params()
# Validierung
valid, error_msg = self.validate_inputs(params)
if not valid:
self.show_error(error_msg)
return
# Status aktualisieren
self.set_status("Starte Account-Erstellung...")
# Signal senden
self.start_requested.emit(params)
def on_stop_clicked(self):
"""Behandelt den Stop-Button-Klick."""
self.stop_requested.emit()
def set_running(self, running: bool):
"""Setzt den Status auf 'Wird ausgeführt' oder 'Bereit'."""
self.start_button.setEnabled(not running)
self.stop_button.setEnabled(running)
if running:
self.set_status("Läuft...")
else:
self.progress_bar.setValue(0)
self.progress_bar.hide()
def set_progress(self, value: int):
"""Setzt den Fortschritt der Fortschrittsanzeige."""
if value > 0:
self.progress_bar.show()
self.progress_bar.setValue(value)
if value >= 100:
self.progress_bar.hide()
def show_error(self, message: str):
"""Zeigt eine Fehlermeldung an."""
title = "Fehler"
if self.language_manager:
title = self.language_manager.get_text(
"generator_tab.error_title", "Fehler"
)
from views.widgets.modern_message_box import show_error
show_error(self, title, message)
self.set_status("Fehler aufgetreten")
def show_success(self, message: str):
"""Zeigt eine Erfolgsmeldung an."""
title = "Erfolg"
if self.language_manager:
title = self.language_manager.get_text(
"generator_tab.success_title", "Erfolg"
)
from views.widgets.modern_message_box import show_success
show_success(self, title, message)
self.set_status("Erfolgreich abgeschlossen")
# Kompatibilitätsmethoden für bestehenden Code
def clear_log(self):
"""Kompatibilitätsmethode - tut nichts, da kein Log vorhanden."""
pass
def add_log(self, message: str):
"""Kompatibilitätsmethode - gibt an die Konsole aus."""
logger.info(message)
def store_created_account(self, result_data: dict):
"""Speichert die erstellten Account-Daten."""
if "account_data" in result_data:
self.account_created.emit(self.platform_name, result_data["account_data"])
def set_status(self, message):
"""Setzt den Status-Text."""
# Status-Label wurde entfernt - Log to console for debugging
logger.info(f"Status: {message}")
def update_texts(self):
"""Aktualisiert die Texte nach Sprachwechsel."""
if not self.language_manager:
return
# Labels
self.first_name_label.setText(
self.language_manager.get_text("generator.first_name", "Vorname") + ":"
)
self.last_name_label.setText(
self.language_manager.get_text("generator.last_name", "Nachname") + ":"
)
self.age_label.setText(
self.language_manager.get_text("generator.age", "Alter") + ":"
)
self.gender_label.setText(
self.language_manager.get_text("generator.gender", "Geschlecht") + ":"
)
# Radio Buttons
self.gender_male.setText(
self.language_manager.get_text("generator.gender_male", "Männlich")
)
self.gender_female.setText(
self.language_manager.get_text("generator.gender_female", "Weiblich")
)
self.gender_custom.setText(
self.language_manager.get_text("generator.gender_custom", "Divers")
)
# Buttons
self.start_button.setText(
self.language_manager.get_text("buttons.create", "Account erstellen")
)
self.stop_button.setText(
self.language_manager.get_text("buttons.cancel", "Abbrechen")
)
# GroupBox
self.form_group.setTitle(
self.language_manager.get_text("generator_tab.form_title", "Account-Informationen")
)