Files
AccountForger-neuerUpload/social_networks/tiktok/tiktok_registration_final.py
Claude Project Manager 04585e95b6 Initial commit
2025-08-01 23:50:28 +02:00

115 Zeilen
29 KiB
Python

# social_networks/tiktok/tiktok_registration_final.py
"""
TikTok-Registrierung - FINALE OPTIMIERTE IMPLEMENTIERUNG
PRODUKTIONSBEREIT mit korrekter Workflow-Reihenfolge und robusten Selektoren.
KORRIGIERTER WORKFLOW:
1. E-Mail eingeben
2. Code senden Button klicken
3. Code empfangen und eingeben
4. Passwort eingeben
5. Dummy-Input-Trick (beliebige Zahl ins Code-Feld)
6. Weiter Button klicken
FEATURES:
- Robuste Multi-Level-Selektor-Strategien
- Exponential backoff für E-Mail-Empfang
- Umfassendes Error-Handling mit Retry-Mechanismen
- Anti-Detection durch menschliches Verhalten
- Zukunftssicher durch modulare Architektur
"""
import time
import random
import re
from typing import Dict, List, Any, Optional, Tuple
from .tiktok_selectors import TikTokSelectors
from .tiktok_workflow import TikTokWorkflow
from utils.logger import setup_logger
# Konfiguriere Logger
logger = setup_logger("tiktok_registration")
class TikTokRegistrationOptimized:
"""
FINALE optimierte Klasse für die Registrierung von TikTok-Konten.
Diese Implementierung ist zukunftssicher und verwendet robuste
Multi-Level-Selektoren sowie optimierte Workflows.
"""
def __init__(self, automation):
"""
Initialisiert die optimierte TikTok-Registrierung.
Args:
automation: Referenz auf die Hauptautomatisierungsklasse
"""
self.automation = automation
self.selectors = TikTokSelectors()
self.workflow = TikTokWorkflow.get_registration_workflow()
# Konfiguration für robustes Verhalten
self.max_retry_attempts = 3
self.base_delay = 0.5
self.max_delay = 5.0
logger.info("Optimierte TikTok-Registrierung initialisiert")
def register_account(self, full_name: str, age: int, registration_method: str = "email",
phone_number: str = None, **kwargs) -> Dict[str, Any]:
"""
Führt den vollständigen optimierten Registrierungsprozess durch.
Args:
full_name: Vollständiger Name für den Account
age: Alter des Benutzers
registration_method: "email" oder "phone"
phone_number: Telefonnummer (nur bei registration_method="phone")
**kwargs: Weitere optionale Parameter
Returns:
Dict[str, Any]: Ergebnis der Registrierung mit Status und Account-Daten
"""
# Eingabe-Validierung
validation_result = self._validate_inputs(full_name, age, registration_method, phone_number)
if not validation_result["valid"]:
return self._create_error_result(validation_result["error"], "input_validation")
# Account-Daten generieren
account_data = self._generate_account_data(full_name, age, registration_method, phone_number, **kwargs)
logger.info(f"=== STARTE OPTIMIERTEN TIKTOK-REGISTRIERUNGSPROZESS ===")
logger.info(f"Account: {account_data['username']} | Methode: {registration_method}")
try:
# Phase 1: Navigation und Setup
if not self._execute_navigation_phase():
return self._create_error_result("Navigation fehlgeschlagen", "navigation", account_data)
# Phase 2: Registrierungsformular öffnen
if not self._execute_form_opening_phase():
return self._create_error_result("Formular öffnen fehlgeschlagen", "form_opening", account_data)
# Phase 3: Geburtsdatum eingeben
self.automation._emit_customer_log("🎂 Geburtsdatum wird festgelegt...")
if not self._execute_birthday_phase(account_data["birthday"]):
return self._create_error_result("Geburtsdatum-Eingabe fehlgeschlagen", "birthday", account_data)
# Phase 4: OPTIMIERTER HAUPTWORKFLOW
self.automation._emit_customer_log("📝 Persönliche Daten werden übertragen...")
if not self._execute_main_registration_workflow(account_data, registration_method):
return self._create_error_result("Hauptregistrierung fehlgeschlagen", "main_workflow", account_data)
# Phase 5: Benutzername und Finalisierung
self.automation._emit_customer_log("👤 Benutzername wird erstellt...")
if not self._execute_finalization_phase(account_data):
return self._create_error_result("Finalisierung fehlgeschlagen", "finalization", account_data)
# Erfolgreiche Registrierung
logger.info(f"=== REGISTRIERUNG ERFOLGREICH ABGESCHLOSSEN ===")
self.automation._emit_customer_log("✅ Account erfolgreich erstellt!")
return {\n \"success\": True,\n \"stage\": \"completed\",\n \"account_data\": account_data,\n \"message\": f\"Account {account_data['username']} erfolgreich erstellt\"\n }\n \n except Exception as e:\n error_msg = f\"Unerwarteter Fehler: {str(e)}\"\n logger.error(error_msg, exc_info=True)\n return self._create_error_result(error_msg, \"exception\", account_data)\n \n def _execute_main_registration_workflow(self, account_data: Dict[str, Any], registration_method: str) -> bool:\n \"\"\"\n KERN-WORKFLOW: Führt die optimierte Registrierungssequenz aus.\n \n OPTIMIERTE REIHENFOLGE:\n 1. E-Mail/Telefon eingeben\n 2. Passwort eingeben \n 3. Code senden Button klicken\n 4. Code empfangen und eingeben\n \n Args:\n account_data: Account-Daten\n registration_method: \"email\" oder \"phone\"\n \n Returns:\n bool: True bei Erfolg, False bei Fehler\n \"\"\"\n try:\n logger.info(\"=== STARTE OPTIMIERTEN HAUPTWORKFLOW ===\")\n \n if registration_method == \"email\":\n return self._execute_email_main_workflow(account_data)\n elif registration_method == \"phone\":\n return self._execute_phone_main_workflow(account_data)\n else:\n logger.error(f\"Unbekannte Registrierungsmethode: {registration_method}\")\n return False\n \n except Exception as e:\n logger.error(f\"Fehler im Hauptworkflow: {e}\")\n return False\n \n def _execute_email_main_workflow(self, account_data: Dict[str, Any]) -> bool:\n \"\"\"\n KORRIGIERTER E-MAIL-WORKFLOW: E-Mail → Code senden → Code eingeben → Passwort → Dummy-Trick → Weiter\n \n Args:\n account_data: Account-Daten\n \n Returns:\n bool: True bei Erfolg, False bei Fehler\n \"\"\"\n try:\n logger.info(\">>> STARTE E-MAIL-WORKFLOW <<<\")\n \n # SCHRITT 1: E-Mail-Feld ausfüllen\n logger.info(\"[1/4] E-Mail-Adresse eingeben\")\n if not self._fill_email_field_robust(account_data[\"email\"]):\n logger.error(\"E-Mail-Eingabe fehlgeschlagen\")\n return False\n \n # SCHRITT 2: Passwort-Feld ausfüllen (KRITISCH: VOR Code senden!)\n logger.info(\"[2/4] Passwort eingeben (vor Code-Anforderung)\")\n if not self._fill_password_field_robust(account_data[\"password\"]):\n logger.error(\"Passwort-Eingabe fehlgeschlagen\")\n return False\n \n # SCHRITT 3: Code senden Button klicken\n logger.info(\"[3/4] Code senden Button klicken\")\n if not self._click_send_code_button_robust():\n logger.error(\"Code-senden-Button klicken fehlgeschlagen\")\n return False\n \n # SCHRITT 4: Verifizierungscode empfangen und eingeben\n logger.info(\"[4/4] Verifizierungscode empfangen und eingeben\")\n if not self._handle_email_verification_robust(account_data[\"email\"]):\n logger.error(\"E-Mail-Verifizierung fehlgeschlagen\")\n return False\n \n logger.info(\">>> E-MAIL-WORKFLOW ERFOLGREICH ABGESCHLOSSEN <<<\")\n \n # Pause für UI-Updates - Weiter-Button sollte jetzt aktiviert sein\n self.automation.human_behavior.random_delay(1.0, 2.5)\n \n return True\n \n except Exception as e:\n logger.error(f\"Fehler im E-Mail-Workflow: {e}\")\n return False\n \n def _fill_email_field_robust(self, email: str) -> bool:\n \"\"\"\n Robuste E-Mail-Feld-Ausfüllung mit Multi-Level-Selektoren.\n \n Args:\n email: E-Mail-Adresse\n \n Returns:\n bool: True bei Erfolg, False bei Fehler\n \"\"\"\n try:\n logger.debug(f\"Fülle E-Mail-Feld aus: {email}\")\n \n # Robuste Selektor-Strategie\n email_selectors = self.selectors.get_email_field_selectors()\n \n for attempt in range(self.max_retry_attempts):\n logger.debug(f\"E-Mail-Eingabe Versuch {attempt + 1}/{self.max_retry_attempts}\")\n \n # Versuche jeden Selektor\n for i, selector in enumerate(email_selectors):\n try:\n if self.automation.browser.is_element_visible(selector, timeout=2000):\n # Menschliche Eingabe\n success = self.automation.browser.fill_form_field(\n selector, email, human_typing=True\n )\n \n if success:\n logger.info(f\"E-Mail erfolgreich eingegeben mit Selektor {i+1}\")\n self._add_human_delay()\n return True\n \n except Exception as e:\n logger.debug(f\"E-Mail-Selektor {i+1} fehlgeschlagen: {e}\")\n continue\n \n # Fallback: Fuzzy-Matching\n try:\n success = self.automation.ui_helper.fill_field_fuzzy(\n [\"E-Mail-Adresse\", \"Email\", \"E-Mail\"],\n email,\n email_selectors[0]\n )\n \n if success:\n logger.info(\"E-Mail über Fuzzy-Matching eingegeben\")\n self._add_human_delay()\n return True\n \n except Exception as e:\n logger.debug(f\"Fuzzy-Matching fehlgeschlagen: {e}\")\n \n # Retry-Delay\n if attempt < self.max_retry_attempts - 1:\n delay = self.base_delay * (2 ** attempt)\n logger.debug(f\"Retry-Delay: {delay}s\")\n time.sleep(delay)\n \n logger.error(\"E-Mail-Feld konnte nicht ausgefüllt werden\")\n return False\n \n except Exception as e:\n logger.error(f\"Kritischer Fehler bei E-Mail-Eingabe: {e}\")\n return False\n \n def _fill_password_field_robust(self, password: str) -> bool:\n \"\"\"\n Robuste Passwort-Feld-Ausfüllung mit Multi-Level-Selektoren.\n \n Args:\n password: Passwort\n \n Returns:\n bool: True bei Erfolg, False bei Fehler\n \"\"\"\n try:\n logger.debug(\"Fülle Passwort-Feld aus (menschliche Eingabe)\")\n \n # Robuste Selektor-Strategie\n password_selectors = self.selectors.get_password_field_selectors()\n \n for attempt in range(self.max_retry_attempts):\n logger.debug(f\"Passwort-Eingabe Versuch {attempt + 1}/{self.max_retry_attempts}\")\n \n # Versuche jeden Selektor\n for i, selector in enumerate(password_selectors):\n try:\n if self.automation.browser.is_element_visible(selector, timeout=2000):\n # Menschliche Eingabe mit Validierung\n success = self.automation.browser.fill_form_field(\n selector, password, human_typing=True\n )\n \n if success:\n # Validiere Passwort-Eingabe\n if self._validate_password_input(selector, password):\n logger.info(f\"Passwort erfolgreich eingegeben mit Selektor {i+1}\")\n self._add_human_delay()\n return True\n else:\n logger.warning(f\"Passwort-Validierung fehlgeschlagen bei Selektor {i+1}\")\n \n except Exception as e:\n logger.debug(f\"Passwort-Selektor {i+1} fehlgeschlagen: {e}\")\n continue\n \n # Fallback: Fuzzy-Matching\n try:\n success = self.automation.ui_helper.fill_field_fuzzy(\n [\"Passwort\", \"Password\"],\n password,\n password_selectors[0]\n )\n \n if success:\n logger.info(\"Passwort über Fuzzy-Matching eingegeben\")\n self._add_human_delay()\n return True\n \n except Exception as e:\n logger.debug(f\"Passwort Fuzzy-Matching fehlgeschlagen: {e}\")\n \n # Retry-Delay\n if attempt < self.max_retry_attempts - 1:\n delay = self.base_delay * (2 ** attempt)\n logger.debug(f\"Retry-Delay: {delay}s\")\n time.sleep(delay)\n \n logger.error(\"Passwort-Feld konnte nicht ausgefüllt werden\")\n return False\n \n except Exception as e:\n logger.error(f\"Kritischer Fehler bei Passwort-Eingabe: {e}\")\n return False\n \n def _validate_password_input(self, selector: str, expected_password: str) -> bool:\n \"\"\"\n Validiert, ob das Passwort korrekt eingegeben wurde.\n \n Args:\n selector: CSS-Selektor des Passwort-Feldes\n expected_password: Erwartetes Passwort\n \n Returns:\n bool: True wenn Validierung erfolgreich, False sonst\n \"\"\"\n try:\n # Passwort-Feld-Wert abrufen (falls möglich)\n element = self.automation.browser.wait_for_selector(selector, timeout=1000)\n if element:\n actual_value = element.get_attribute(\"value\") or \"\"\n return len(actual_value) == len(expected_password)\n \n # Fallback: Längen-basierte Validierung\n return True # Optimistisch, da direkter Wert-Abruf oft nicht möglich\n \n except Exception as e:\n logger.debug(f\"Passwort-Validierung nicht möglich: {e}\")\n return True # Optimistisch\n \n def _click_send_code_button_robust(self) -> bool:\n \"\"\"\n Robustes Klicken des 'Code senden'-Buttons mit Retry-Logik.\n \n Returns:\n bool: True bei Erfolg, False bei Fehler\n \"\"\"\n try:\n logger.debug(\"Klicke 'Code senden'-Button\")\n \n # Pause vor Button-Klick\n self._add_human_delay()\n \n # Robuste Selektor-Strategie\n send_code_selectors = self.selectors.get_send_code_button_selectors()\n \n for attempt in range(self.max_retry_attempts):\n logger.debug(f\"Send-Code-Button Versuch {attempt + 1}/{self.max_retry_attempts}\")\n \n # Versuche jeden Selektor\n for i, selector in enumerate(send_code_selectors):\n try:\n if self.automation.browser.is_element_visible(selector, timeout=3000):\n # Prüfe, ob Button enabled ist\n element = self.automation.browser.wait_for_selector(selector, timeout=1000)\n if element:\n is_disabled = element.get_attribute(\"disabled\")\n aria_disabled = element.get_attribute(\"aria-disabled\")\n \n if is_disabled or aria_disabled == \"true\":\n logger.debug(f\"Button {i+1} ist disabled, versuche nächsten\")\n continue\n \n # Button klicken\n success = self.automation.browser.click_element(selector)\n if success:\n logger.info(f\"'Code senden'-Button erfolgreich geklickt mit Selektor {i+1}\")\n self._add_human_delay()\n return True\n \n except Exception as e:\n logger.debug(f\"Send-Code-Selektor {i+1} fehlgeschlagen: {e}\")\n continue\n \n # Fallback: Fuzzy-Button-Matching\n try:\n success = self.automation.ui_helper.click_button_fuzzy(\n [\"Code senden\", \"Send code\", \"Senden\"],\n send_code_selectors[0]\n )\n \n if success:\n logger.info(\"'Code senden'-Button über Fuzzy-Matching geklickt\")\n self._add_human_delay()\n return True\n \n except Exception as e:\n logger.debug(f\"Send-Code Fuzzy-Matching fehlgeschlagen: {e}\")\n \n # Retry-Delay\n if attempt < self.max_retry_attempts - 1:\n delay = self.base_delay * (2 ** attempt)\n logger.debug(f\"Retry-Delay: {delay}s\")\n time.sleep(delay)\n \n logger.error(\"'Code senden'-Button konnte nicht geklickt werden\")\n return False\n \n except Exception as e:\n logger.error(f\"Kritischer Fehler beim Send-Code-Button: {e}\")\n return False\n \n def _handle_email_verification_robust(self, email: str) -> bool:\n \"\"\"\n Robuste E-Mail-Verifizierung mit optimiertem Timing und Retry-Logik.\n \n Args:\n email: E-Mail-Adresse\n \n Returns:\n bool: True bei Erfolg, False bei Fehler\n \"\"\"\n try:\n logger.info(\"Starte robuste E-Mail-Verifizierung\")\n \n # E-Mail-Code abrufen mit exponential backoff\n verification_code = self._get_email_code_with_backoff(email)\n \n if not verification_code:\n logger.error(\"Kein Verifizierungscode empfangen\")\n return False\n \n logger.info(f\"Verifizierungscode empfangen: {verification_code}\")\n \n # Verifizierungscode eingeben\n if not self._fill_verification_code_robust(verification_code):\n logger.error(\"Verifizierungscode-Eingabe fehlgeschlagen\")\n return False\n \n logger.info(\"E-Mail-Verifizierung erfolgreich abgeschlossen\")\n \n # Pause für UI-Updates\n self._add_human_delay(1.0, 2.5)\n \n return True\n \n except Exception as e:\n logger.error(f\"Fehler bei E-Mail-Verifizierung: {e}\")\n return False\n \n def _get_email_code_with_backoff(self, email: str, max_attempts: int = 25) -> Optional[str]:\n \"\"\"\n Ruft E-Mail-Verifizierungscode mit exponential backoff ab.\n \n Args:\n email: E-Mail-Adresse\n max_attempts: Maximale Anzahl Versuche\n \n Returns:\n Optional[str]: Verifizierungscode oder None\n \"\"\"\n try:\n logger.info(f\"E-Mail-Code-Abruf gestartet für: {email}\")\n \n for attempt in range(max_attempts):\n # Exponential backoff: 3s, 4.5s, 6.75s, ... (max 20s)\n delay = min(3 * (1.5 ** attempt), 20)\n \n logger.debug(f\"E-Mail-Abruf [{attempt + 1}/{max_attempts}] - Wartezeit: {delay:.1f}s\")\n \n # Code abrufen\n try:\n code = self.automation.email_handler.get_verification_code(\n target_email=email,\n platform=\"tiktok\",\n max_attempts=1,\n delay_seconds=1\n )\n \n if code and len(code) == 6 and code.isdigit():\n logger.info(f\"Gültiger E-Mail-Code nach {attempt + 1} Versuchen empfangen\")\n return code\n \n except Exception as e:\n logger.debug(f\"E-Mail-Abruf-Versuch {attempt + 1} fehlgeschlagen: {e}\")\n \n # Warte vor nächstem Versuch\n if attempt < max_attempts - 1:\n time.sleep(delay)\n \n logger.warning(f\"Kein E-Mail-Code nach {max_attempts} Versuchen empfangen\")\n return None\n \n except Exception as e:\n logger.error(f\"Kritischer Fehler beim E-Mail-Code-Abruf: {e}\")\n return None\n \n def _fill_verification_code_robust(self, code: str) -> bool:\n \"\"\"\n Robuste Verifizierungscode-Eingabe mit Multi-Level-Selektoren.\n \n Args:\n code: Verifizierungscode\n \n Returns:\n bool: True bei Erfolg, False bei Fehler\n \"\"\"\n try:\n logger.debug(f\"Fülle Verifizierungscode aus: {code}\")\n \n # Robuste Selektor-Strategie\n code_selectors = self.selectors.get_verification_code_selectors()\n \n for attempt in range(self.max_retry_attempts):\n logger.debug(f\"Code-Eingabe Versuch {attempt + 1}/{self.max_retry_attempts}\")\n \n # Versuche jeden Selektor\n for i, selector in enumerate(code_selectors):\n try:\n if self.automation.browser.is_element_visible(selector, timeout=3000):\n # Menschliche Code-Eingabe\n success = self.automation.browser.fill_form_field(\n selector, code, human_typing=True\n )\n \n if success:\n logger.info(f\"Verifizierungscode erfolgreich eingegeben mit Selektor {i+1}\")\n self._add_human_delay()\n return True\n \n except Exception as e:\n logger.debug(f\"Code-Selektor {i+1} fehlgeschlagen: {e}\")\n continue\n \n # Fallback: Fuzzy-Matching\n try:\n success = self.automation.ui_helper.fill_field_fuzzy(\n [\"Gib den sechsstelligen Code ein\", \"Enter verification code\", \"Verification code\"],\n code,\n code_selectors[0]\n )\n \n if success:\n logger.info(\"Verifizierungscode über Fuzzy-Matching eingegeben\")\n self._add_human_delay()\n return True\n \n except Exception as e:\n logger.debug(f\"Code Fuzzy-Matching fehlgeschlagen: {e}\")\n \n # Retry-Delay\n if attempt < self.max_retry_attempts - 1:\n delay = self.base_delay * (2 ** attempt)\n logger.debug(f\"Retry-Delay: {delay}s\")\n time.sleep(delay)\n \n logger.error(\"Verifizierungscode-Feld konnte nicht ausgefüllt werden\")\n return False\n \n except Exception as e:\n logger.error(f\"Kritischer Fehler bei Code-Eingabe: {e}\")\n return False\n \n # HILFSMETHODEN\n \n def _add_human_delay(self, min_delay: float = None, max_delay: float = None):\n \"\"\"\n Fügt menschliche Verzögerung hinzu.\n \n Args:\n min_delay: Minimale Verzögerung\n max_delay: Maximale Verzögerung\n \"\"\"\n min_d = min_delay or self.base_delay\n max_d = max_delay or self.max_delay\n self.automation.human_behavior.random_delay(min_d, max_d)\n \n def _validate_inputs(self, full_name: str, age: int, registration_method: str, phone_number: str) -> Dict[str, Any]:\n \"\"\"Validiert Eingabeparameter.\"\"\"\n if not full_name or len(full_name) < 3:\n return {\"valid\": False, \"error\": \"Ungültiger vollständiger Name\"}\n \n if age < 13:\n return {\"valid\": False, \"error\": \"Benutzer muss mindestens 13 Jahre alt sein\"}\n \n if registration_method not in [\"email\", \"phone\"]:\n return {\"valid\": False, \"error\": f\"Ungültige Registrierungsmethode: {registration_method}\"}\n \n if registration_method == \"phone\" and not phone_number:\n return {\"valid\": False, \"error\": \"Telefonnummer erforderlich für Telefon-Registrierung\"}\n \n return {\"valid\": True}\n \n def _generate_account_data(self, full_name: str, age: int, registration_method: str, phone_number: str, **kwargs) -> Dict[str, Any]:\n \"\"\"Generiert Account-Daten.\"\"\"\n username = kwargs.get(\"username\") or self.automation.username_generator.generate_username(\"tiktok\", full_name)\n password = kwargs.get(\"password\") or self.automation.password_generator.generate_password(\"tiktok\")\n \n email = None\n if registration_method == \"email\":\n email_prefix = username.lower().replace(\".\", \"\").replace(\"_\", \"\")\n email = f\"{email_prefix}@{self.automation.email_domain}\"\n \n birthday = self.automation.birthday_generator.generate_birthday_components(\"tiktok\", age)\n \n return {\n \"username\": username,\n \"password\": password,\n \"full_name\": full_name,\n \"email\": email,\n \"phone\": phone_number,\n \"birthday\": birthday,\n \"age\": age,\n \"registration_method\": registration_method\n }\n \n def _create_error_result(self, error_msg: str, stage: str, account_data: Dict[str, Any] = None) -> Dict[str, Any]:\n \"\"\"Erstellt standardisiertes Fehler-Result.\"\"\"\n result = {\n \"success\": False,\n \"error\": error_msg,\n \"stage\": stage\n }\n if account_data:\n result[\"account_data\"] = account_data\n return result\n \n # PLATZHALTER für weitere Phasen (werden aus ursprünglicher Implementierung übernommen)\n \n def _execute_navigation_phase(self) -> bool:\n \"\"\"Führt die Navigation zur TikTok-Startseite durch.\"\"\"\n # TODO: Implementierung aus ursprünglicher Datei übernehmen\n return True\n \n def _execute_form_opening_phase(self) -> bool:\n \"\"\"Öffnet das Registrierungsformular.\"\"\"\n # TODO: Implementierung aus ursprünglicher Datei übernehmen\n return True\n \n def _execute_birthday_phase(self, birthday: Dict[str, Any]) -> bool:\n \"\"\"Gibt das Geburtsdatum ein.\"\"\"\n # TODO: Implementierung aus ursprünglicher Datei übernehmen\n return True\n \n def _execute_finalization_phase(self, account_data: Dict[str, Any]) -> bool:\n \"\"\"Finalisiert die Registrierung (Benutzername, etc.).\"\"\"\n # TODO: Implementierung aus ursprünglicher Datei übernehmen\n return True\n \n def _execute_phone_main_workflow(self, account_data: Dict[str, Any]) -> bool:\n \"\"\"Führt den Telefon-Workflow aus.\"\"\"\n # TODO: Telefon-spezifische Implementierung\n logger.warning(\"Telefon-Workflow noch nicht vollständig implementiert\")\n return False