""" VK Verification - Handhabt die Telefon-Verifizierung """ import logging import time import random from typing import Dict, Optional from playwright.sync_api import Page from social_networks.vk import vk_selectors as selectors from social_networks.vk.vk_ui_helper import VKUIHelper from utils.email_handler import EmailHandler logger = logging.getLogger("vk_verification") class VKVerification: """ Handhabt die VK Telefon-Verifizierung """ def __init__(self, page: Page, ui_helper: VKUIHelper, email_handler: EmailHandler = None, screenshots_dir: str = None, save_screenshots: bool = True): """ Initialisiert den Verification Handler """ self.page = page self.ui_helper = ui_helper self.email_handler = email_handler self.screenshots_dir = screenshots_dir self.save_screenshots = save_screenshots def handle_phone_verification(self, account_data: Dict[str, str]) -> Dict[str, any]: """ Handhabt die Telefonnummer-Verifizierung """ try: logger.info("Starte Telefon-Verifizierung") # Warte auf Telefonnummer-Eingabefeld if not self.ui_helper.wait_for_element(selectors.PHONE_INPUT, timeout=10000): logger.error("Telefonnummer-Eingabefeld nicht gefunden") return { "success": False, "error": "Telefonnummer-Eingabefeld nicht gefunden", "message": "Verifizierung fehlgeschlagen" } self.ui_helper.take_screenshot("phone_verification_page") # Telefonnummer eingeben phone = account_data.get("phone", "") if not phone: logger.error("Keine Telefonnummer in account_data vorhanden") return { "success": False, "error": "Keine Telefonnummer angegeben", "message": "Telefonnummer erforderlich" } logger.info(f"Gebe Telefonnummer ein: {phone}") # Prüfe ob Ländercode-Auswahl vorhanden ist if self.ui_helper.is_element_visible(selectors.PHONE_COUNTRY_CODE): # TODO: Ländercode auswählen falls nötig pass # Telefonnummer eingeben self.ui_helper.type_with_delay(selectors.PHONE_INPUT, phone) time.sleep(random.uniform(1, 2)) # Screenshot vor dem Absenden self.ui_helper.take_screenshot("phone_entered") # Absenden if self.ui_helper.wait_for_element(selectors.PHONE_SUBMIT_BUTTON, timeout=5000): logger.info("Sende Telefonnummer ab") self.ui_helper.click_with_retry(selectors.PHONE_SUBMIT_BUTTON) time.sleep(random.uniform(3, 5)) # Warte auf SMS-Code Eingabefeld if self.ui_helper.wait_for_element(selectors.SMS_CODE_INPUT, timeout=15000): logger.info("SMS-Code Eingabefeld gefunden") self.ui_helper.take_screenshot("sms_code_page") # Hier würde normalerweise der SMS-Code abgerufen werden # Für Demo-Zwecke verwenden wir einen Platzhalter sms_code = self._get_sms_code(phone) if not sms_code: logger.error("Kein SMS-Code erhalten") return { "success": False, "error": "Kein SMS-Code erhalten", "message": "SMS-Verifizierung fehlgeschlagen" } # SMS-Code eingeben logger.info(f"Gebe SMS-Code ein: {sms_code}") self.ui_helper.type_with_delay(selectors.SMS_CODE_INPUT, sms_code) time.sleep(random.uniform(1, 2)) # Code absenden if self.ui_helper.wait_for_element(selectors.SMS_SUBMIT_BUTTON, timeout=5000): logger.info("Sende SMS-Code ab") self.ui_helper.click_with_retry(selectors.SMS_SUBMIT_BUTTON) time.sleep(random.uniform(3, 5)) # Prüfe auf Erfolg if self._check_verification_success(): logger.info("Telefon-Verifizierung erfolgreich") self.ui_helper.take_screenshot("verification_success") return { "success": True, "message": "Verifizierung erfolgreich" } else: error_msg = self._get_verification_error() logger.error(f"Verifizierung fehlgeschlagen: {error_msg}") return { "success": False, "error": error_msg, "message": f"Verifizierung fehlgeschlagen: {error_msg}" } else: logger.error("SMS-Code Eingabefeld nicht gefunden") return { "success": False, "error": "SMS-Code Eingabefeld nicht gefunden", "message": "Verifizierung fehlgeschlagen" } except Exception as e: logger.error(f"Fehler bei der Telefon-Verifizierung: {e}") self.ui_helper.take_screenshot("verification_error") return { "success": False, "error": str(e), "message": f"Verifizierung fehlgeschlagen: {str(e)}" } def _get_sms_code(self, phone: str) -> Optional[str]: """ Ruft den SMS-Code ab TODO: Implementierung für echte SMS-Code Abfrage """ logger.warning("SMS-Code Abruf noch nicht implementiert - verwende Platzhalter") # In einer echten Implementierung würde hier der SMS-Code # von einem SMS-Service abgerufen werden return "123456" # Platzhalter def _check_verification_success(self) -> bool: """ Prüft ob die Verifizierung erfolgreich war """ try: # Prüfe ob wir weitergeleitet wurden current_url = self.page.url if "welcome" in current_url or "feed" in current_url: return True # Prüfe ob SMS-Code Feld noch sichtbar ist if self.ui_helper.is_element_visible(selectors.SMS_CODE_INPUT): return False # Prüfe auf Fehlermeldung if self.ui_helper.is_element_visible(selectors.PHONE_ERROR): return False return True except Exception as e: logger.warning(f"Fehler bei der Verifizierungs-Prüfung: {e}") return False def _get_verification_error(self) -> str: """ Holt die Fehlermeldung falls vorhanden """ try: if self.ui_helper.is_element_visible(selectors.PHONE_ERROR): return self.ui_helper.get_element_text(selectors.PHONE_ERROR) or "Verifizierung fehlgeschlagen" return "Verifizierung fehlgeschlagen" except: return "Unbekannter Fehler"