Initial commit
Dieser Commit ist enthalten in:
157
social_networks/gmail/gmail_login.py
Normale Datei
157
social_networks/gmail/gmail_login.py
Normale Datei
@ -0,0 +1,157 @@
|
||||
"""
|
||||
Gmail Login - Handhabt den Login-Prozess
|
||||
"""
|
||||
|
||||
import logging
|
||||
import time
|
||||
import random
|
||||
from typing import Dict
|
||||
from playwright.sync_api import Page
|
||||
|
||||
from social_networks.gmail import gmail_selectors as selectors
|
||||
from social_networks.gmail.gmail_ui_helper import GmailUIHelper
|
||||
|
||||
logger = logging.getLogger("gmail_login")
|
||||
|
||||
class GmailLogin:
|
||||
"""
|
||||
Handhabt den Gmail/Google Account Login-Prozess
|
||||
"""
|
||||
|
||||
def __init__(self, page: Page, ui_helper: GmailUIHelper, 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 Gmail 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 eingeben
|
||||
if self.ui_helper.wait_for_element(selectors.LOGIN_EMAIL_INPUT, timeout=10000):
|
||||
logger.info("Gebe Email-Adresse ein")
|
||||
# Füge @gmail.com hinzu falls nicht vorhanden
|
||||
email = username if "@" in username else f"{username}@gmail.com"
|
||||
self.ui_helper.type_with_delay(selectors.LOGIN_EMAIL_INPUT, email)
|
||||
time.sleep(random.uniform(0.5, 1))
|
||||
|
||||
# Screenshot vor dem Weiter-Klick
|
||||
self.ui_helper.take_screenshot("email_entered")
|
||||
|
||||
# Weiter klicken
|
||||
logger.info("Klicke auf Weiter")
|
||||
self.ui_helper.click_with_retry(selectors.LOGIN_NEXT_BUTTON)
|
||||
self.ui_helper.wait_for_loading_to_finish()
|
||||
time.sleep(random.uniform(2, 3))
|
||||
|
||||
# Passwort eingeben
|
||||
if self.ui_helper.wait_for_element(selectors.LOGIN_PASSWORD_INPUT, timeout=10000):
|
||||
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("password_entered")
|
||||
|
||||
# Login Button klicken
|
||||
logger.info("Klicke auf Weiter")
|
||||
self.ui_helper.click_with_retry(selectors.LOGIN_NEXT_BUTTON)
|
||||
|
||||
# Warte auf Navigation
|
||||
self.ui_helper.wait_for_navigation()
|
||||
time.sleep(random.uniform(3, 5))
|
||||
|
||||
# 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 einer Google-Seite sind
|
||||
current_url = self.page.url
|
||||
success_indicators = [
|
||||
"myaccount.google.com",
|
||||
"mail.google.com",
|
||||
"youtube.com",
|
||||
"google.com/webhp",
|
||||
"accounts.google.com/b/"
|
||||
]
|
||||
|
||||
for indicator in success_indicators:
|
||||
if indicator 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:
|
||||
# Prüfe verschiedene Fehlermeldungs-Selektoren
|
||||
error_selectors = [
|
||||
selectors.ERROR_MESSAGE,
|
||||
selectors.ERROR_MESSAGE_ALT,
|
||||
selectors.FORM_ERROR
|
||||
]
|
||||
|
||||
for selector in error_selectors:
|
||||
if self.ui_helper.is_element_visible(selector):
|
||||
error_text = self.ui_helper.get_element_text(selector)
|
||||
if error_text:
|
||||
return error_text
|
||||
|
||||
return "Login fehlgeschlagen"
|
||||
except:
|
||||
return "Unbekannter Fehler"
|
||||
In neuem Issue referenzieren
Einen Benutzer sperren