52 lines
1.6 KiB
Python
52 lines
1.6 KiB
Python
import asyncio
|
|
import json
|
|
from pathlib import Path
|
|
from playwright.async_api import async_playwright
|
|
|
|
AUTH_STATE_FILE = Path("auth_state.json")
|
|
|
|
|
|
async def ensure_login(email: str) -> None:
|
|
"""
|
|
Öffnet den Browser mit/ohne bestehenden auth_state.
|
|
Beim ersten Mal: manueller Login in M365.
|
|
Danach wird der Auth-State persistiert.
|
|
"""
|
|
async with async_playwright() as p:
|
|
browser_type = p.chromium
|
|
|
|
if AUTH_STATE_FILE.exists():
|
|
context = await browser_type.launch_persistent_context(
|
|
user_data_dir="user_data",
|
|
headless=False,
|
|
channel="chrome",
|
|
)
|
|
else:
|
|
context = await browser_type.launch_persistent_context(
|
|
user_data_dir="user_data",
|
|
headless=False,
|
|
channel="chrome",
|
|
)
|
|
|
|
page = await context.new_page()
|
|
await page.goto("https://m365.cloud.microsoft/search/?auth=2")
|
|
|
|
print(f"Bitte mit {email} in Microsoft 365 anmelden.")
|
|
print("Nach erfolgreichem Login Browser-Fenster schliessen oder Skript abbrechen (Ctrl+C).")
|
|
|
|
# Langes Warten; in echter Implementierung könnte man Events verwenden
|
|
await page.wait_for_load_state("domcontentloaded")
|
|
'page.wait_for_timeout(1000 * 1000)'
|
|
|
|
|
|
|
|
state = await context.storage_state()
|
|
# storage_state() liefert dict -> JSON speichern
|
|
AUTH_STATE_FILE.write_text(json.dumps(state), encoding="utf-8")
|
|
|
|
await context.close()
|
|
|
|
|
|
def ensure_login_sync(email: str) -> None:
|
|
asyncio.run(ensure_login(email))
|