136 lines
4.1 KiB
Python
136 lines
4.1 KiB
Python
"""
|
||
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()
|