Files
Vladimir Buzalka ffb3db1e07 notebookvb
2026-05-04 21:26:44 +02:00

136 lines
4.1 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
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()