Dieser Commit ist enthalten in:
Claude Project Manager
2025-08-01 23:50:28 +02:00
Commit 04585e95b6
290 geänderte Dateien mit 64086 neuen und 0 gelöschten Zeilen

Datei anzeigen

@ -0,0 +1,186 @@
"""
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"