""" 01 - Přihlášení na portál VoZP (prehled-zprav-ve-schrankach) Otevře Chrome, přihlásí se certifikátem přes Signer komponentu a naviguje na schránku zpráv. Okno zůstane otevřené — skript čeká na stisk Enter. Použití: python 01_prihlaseni.py """ import json import os import sys import time import winreg LOGIN_URL = "https://portal.vozp.cz/app/prihlaseni" INBOX_URL = "https://portal.vozp.cz/app/prehled-zprav-ve-schrankach" CHROME_PROFILE = os.path.abspath(os.path.join(os.path.dirname(__file__), "chrome_profile")) COOKIES_FILE = os.path.abspath(os.path.join(os.path.dirname(__file__), "vozp_cookies.json")) def load_cookies(context) -> int: """Načte dříve uložené cookies zpět do kontextu.""" if not os.path.exists(COOKIES_FILE): return 0 try: with open(COOKIES_FILE, "r", encoding="utf-8") as f: cookies = json.load(f) context.add_cookies(cookies) return len(cookies) except Exception as e: print(f" Chyba při načítání cookies: {e}") return 0 def save_cookies(context) -> int: """Uloží VoZP cookies (i session-only) do JSON souboru.""" try: all_cookies = context.cookies() vozp = [c for c in all_cookies if any( d in c.get("domain", "") for d in ["vozp.cz", "portalzp.cz"] )] with open(COOKIES_FILE, "w", encoding="utf-8") as f: json.dump(vozp, f, indent=2, ensure_ascii=False) return len(vozp) except Exception as e: print(f" Chyba při ukládání cookies: {e}") return 0 def _delete_chrome_cert_policy() -> None: """Smaže AutoSelectCertificateForUrls politiku — Chrome pak zobrazí dialog přirozeně.""" key_path = r"SOFTWARE\Policies\Google\Chrome\AutoSelectCertificateForUrls" try: key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, key_path, access=winreg.KEY_SET_VALUE) winreg.DeleteValue(key, "1") winreg.CloseKey(key) except Exception: pass def main() -> None: try: from playwright.sync_api import sync_playwright except ImportError: print("Chybí playwright: pip install playwright && playwright install chrome") sys.exit(1) _delete_chrome_cert_policy() with sync_playwright() as p: context = p.chromium.launch_persistent_context( user_data_dir=CHROME_PROFILE, channel="chrome", headless=False, slow_mo=200, ignore_https_errors=True, args=["--force-renderer-accessibility"], ) try: loaded = load_cookies(context) print(f"Profil: {CHROME_PROFILE}") print(f"Cookies z JSON: {loaded}") page = context.new_page() # Zkus rovnou inbox — pokud jsme přihlášeni, budeme tam print("Naviguji na schránku zpráv...") try: page.goto(INBOX_URL, wait_until="domcontentloaded", timeout=30_000) except Exception as e: print(f"Navigace: {e}") # Pokud nás přesměrovalo na login stránku if "prihlaseni" in page.url or "login" in page.url.lower(): print("Přihlašovací stránka — klikám na 'Přihlásit se certifikátem'...") try: page.goto(LOGIN_URL, wait_until="domcontentloaded", timeout=30_000) except Exception as e: print(f"Navigace na login: {e}") cert_btn = page.locator("button").filter(has_text="certifikátem").first cert_btn.wait_for(state="visible", timeout=10_000) cert_btn.click(no_wait_after=True) print("Vyskočí Signer komponenta — klikněte ANO (max 60 s)...") time.sleep(30) # Po Signeru naviguj na inbox print("Naviguji na schránku zpráv...") try: page.goto(INBOX_URL, wait_until="domcontentloaded", timeout=30_000) except Exception as e: print(f"Navigace po auth: {e}") if "prehled-zprav" not in page.url and "uvodni-stranka" not in page.url: print(f"Přihlášení selhalo. URL: {page.url}") return print(f"OK — přihlášení úspěšné. URL: {page.url}") # Diagnostika cookies after = context.cookies() vozp_cookies = [c for c in after if any( d in c.get("domain", "") for d in ["vozp.cz", "portalzp.cz"] )] print(f"Cookies po auth: {len(vozp_cookies)}") for c in vozp_cookies: exp = c.get("expires", -1) persistent = "PERSISTENT" if exp > 0 else "SESSION-ONLY" print(f" - {c['name'][:60]} ({c['domain']}) [{persistent}]") print("Okno zůstane otevřené. Stiskněte Enter pro zavření...") input() finally: saved = save_cookies(context) print(f"Uloženo {saved} VoZP cookies do {COOKIES_FILE}") context.close() if __name__ == "__main__": main()