diff --git a/database/accounts.db b/database/accounts.db index 4a6d6d1..85afaaf 100644 Binary files a/database/accounts.db and b/database/accounts.db differ diff --git a/social_networks/tiktok/tiktok_registration.py b/social_networks/tiktok/tiktok_registration.py index ede1cda..98796f5 100644 --- a/social_networks/tiktok/tiktok_registration.py +++ b/social_networks/tiktok/tiktok_registration.py @@ -1042,14 +1042,23 @@ class TikTokRegistration: # Nach Code-Eingabe erscheint ein neues Passwort-Feld # Verschiedene Selektoren für das Passwort-Feld nach Code-Eingabe password_selectors = [ - # Aktueller Selektor basierend auf Console-Output - "input[type='password'][placeholder='Passwort']", - "input.css-wv3bkt-InputContainer.etcs7ny1", - "input.css-wv3bkt-InputContainer", - "input.etcs7ny1[type='password']", - # Original Selektor + # Neue TikTok CSS-Klassen (2025) + "input.css-15uxi3b-5e6d46e3--InputContainer", # Neue spezifische Klasse + "input.epfb2861[type='password']", # Neue zusätzliche Klasse + "input[class*='InputContainer'][type='password']", # Partial class match + + # Generische Selektoren (stabiler) + "input[type='password'][placeholder='Passwort']", # Type + Placeholder + "input[type='password'][autocomplete='new-password']", # Type + Autocomplete + "input[placeholder='Passwort']", # Nur Placeholder + + # Alte Selektoren (Fallback) + "input.css-wv3bkt-InputContainer.etcs7ny1", # Alt TikTok-Klasse + "input.css-wv3bkt-InputContainer", # Alt TikTok-Klasse + "input.etcs7ny1[type='password']", # Alt TikTok-Klasse + + # Original und weitere Fallbacks self.selectors.PASSWORD_FIELD, - # Fallback-Selektoren "input[type='password']", "input[placeholder*='Passwort']", "input[placeholder*='Password']", @@ -1057,23 +1066,26 @@ class TikTokRegistration: ] password_success = False - for selector in password_selectors: - if self.automation.browser.is_element_visible(selector, timeout=2000): - logger.info(f"Passwort-Feld gefunden: {selector}") - # Verwende Character-by-Character Eingabe für Passwort-Feld - password_success = self._fill_password_field_character_by_character(selector, account_data["password"]) - if password_success: - # VALIDATION: Prüfe ob Passwort tatsächlich im Feld steht - self.automation.human_behavior.random_delay(0.5, 1.0) - actual_value = self._get_input_field_value(selector) - if actual_value == account_data["password"]: - logger.info("Passwort erfolgreich eingegeben und validiert") - break - else: - logger.warning(f"Passwort-Validierung fehlgeschlagen: erwartet='{account_data['password']}', erhalten='{actual_value}'") - password_success = False - else: - logger.debug(f"Passwort-Eingabe mit Selektor {selector} fehlgeschlagen") + for i, selector in enumerate(password_selectors): + logger.debug(f"Versuche Passwort-Selektor {i+1}/{len(password_selectors)}: {selector}") + try: + if self.automation.browser.is_element_visible(selector, timeout=1000): + logger.info(f"✓ Passwort-Feld gefunden mit Selektor {i+1}: {selector}") + # Verwende Character-by-Character Eingabe für Passwort-Feld + password_success = self._fill_password_field_character_by_character(selector, account_data["password"]) + if password_success: + # VALIDATION: Prüfe ob Passwort tatsächlich im Feld steht + self.automation.human_behavior.random_delay(0.5, 1.0) + actual_value = self._get_input_field_value(selector) + if actual_value == account_data["password"]: + logger.info("Passwort erfolgreich eingegeben und validiert") + break + else: + logger.warning(f"Passwort-Validierung fehlgeschlagen: erwartet='{account_data['password']}', erhalten='{actual_value}'") + password_success = False + except Exception as e: + logger.debug(f"Passwort-Selektor {i+1} fehlgeschlagen: {e}") + continue if not password_success: logger.warning("Fallback 1: Versuche UI Helper für Passwort-Eingabe")