127 Zeilen
4.5 KiB
Python
127 Zeilen
4.5 KiB
Python
"""
|
|
VK Login - Handhabt den Login-Prozess
|
|
"""
|
|
|
|
import logging
|
|
import time
|
|
import random
|
|
from typing import Dict
|
|
from playwright.sync_api import Page
|
|
|
|
from social_networks.vk import vk_selectors as selectors
|
|
from social_networks.vk.vk_ui_helper import VKUIHelper
|
|
|
|
logger = logging.getLogger("vk_login")
|
|
|
|
class VKLogin:
|
|
"""
|
|
Handhabt den VK Login-Prozess
|
|
"""
|
|
|
|
def __init__(self, page: Page, ui_helper: VKUIHelper, screenshots_dir: str = None, save_screenshots: bool = True):
|
|
"""
|
|
Initialisiert den Login Handler
|
|
"""
|
|
self.page = page
|
|
self.ui_helper = ui_helper
|
|
self.screenshots_dir = screenshots_dir
|
|
self.save_screenshots = save_screenshots
|
|
|
|
def login(self, username: str, password: str) -> Dict[str, any]:
|
|
"""
|
|
Führt den Login durch
|
|
"""
|
|
try:
|
|
logger.info(f"Starte VK Login für {username}")
|
|
|
|
# Navigiere zur Login-Seite
|
|
self.page.goto(selectors.LOGIN_URL, wait_until="domcontentloaded")
|
|
time.sleep(random.uniform(2, 3))
|
|
|
|
self.ui_helper.take_screenshot("login_page")
|
|
|
|
# Email/Telefonnummer eingeben
|
|
if self.ui_helper.wait_for_element(selectors.LOGIN_EMAIL_INPUT, timeout=10000):
|
|
logger.info("Gebe Benutzernamen ein")
|
|
self.ui_helper.type_with_delay(selectors.LOGIN_EMAIL_INPUT, username)
|
|
time.sleep(random.uniform(0.5, 1))
|
|
|
|
# Passwort eingeben
|
|
if self.ui_helper.wait_for_element(selectors.LOGIN_PASSWORD_INPUT, timeout=5000):
|
|
logger.info("Gebe Passwort ein")
|
|
self.ui_helper.type_with_delay(selectors.LOGIN_PASSWORD_INPUT, password)
|
|
time.sleep(random.uniform(0.5, 1))
|
|
|
|
# Screenshot vor dem Login
|
|
self.ui_helper.take_screenshot("login_form_filled")
|
|
|
|
# Login Button klicken
|
|
if self.ui_helper.wait_for_element(selectors.LOGIN_SUBMIT_BUTTON, timeout=5000):
|
|
logger.info("Klicke auf Login Button")
|
|
self.ui_helper.click_with_retry(selectors.LOGIN_SUBMIT_BUTTON)
|
|
|
|
# Warte auf Navigation
|
|
self.ui_helper.wait_for_navigation()
|
|
time.sleep(random.uniform(2, 3))
|
|
|
|
# Prüfe ob Login erfolgreich war
|
|
if self._check_login_success():
|
|
logger.info("Login erfolgreich")
|
|
self.ui_helper.take_screenshot("login_success")
|
|
return {
|
|
"success": True,
|
|
"message": "Login erfolgreich"
|
|
}
|
|
else:
|
|
error_msg = self._get_error_message()
|
|
logger.error(f"Login fehlgeschlagen: {error_msg}")
|
|
self.ui_helper.take_screenshot("login_failed")
|
|
return {
|
|
"success": False,
|
|
"error": error_msg,
|
|
"message": f"Login fehlgeschlagen: {error_msg}"
|
|
}
|
|
|
|
except Exception as e:
|
|
logger.error(f"Fehler beim Login: {e}")
|
|
self.ui_helper.take_screenshot("login_error")
|
|
return {
|
|
"success": False,
|
|
"error": str(e),
|
|
"message": f"Login fehlgeschlagen: {str(e)}"
|
|
}
|
|
|
|
def _check_login_success(self) -> bool:
|
|
"""
|
|
Prüft ob der Login erfolgreich war
|
|
"""
|
|
try:
|
|
# Prüfe ob wir auf der Hauptseite sind
|
|
current_url = self.page.url
|
|
if "feed" in current_url or "id" in current_url:
|
|
return True
|
|
|
|
# Prüfe ob Login-Formular noch sichtbar ist
|
|
if self.ui_helper.is_element_visible(selectors.LOGIN_EMAIL_INPUT):
|
|
return False
|
|
|
|
# Prüfe auf Fehlermeldung
|
|
if self.ui_helper.is_element_visible(selectors.ERROR_MESSAGE):
|
|
return False
|
|
|
|
return True
|
|
|
|
except Exception as e:
|
|
logger.warning(f"Fehler bei der Login-Prüfung: {e}")
|
|
return False
|
|
|
|
def _get_error_message(self) -> str:
|
|
"""
|
|
Holt die Fehlermeldung falls vorhanden
|
|
"""
|
|
try:
|
|
if self.ui_helper.is_element_visible(selectors.ERROR_MESSAGE):
|
|
return self.ui_helper.get_element_text(selectors.ERROR_MESSAGE) or "Unbekannter Fehler"
|
|
return "Login fehlgeschlagen"
|
|
except:
|
|
return "Unbekannter Fehler" |