notebookvb
This commit is contained in:
@@ -0,0 +1,135 @@
|
||||
"""
|
||||
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()
|
||||
Reference in New Issue
Block a user