diff --git a/Insurance/StahováníZpráv/111 VZP/01_prihlaseni.py b/Insurance/StahováníZpráv/111 VZP/01_prihlaseni.py index 5f10862..0a5b824 100644 --- a/Insurance/StahováníZpráv/111 VZP/01_prihlaseni.py +++ b/Insurance/StahováníZpráv/111 VZP/01_prihlaseni.py @@ -1,7 +1,13 @@ """ -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. +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 """ @@ -9,16 +15,33 @@ 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")) +# 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: - """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: @@ -32,7 +55,6 @@ def load_cookies(context) -> int: 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", "")] @@ -44,17 +66,6 @@ def save_cookies(context) -> int: 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 @@ -62,7 +73,7 @@ def main() -> None: print("Chybí playwright: pip install playwright && playwright install chrome") sys.exit(1) - _delete_chrome_cert_policy() + _set_chrome_cert_policy() with sync_playwright() as p: context = p.chromium.launch_persistent_context( @@ -74,15 +85,10 @@ def main() -> None: 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)}") + 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) @@ -90,39 +96,22 @@ def main() -> None: print(f"Navigace: {e}") if page.url.startswith("https://auth.vzp.cz/signin"): - print("Přihlašovací stránka — klikám na 'Certifikát'...") + 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) - print("Pokud se zobrazí dialog výběru certifikátu, vyberte ho ručně (max 60 s)...") - time.sleep(30) - - page = context.new_page() + # Chrome auto-vybere certifikát díky politice — čekáme jen na přesměrování try: - page.goto(INBOX_URL, wait_until="domcontentloaded", timeout=30_000) - except Exception as e: - print(f"Navigace po auth: {e}") + 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"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() + print(f"Přihlášení úspěšné. URL: {page.url}") finally: saved = save_cookies(context) diff --git a/Insurance/StahováníZpráv/111 VZP/04_prihlaseni_a_stahuj_nove.py b/Insurance/StahováníZpráv/111 VZP/04_prihlaseni_a_stahuj_nove.py index eed5f79..07ac8a9 100644 --- a/Insurance/StahováníZpráv/111 VZP/04_prihlaseni_a_stahuj_nove.py +++ b/Insurance/StahováníZpráv/111 VZP/04_prihlaseni_a_stahuj_nove.py @@ -2,9 +2,7 @@ Přihlásí se na VZP Point a stáhne nové zprávy. Kombinuje 01_prihlaseni.py + 03_stahuj_nove.py do jednoho spuštění. - -POZNÁMKA: 01_prihlaseni.py čeká na ruční výběr certifikátu a stisk Enter — -počkejte na výzvu, než se spustí stahování. +Přihlášení probíhá plně automaticky (Chrome auto-vybere certifikát). POUŽITÍ: python 04_prihlaseni_a_stahuj_nove.py diff --git a/Insurance/StahováníZpráv/stahuj_vse_pojistovny.py b/Insurance/StahováníZpráv/stahuj_vse_pojistovny.py new file mode 100644 index 0000000..c5d5886 --- /dev/null +++ b/Insurance/StahováníZpráv/stahuj_vse_pojistovny.py @@ -0,0 +1,70 @@ +""" +Orchestrační skript — stáhne nové zprávy ze všech pojišťoven po sobě. + +Spouští 04_prihlaseni_a_stahuj_nove.py v každém adresáři pojišťovny. +Pokud jedna pojišťovna selže, pokračuje dál na další. + +POUŽITÍ: + python stahuj_vse_pojistovny.py +""" + +import subprocess +import sys +import os +from datetime import datetime + +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) + +POJISTOVNY = [ + ("111 VZP", "VZP"), + ("205 ČPZP", "ČPZP"), + ("207 OZP", "OZP"), + ("209 ZPŠ", "ZPŠ"), + ("211 ZPMVČR", "ZPMVČR"), + ("213 RBP", "RBP"), +] + +SKRIPT = "04_prihlaseni_a_stahuj_nove.py" + + +def main() -> None: + start = datetime.now() + print(f"=== Stahování zpráv ze všech pojišťoven ===") + print(f"Spuštěno: {start.strftime('%Y-%m-%d %H:%M:%S')}\n") + + vysledky = [] + + for adresar, nazev in POJISTOVNY: + skript_path = os.path.join(BASE_DIR, adresar, SKRIPT) + if not os.path.exists(skript_path): + print(f"\n[{nazev}] PŘESKOČENO — skript nenalezen: {skript_path}") + vysledky.append((nazev, "přeskočeno")) + continue + + print(f"\n{'='*50}") + print(f" {nazev}") + print(f"{'='*50}") + + result = subprocess.run( + [sys.executable, skript_path], + cwd=os.path.join(BASE_DIR, adresar), + check=False, + ) + + if result.returncode == 0: + print(f"[{nazev}] OK") + vysledky.append((nazev, "OK")) + else: + print(f"[{nazev}] CHYBA (kód {result.returncode})") + vysledky.append((nazev, f"chyba (kód {result.returncode})")) + + elapsed = datetime.now() - start + print(f"\n{'='*50}") + print(f"Hotovo za {int(elapsed.total_seconds())} s") + print(f"{'='*50}") + for nazev, stav in vysledky: + print(f" {nazev:<12} {stav}") + + +if __name__ == "__main__": + main()