notebookvb

This commit is contained in:
Vladimir Buzalka
2026-05-13 07:43:33 +02:00
parent 1619d78241
commit 71b8ed676a
5 changed files with 278 additions and 50 deletions
@@ -2,37 +2,49 @@
## Co skript dělá
`PodejZadostSeznamZPS.py` podává žádost o výpis registrovaných pojištěnců ZPŠ
za jeden měsíc (poslední den daného měsíce). Bez prohlížeče, bez NMSigneru — čistý Python.
`PodejZadostSeznamZPS.py` provede v jednom spuštění tři kroky:
## Flow
1. **Přihlásí se** certifikátem na portál ZPŠ (čistý Python, bez NMSigneru)
— uloží cookies do sdíleného `StahováníZpráv/209 ZPŠ/zps_cookies.json`
1. **Přihlášení** — stejný certifikátový login jako ostatní ZPŠ skripty (`01_prihlaseni.py`):
- GET `/app/prihlaseni` → session cookie
- POST `/json-api/prihlaseni/prihlasovaci-zprava` → challenge (`zprava`)
- Podpis challenge certifikátem (PKCS7/SHA-256, **s** certifikátem)
- POST `/json-api/prihlaseni/prihlaseni-certifikatem` → autentizovaná session
2. **Stáhne nové výpisy pojištěnců** ze schránky `schranka-vypis-pojistencu-v-kapitaci`
— stahuje jen `.001` soubory, jejichž obsah začíná `H09305001`
— ukládá do `U:\Dropbox\Ordinace\Dokumentace_ke_zpracování\Zúčtovací zprávy\SeznamyPojištěnců\`
— zastaví se při první již stažené zprávě
— po stahování se **znovu přihlásí** (Playwright invaliduje předchozí requests session)
2. **Sestavení XML žádosti**:
```xml
<SchrankaZadost NazevSchranky="VypisPojKap" NazevFiltru="ZZ_VYP_REG">
<PolozkaFiltru Nazev="icz">25520</PolozkaFiltru>
<PolozkaFiltru Nazev="datum">DD.MM.YYYY</PolozkaFiltru>
<PolozkaFiltru Nazev="razeni">jmeno</PolozkaFiltru>
<PolozkaFiltru Nazev="typ">soubor</PolozkaFiltru>
</SchrankaZadost>
```
Konce řádků: `\r\n` (NMSigner normalizace)
3. **Podá žádost** o výpis pro 1 následující měsíc (poslední den daného měsíce)
3. **Podpis XML** — PKCS7/SHA-256, **bez** certifikátu v podpisu (`NoCerts`):
- Server při odesílání formuláře zná certifikát z registrace
- Certifikát v podpisu server odmítá ("Podepsaná data obsahují certifikát")
- Rozdíl oproti přihlášení: login certifikát potřebuje, formulář ne
## Flow přihlášení
4. **Odeslání**:
- POST `https://portal.zpskoda.cz/json-api/formular-schranky/29-vypis-registrov-pojistencu/ulozit-formular`
- Body: `{"schrXml": "...", "schrSign": "-----BEGIN PKCS7-----...", "schrFiles": []}`
- Odpověď obsahuje referenční číslo podání
1. GET `/app/prihlaseni` → session cookie
2. POST `/json-api/prihlaseni/prihlasovaci-zprava` → challenge (`zprava`)
3. Podpis challenge certifikátem (PKCS7/SHA-256, **s** certifikátem)
4. POST `/json-api/prihlaseni/prihlaseni-certifikatem` → autentizovaná session
## Sestavení XML žádosti
```xml
<SchrankaZadost NazevSchranky="VypisPojKap" NazevFiltru="ZZ_VYP_REG">
<PolozkaFiltru Nazev="icz">25520</PolozkaFiltru>
<PolozkaFiltru Nazev="datum">DD.MM.YYYY</PolozkaFiltru>
<PolozkaFiltru Nazev="razeni">jmeno</PolozkaFiltru>
<PolozkaFiltru Nazev="typ">soubor</PolozkaFiltru>
</SchrankaZadost>
```
Konce řádků: `\r\n` (NMSigner normalizace)
## Podpis XML
PKCS7/SHA-256, **bez** certifikátu v podpisu (`NoCerts`):
- Server při odesílání formuláře zná certifikát z registrace
- Certifikát v podpisu server odmítá ("Podepsaná data obsahují certifikát")
- Rozdíl oproti přihlášení: login certifikát potřebuje, formulář ne
## Odeslání
POST `https://portal.zpskoda.cz/json-api/formular-schranky/29-vypis-registrov-pojistencu/ulozit-formular`
Body: `{"schrXml": "...", "schrSign": "-----BEGIN PKCS7-----...", "schrFiles": []}`
## Klíčový objev
@@ -45,13 +57,13 @@ Výsledek: žádný prohlížeč ani NMSigner není potřeba.
| Soubor | Popis |
|--------|-------|
| `PodejZadostSeznamZPS.py` | Hlavní skript — přihlášení + podání žádosti |
| `PodejZadostSeznamZPS.py` | Hlavní skript — stažení výpisů + podání žádosti |
| `stav.json` | Poslední úspěšně podaný měsíc `{"mesic": 4, "rok": 2026}` |
| `log_podani.json` | Historie podání s referenčními čísly |
## Parametry
- **IČZ**: 25520 (IČZ: 09305000, MUDr. Michaela Buzalková)
- **IČZ**: 25520 (IČP: 09305001, MUDr. Michaela Buzalková)
- **Certifikát**: `Insurance/Certificates/MBQualifiedCert.pfx`
- **Typ výstupu**: `soubor` (Soubor dle datového rozhraní)
- **Řazení**: `jmeno` (příjmení a jména)