""" 01 - Přihlášení na VZP Point (plně automatizované) Jak to funguje: 1. Nastaví Chrome politiku AutoSelectCertificateForUrls — Chrome vybere certifikát automaticky bez dialogu (certifikát musí být v Windows store) 2. Otevře Chrome, klikne na 'Certifikát', počká na přesměrování a uloží cookies Certifikát ve Windows store: MUDr. Michaela Buzalková (I.CA EU Qualified CA2, platný do 16.1.2027) Použití: python 01_prihlaseni.py """ import json import os import re import sys 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")) # Issuer CN certifikátu v Windows store (CurrentUser\My) CERT_ISSUER_CN = "I.CA EU Qualified CA2/RSA 06/2022" def _set_chrome_cert_policy() -> None: """Nastaví Chrome politiku AutoSelectCertificateForUrls pro vzp.cz.""" policy = json.dumps({ "pattern": "https://[*.]vzp.cz", "filter": {"ISSUER": {"CN": CERT_ISSUER_CN}}, }) key_path = r"SOFTWARE\Policies\Google\Chrome\AutoSelectCertificateForUrls" try: key = winreg.CreateKey(winreg.HKEY_CURRENT_USER, key_path) winreg.SetValueEx(key, "1", 0, winreg.REG_SZ, policy) winreg.CloseKey(key) print(f" Chrome politika nastavena (issuer: {CERT_ISSUER_CN})") except Exception as e: print(f" Varování: nelze nastavit Chrome politiku: {e}") def load_cookies(context) -> int: 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: 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 main() -> None: try: from playwright.sync_api import sync_playwright except ImportError: print("Chybí playwright: pip install playwright && playwright install chrome") sys.exit(1) _set_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"Cookies z JSON: {loaded}") 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' (Chrome auto-vybere)...") 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) # Chrome auto-vybere certifikát díky politice — čekáme jen na přesměrování try: page.wait_for_url("https://point.vzp.cz/**", timeout=30_000) except Exception: print(f" Timeout čekání na přesměrování. URL: {page.url}") if not page.url.startswith("https://point.vzp.cz"): print(f"Přihlášení selhalo. URL: {page.url}") return print(f"Přihlášení úspěšné. URL: {page.url}") finally: saved = save_cookies(context) print(f"Uloženo {saved} VZP cookies do {COOKIES_FILE}") context.close() if __name__ == "__main__": main()