Gmail weiter gemacht
Dieser Commit ist enthalten in:
@ -5,7 +5,7 @@ Gmail Verification - Handhabt die Verifizierungsprozesse
|
||||
import logging
|
||||
import time
|
||||
import random
|
||||
from typing import Dict, Optional
|
||||
from typing import Dict, Optional, Any
|
||||
from playwright.sync_api import Page
|
||||
|
||||
from social_networks.gmail import gmail_selectors as selectors
|
||||
@ -20,7 +20,8 @@ class GmailVerification:
|
||||
"""
|
||||
|
||||
def __init__(self, page: Page, ui_helper: GmailUIHelper, email_handler: EmailHandler = None,
|
||||
screenshots_dir: str = None, save_screenshots: bool = True):
|
||||
screenshots_dir: str = None, save_screenshots: bool = True,
|
||||
phone_service: Optional[Any] = None):
|
||||
"""
|
||||
Initialisiert den Verification Handler
|
||||
"""
|
||||
@ -29,17 +30,18 @@ class GmailVerification:
|
||||
self.email_handler = email_handler
|
||||
self.screenshots_dir = screenshots_dir
|
||||
self.save_screenshots = save_screenshots
|
||||
self.phone_service = phone_service
|
||||
|
||||
def handle_phone_verification(self, account_data: Dict[str, str]) -> Dict[str, any]:
|
||||
"""
|
||||
Handhabt die Telefonnummer-Verifizierung
|
||||
Enhanced Telefonnummer-Verifizierung mit 2025 Skip-Techniken
|
||||
"""
|
||||
try:
|
||||
logger.info("Starte Telefon-Verifizierung")
|
||||
logger.info("[PHONE-VERIFY] Starte enhanced Telefon-Verifizierung")
|
||||
|
||||
# Warte auf Telefonnummer-Eingabefeld
|
||||
if not self.ui_helper.wait_for_element(selectors.PHONE_INPUT, timeout=10000):
|
||||
logger.info("Telefonnummer-Eingabefeld nicht gefunden")
|
||||
logger.info("[PHONE-VERIFY] ✅ Telefonnummer-Eingabefeld nicht gefunden - Erfolg!")
|
||||
return {
|
||||
"success": True,
|
||||
"message": "Keine Telefon-Verifizierung erforderlich"
|
||||
@ -47,21 +49,38 @@ class GmailVerification:
|
||||
|
||||
self.ui_helper.take_screenshot("phone_verification_page")
|
||||
|
||||
# Telefonnummer eingeben
|
||||
# Enhanced Skip-Versuch bevor Telefonnummer eingegeben wird
|
||||
phone = account_data.get("phone", "")
|
||||
if not phone:
|
||||
logger.warning("Keine Telefonnummer vorhanden, überspringe wenn möglich")
|
||||
# Versuche zu überspringen
|
||||
if self.ui_helper.is_element_visible(selectors.SKIP_BUTTON):
|
||||
self.ui_helper.click_with_retry(selectors.SKIP_BUTTON)
|
||||
time.sleep(random.uniform(2, 3))
|
||||
return {"success": True}
|
||||
else:
|
||||
return {
|
||||
"success": False,
|
||||
"error": "Telefonnummer erforderlich aber nicht vorhanden",
|
||||
"message": "Telefonnummer wird benötigt"
|
||||
}
|
||||
logger.warning("[PHONE-VERIFY] Keine Telefonnummer vorhanden - versuche erweiterte Skip-Methoden")
|
||||
|
||||
# Versuche alle Skip-Button Varianten
|
||||
for skip_variant in selectors.SKIP_BUTTON_VARIANTS[:10]: # Top 10 Varianten
|
||||
if self.ui_helper.is_element_visible(skip_variant, timeout=500):
|
||||
logger.info(f"[PHONE-VERIFY] Skip-Button gefunden: {skip_variant}")
|
||||
self.ui_helper.click_with_retry(skip_variant)
|
||||
time.sleep(random.uniform(2, 3))
|
||||
|
||||
# Prüfe ob erfolgreich übersprungen
|
||||
if not self.ui_helper.is_element_visible(selectors.PHONE_INPUT, timeout=2000):
|
||||
return {"success": True, "message": "Telefon erfolgreich übersprungen"}
|
||||
|
||||
# Fallback: Versuche mit leerem Feld fortzufahren
|
||||
logger.info("[PHONE-VERIFY] Versuche mit leerem Feld fortzufahren")
|
||||
try:
|
||||
self.page.locator(selectors.PHONE_INPUT).fill("")
|
||||
if self.ui_helper.click_with_retry(selectors.NEXT_BUTTON):
|
||||
time.sleep(2)
|
||||
if not self.ui_helper.is_element_visible(selectors.SMS_CODE_INPUT, timeout=3000):
|
||||
return {"success": True, "message": "Mit leerem Feld fortgefahren"}
|
||||
except:
|
||||
pass
|
||||
|
||||
return {
|
||||
"success": False,
|
||||
"error": "phone_required",
|
||||
"message": "Telefonnummer wird benötigt - alle Skip-Versuche fehlgeschlagen"
|
||||
}
|
||||
|
||||
logger.info(f"Gebe Telefonnummer ein: {phone}")
|
||||
|
||||
@ -84,8 +103,19 @@ class GmailVerification:
|
||||
logger.info("SMS-Code Eingabefeld gefunden")
|
||||
self.ui_helper.take_screenshot("sms_code_page")
|
||||
|
||||
# Hier würde normalerweise der SMS-Code abgerufen werden
|
||||
sms_code = self._get_sms_code(phone)
|
||||
# SMS-Code beziehen: bevorzugt aus account_data, sonst Provider, sonst Fallback
|
||||
sms_code: Optional[str] = None
|
||||
try:
|
||||
if isinstance(account_data, dict):
|
||||
if account_data.get("sms_code"):
|
||||
sms_code = str(account_data.get("sms_code")).strip()
|
||||
elif callable(account_data.get("sms_code_provider")):
|
||||
sms_code = account_data.get("sms_code_provider")(phone)
|
||||
except Exception as prov_e:
|
||||
logger.warning(f"SMS-Code Provider-Fehler: {prov_e}")
|
||||
if not sms_code:
|
||||
# Hier würde normalerweise der SMS-Code abgerufen werden
|
||||
sms_code = self._get_sms_code(phone)
|
||||
|
||||
if not sms_code:
|
||||
logger.error("Kein SMS-Code erhalten")
|
||||
@ -179,10 +209,19 @@ class GmailVerification:
|
||||
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
|
||||
# 1) Bevorzugt: externer Phone-Service
|
||||
try:
|
||||
if self.phone_service and hasattr(self.phone_service, 'get_code'):
|
||||
logger.info("Frage SMS-Code über phone_service an")
|
||||
code = self.phone_service.get_code(phone)
|
||||
if code:
|
||||
return str(code).strip()
|
||||
except Exception as e:
|
||||
logger.warning(f"phone_service.get_code Fehler: {e}")
|
||||
|
||||
# 2) Fallback: Platzhalter (nur für Tests/Entwicklung)
|
||||
logger.warning("SMS-Code Abruf nicht konfiguriert – verwende Platzhalter")
|
||||
return "123456"
|
||||
|
||||
def _check_verification_success(self) -> bool:
|
||||
"""
|
||||
@ -227,4 +266,4 @@ class GmailVerification:
|
||||
|
||||
return "Verifizierung fehlgeschlagen"
|
||||
except:
|
||||
return "Unbekannter Fehler"
|
||||
return "Unbekannter Fehler"
|
||||
|
||||
In neuem Issue referenzieren
Einen Benutzer sperren