""" 01 - Přihlášení na VZP Point (Inbox) Otevře Chrome, přihlásí se certifikátem 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 re import sys import time import winreg INBOX_URL = "https://point.vzp.cz/Inbox/Message" 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__), "vzp_cookies.json")) def load_cookies(context) -> int: """Načte dříve uložené cookies (včetně session-only) 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ží VZP cookies (i session-only) do JSON souboru.""" try: all_cookies = context.cookies() vzp = [c for c in all_cookies if "vzp.cz" in c.get("domain", "")] with open(COOKIES_FILE, "w", encoding="utf-8") as f: json.dump(vzp, f, indent=2, ensure_ascii=False) return len(vzp) 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: # Načti dříve uložené cookies (vč. session-only) z JSON loaded = load_cookies(context) startup = context.cookies() vzp_start = [c for c in startup if "vzp.cz" in c.get("domain", "")] print(f"Profil: {CHROME_PROFILE}") print(f"Cookies z JSON: {loaded}, VZP v kontextu: {len(vzp_start)}") page = context.new_page() print("Naviguji na VZP Point...") try: page.goto(INBOX_URL, wait_until="domcontentloaded", timeout=30_000) except Exception as e: print(f"Navigace: {e}") if page.url.startswith("https://auth.vzp.cz/signin"): print("Přihlašovací stránka — klikám na 'Certifikát'...") cert_btn = page.locator("a, button").filter(has_text=re.compile(r"certifikát", re.I)).first cert_btn.wait_for(state="visible", timeout=10_000) cert_btn.click(no_wait_after=True) print("Pokud se zobrazí dialog výběru certifikátu, vyberte ho ručně (max 60 s)...") time.sleep(30) page = context.new_page() try: page.goto(INBOX_URL, wait_until="domcontentloaded", timeout=30_000) except Exception as e: print(f"Navigace po auth: {e}") if not page.url.startswith("https://point.vzp.cz"): print(f"Přihlášení selhalo. URL: {page.url}") return print(f"OK — přihlášení úspěšné. URL: {page.url}") # Diagnostika: cookies po auth after = context.cookies() vzp_after = [c for c in after if "vzp.cz" in c.get("domain", "")] print(f"Cookies po auth: VZP: {len(vzp_after)}") for c in vzp_after: exp = c.get("expires", -1) persistent = "PERSISTENT" if exp > 0 else "SESSION-ONLY" # Zkrácený název pro přehlednost name = c["name"][:60] print(f" - {name} ({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} VZP cookies do {COOKIES_FILE}") context.close() if __name__ == "__main__": main()