diff --git a/social_networks/tiktok/tiktok_registration.py b/social_networks/tiktok/tiktok_registration.py index 38f1adb..1176d6d 100644 --- a/social_networks/tiktok/tiktok_registration.py +++ b/social_networks/tiktok/tiktok_registration.py @@ -82,6 +82,9 @@ class TikTokRegistration: self.automation._emit_customer_log("⚙️ Einstellungen werden vorbereitet...") self._handle_cookie_banner() + # 2b. Interessen-Dialog behandeln (falls vorhanden) + self._handle_interests_dialog() + # 3. Anmelden-Button klicken self.automation._emit_customer_log("📋 Registrierungsformular wird geöffnet...") if not self._click_login_button(): @@ -317,6 +320,89 @@ class TikTokRegistration: logger.error(f"Fehler beim Navigieren zur TikTok-Startseite: {e}") return False + def _handle_interests_dialog(self) -> bool: + """ + Behandelt den "Wähle deine Interessen aus" Dialog, falls angezeigt. + Dieser Dialog erscheint oft beim ersten Besuch der TikTok-Seite. + + Returns: + bool: True wenn Dialog behandelt wurde oder nicht existiert, False bei Fehler + """ + try: + # Prüfe ob der Interessen-Dialog vorhanden ist + # Suche nach verschiedenen möglichen Selektoren für den Dialog + interests_dialog_selectors = [ + "button:has-text('Überspringen')", + "button:has-text('Skip')", + "button.TUXButton--secondary:has-text('Überspringen')", + "button.TUXButton--secondary:has-text('Skip')", + "button[type='button']:has-text('Überspringen')", + "button[type='button']:has-text('Skip')" + ] + + # Warte kurz und prüfe ob der Dialog erscheint + dialog_found = False + for selector in interests_dialog_selectors: + if self.automation.browser.is_element_visible(selector, timeout=2000): + dialog_found = True + logger.info(f"Interessen-Dialog erkannt mit Selector: {selector}") + break + + if dialog_found: + self.automation._emit_customer_log("⏭️ Überspringe Interessen-Auswahl...") + + # Versuche verschiedene Methoden den Überspringen-Button zu klicken + skip_clicked = False + + # Methode 1: Direkter Click auf Button mit Text + for selector in interests_dialog_selectors: + try: + if self.automation.browser.click_element(selector, timeout=1000): + logger.info(f"Interessen-Dialog übersprungen mit: {selector}") + skip_clicked = True + break + except: + continue + + # Methode 2: Falls direkter Click nicht funktioniert, versuche mit JavaScript + if not skip_clicked: + try: + # JavaScript-Click auf Button mit "Überspringen" Text + js_code = """ + const buttons = document.querySelectorAll('button'); + for (let button of buttons) { + if (button.textContent.includes('Überspringen') || + button.textContent.includes('Skip')) { + button.click(); + return true; + } + } + return false; + """ + result = self.automation.browser.page.evaluate(js_code) + if result: + logger.info("Interessen-Dialog mit JavaScript übersprungen") + skip_clicked = True + except Exception as e: + logger.warning(f"JavaScript-Click fehlgeschlagen: {e}") + + if skip_clicked: + # Warte kurz nach dem Überspringen + self.automation.human_behavior.random_delay(1.0, 2.0) + logger.info("Interessen-Dialog erfolgreich übersprungen") + return True + else: + logger.warning("Konnte Interessen-Dialog nicht überspringen - versuche trotzdem fortzufahren") + return True # Trotzdem fortfahren + + logger.debug("Kein Interessen-Dialog gefunden - fahre normal fort") + return True + + except Exception as e: + logger.error(f"Fehler beim Behandeln des Interessen-Dialogs: {e}") + # Nicht als kritischer Fehler behandeln - versuche fortzufahren + return True + def _handle_cookie_banner(self) -> bool: """ Behandelt den Cookie-Banner, falls angezeigt.