150 Zeilen
5.6 KiB
Python
150 Zeilen
5.6 KiB
Python
"""
|
|
TikTok-Selektoren - CSS-Selektoren und XPath-Ausdrücke für die TikTok-Automatisierung
|
|
Mit Text-Matching-Funktionen für robuste Element-Erkennung
|
|
"""
|
|
|
|
from typing import List, Dict, Optional, Any
|
|
|
|
class TikTokSelectors:
|
|
"""
|
|
Zentrale Sammlung aller Selektoren für die TikTok-Automatisierung.
|
|
Bei Änderungen der TikTok-Webseite müssen nur hier Anpassungen vorgenommen werden.
|
|
Enthält auch Fuzzy-Text-Matching-Daten für robustere Element-Erkennung.
|
|
"""
|
|
|
|
# URL-Konstanten
|
|
BASE_URL = "https://www.tiktok.com"
|
|
SIGNUP_URL = "https://www.tiktok.com/signup"
|
|
LOGIN_URL = "https://www.tiktok.com/login"
|
|
|
|
# Anmelden/Registrieren-Buttons Hauptseite
|
|
LOGIN_BUTTON_LEFT = "button#header-login-button"
|
|
LOGIN_BUTTON_RIGHT = "button#top-right-action-bar-login-button"
|
|
SIGNUP_LINK = "a[href*='/signup']"
|
|
|
|
# Registrierungsdialog - Methoden
|
|
REGISTRATION_DIALOG = "div[role='dialog']"
|
|
PHONE_EMAIL_BUTTON = "div[data-e2e='channel-item']"
|
|
REGISTER_WITH_EMAIL = "a[href*='/signup/phone-or-email/email']"
|
|
REGISTER_WITH_PHONE = "a[href*='/signup/phone-or-email/phone']"
|
|
|
|
# Geburtsdatum-Selektoren
|
|
BIRTHDAY_MONTH_SELECT = "div.css-1fi2hzv-DivSelectLabel:contains('Monat')"
|
|
BIRTHDAY_DAY_SELECT = "div.css-1fi2hzv-DivSelectLabel:contains('Tag')"
|
|
BIRTHDAY_YEAR_SELECT = "div.css-1fi2hzv-DivSelectLabel:contains('Jahr')"
|
|
BIRTHDAY_DROPDOWN_OPTION = "div[role='option']"
|
|
|
|
# Formularfelder - E-Mail-Registrierung
|
|
EMAIL_FIELD = "input[placeholder='E-Mail-Adresse']"
|
|
PASSWORD_FIELD = "input[placeholder='Passwort']"
|
|
VERIFICATION_CODE_FIELD = "input[placeholder*='sechsstelligen Code']"
|
|
USERNAME_FIELD = "input[placeholder='Benutzername']"
|
|
|
|
# Formularfelder - Telefon-Registrierung
|
|
COUNTRY_CODE_SELECT = "div[role='combobox']"
|
|
PHONE_FIELD = "input[placeholder='Telefonnummer']"
|
|
|
|
# Buttons
|
|
SEND_CODE_BUTTON = "button[data-e2e='send-code-button']"
|
|
RESEND_CODE_BUTTON = "button:contains('Code erneut senden')"
|
|
CONTINUE_BUTTON = "button[type='submit']"
|
|
REGISTER_BUTTON = "button:contains('Registrieren')"
|
|
SKIP_BUTTON = "button:contains('Überspringen')"
|
|
|
|
# Checkbox
|
|
NEWSLETTER_CHECKBOX = "input[type='checkbox']"
|
|
|
|
# Erfolgs-Indikatoren für Registrierung
|
|
SUCCESS_INDICATORS = [
|
|
"a[href='/foryou']",
|
|
"a[href='/explore']",
|
|
"button[data-e2e='profile-icon']",
|
|
"svg[data-e2e='profile-icon']"
|
|
]
|
|
|
|
# Links für Nutzungsbedingungen und Datenschutz
|
|
TERMS_LINK = "a:contains('Nutzungsbedingungen')"
|
|
PRIVACY_LINK = "a:contains('Datenschutzerklärung')"
|
|
|
|
# Text-Matching-Parameter für Fuzzy-Matching
|
|
TEXT_MATCH = {
|
|
# Formularfelder
|
|
"form_fields": {
|
|
"email": ["E-Mail-Adresse", "E-Mail", "Email", "Mail"],
|
|
"phone": ["Telefonnummer", "Telefon", "Phone", "Mobile"],
|
|
"password": ["Passwort", "Password"],
|
|
"verification_code": ["Bestätigungscode", "Code", "Verifizierungscode", "Sicherheitscode"],
|
|
"username": ["Benutzername", "Username", "Name"]
|
|
},
|
|
|
|
# Buttons
|
|
"buttons": {
|
|
"send_code": ["Code senden", "Senden", "Send code", "Verification code", "Send"],
|
|
"continue": ["Weiter", "Continue", "Next", "Fortfahren"],
|
|
"register": ["Registrieren", "Register", "Sign up", "Konto erstellen"],
|
|
"skip": ["Überspringen", "Skip", "Later", "Später", "Nicht jetzt"],
|
|
},
|
|
|
|
# Fehler-Indikatoren
|
|
"error_indicators": [
|
|
"Fehler", "Error", "Leider", "Ungültig", "Invalid", "Nicht verfügbar",
|
|
"Fehlgeschlagen", "Problem", "Failed", "Nicht möglich", "Bereits verwendet",
|
|
"Too many attempts", "Zu viele Versuche", "Rate limit", "Bitte warte"
|
|
],
|
|
|
|
# Bestätigungscode-Texte in E-Mails
|
|
"email_verification_patterns": [
|
|
"ist dein Bestätigungscode",
|
|
"ist dein TikTok-Code",
|
|
"is your TikTok code",
|
|
"is your verification code",
|
|
"Dein Bestätigungscode lautet",
|
|
"Your verification code is"
|
|
]
|
|
}
|
|
|
|
@classmethod
|
|
def get_field_labels(cls, field_type: str) -> List[str]:
|
|
"""
|
|
Gibt die möglichen Bezeichnungen für ein Formularfeld zurück.
|
|
|
|
Args:
|
|
field_type: Typ des Formularfelds (z.B. "email", "phone")
|
|
|
|
Returns:
|
|
List[str]: Liste mit möglichen Bezeichnungen
|
|
"""
|
|
return cls.TEXT_MATCH["form_fields"].get(field_type, [])
|
|
|
|
@classmethod
|
|
def get_button_texts(cls, button_type: str) -> List[str]:
|
|
"""
|
|
Gibt die möglichen Texte für einen Button zurück.
|
|
|
|
Args:
|
|
button_type: Typ des Buttons (z.B. "send_code", "continue")
|
|
|
|
Returns:
|
|
List[str]: Liste mit möglichen Button-Texten
|
|
"""
|
|
return cls.TEXT_MATCH["buttons"].get(button_type, [])
|
|
|
|
@classmethod
|
|
def get_error_indicators(cls) -> List[str]:
|
|
"""
|
|
Gibt die möglichen Texte für Fehlerindikatoren zurück.
|
|
|
|
Returns:
|
|
List[str]: Liste mit möglichen Fehlerindikator-Texten
|
|
"""
|
|
return cls.TEXT_MATCH["error_indicators"]
|
|
|
|
@classmethod
|
|
def get_email_verification_patterns(cls) -> List[str]:
|
|
"""
|
|
Gibt die möglichen Texte für Bestätigungscodes in E-Mails zurück.
|
|
|
|
Returns:
|
|
List[str]: Liste mit möglichen E-Mail-Bestätigungscode-Texten
|
|
"""
|
|
return cls.TEXT_MATCH["email_verification_patterns"] |