""" Stahování seznamu registrovaných pojištěnců ČPZP. Použij po 01_prihlaseni.py (ten uloží cpzp_cookies.json). Co dělá: - Načte cookies z cpzp_cookies.json - Otevře prohlížeč jednou, projde všechny zadané měsíce - Pro každý měsíc vyplní formulář, klikne Hledat, stáhne soubor - Přeskočí měsíce kde soubor v cílovém adresáři už existuje - Uloží jako: YYYY-MM-DD f205MMRR.123 NASTAVENÍ: OD_MESIC / OD_ROK — první měsíc rozsahu DO_MESIC / DO_ROK — poslední měsíc rozsahu (včetně) """ import glob import json import os import sys import time from datetime import date from playwright.sync_api import sync_playwright sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "..", "..")) from Knihovny.najdi_dropbox import get_dropbox_root OD_MESIC = 12 OD_ROK = 2024 DO_MESIC = 3 DO_ROK = 2026 BASE_URL = "https://portal.cpzp.cz" COOKIES_FILE = os.path.join(os.path.dirname(__file__), "..", "..", "StahováníZpráv", "205 ČPZP", "cpzp_cookies.json") DEST_DIR = os.path.join( get_dropbox_root(), "Ordinace", "Dokumentace_ke_zpracování", "Zúčtovací zprávy", "205 ČPZP", ) def mesice_v_rozsahu(od_m, od_r, do_m, do_r): """Generuje (mesic, rok) od od_m/od_r do do_m/do_r včetně.""" m, r = od_m, od_r while (r, m) <= (do_r, do_m): yield m, r m += 1 if m > 12: m = 1 r += 1 def uz_stazeno(mesic: int, rok: int) -> bool: """Vrátí True pokud soubor pro daný měsíc/rok už existuje v DEST_DIR.""" mm = f"{mesic:02d}" rr = str(rok)[-2:] pattern = os.path.join(DEST_DIR, f"* f205{mm}{rr}.*") return bool(glob.glob(pattern)) def stahni_mesic(page, mesic: int, rok: int) -> bool: """Stáhne soubor pro jeden měsíc. Vrátí True pokud staženo.""" today = date.today().strftime("%Y-%m-%d") if uz_stazeno(mesic, rok): print(f" [{mesic:02d}/{rok}] přeskočeno — soubor už existuje") return False # Vyplň formulář inputs = page.query_selector_all("input[type=text]") if len(inputs) < 2: print(f" [{mesic:02d}/{rok}] CHYBA — inputy nenalezeny") return False inputs[0].fill(str(mesic)) inputs[1].fill(str(rok)) page.get_by_text("Hledat", exact=True).click() page.wait_for_load_state("networkidle") dl_selector = "a:has-text('Seznam registrovaných pojištěnců')" if not page.query_selector(dl_selector): print(f" [{mesic:02d}/{rok}] CHYBA — download odkaz nenalezen") return False with page.expect_download() as dl_info: page.click(dl_selector) download = dl_info.value original_name = download.suggested_filename dest_path = os.path.join(DEST_DIR, f"{today} {original_name}") download.save_as(dest_path) print(f" [{mesic:02d}/{rok}] OK — {os.path.basename(dest_path)}") return True def hlavni() -> None: if not os.path.exists(COOKIES_FILE): raise SystemExit(f"Soubor s cookies nenalezen: {COOKIES_FILE}\nNejdřív spusť 01_prihlaseni.py") with open(COOKIES_FILE, encoding="utf-8") as f: cookies = json.load(f) os.makedirs(DEST_DIR, exist_ok=True) mesice = list(mesice_v_rozsahu(OD_MESIC, OD_ROK, DO_MESIC, DO_ROK)) print(f"Celkem měsíců: {len(mesice)} ({OD_MESIC:02d}/{OD_ROK} – {DO_MESIC:02d}/{DO_ROK})") with sync_playwright() as p: browser = p.chromium.launch(headless=False) context = browser.new_context() context.add_cookies(cookies) page = context.new_page() print("Otevírám stránku klientely...") page.goto(f"{BASE_URL}/app/prohlizeni-klientely/") page.wait_for_load_state("networkidle") if "frmPrihlasCert" in page.content(): raise SystemExit("Cookies expirovala — nejdřív spusť 01_prihlaseni.py") stazeno = 0 for mesic, rok in mesice: if stahni_mesic(page, mesic, rok): stazeno += 1 time.sleep(2) browser.close() print(f"\nHotovo: {stazeno} staženo, {len(mesice) - stazeno} přeskočeno.") if __name__ == "__main__": hlavni()