91 lines
4.6 KiB
Markdown
91 lines
4.6 KiB
Markdown
# Webináře — hlídač nových webinářů (praktickylekar.online)
|
|
|
|
## Účel
|
|
Jednou denně (8:00, Plánovač úloh) zkontroluje [praktickylekar.online](https://www.praktickylekar.online/),
|
|
zda přibyl nový webinář. Když ano → přes **Telegram** se zeptá, jestli má přihlásit
|
|
osoby z `config.json` (Michaela + Vladimír Buzalkovi), po potvrzení je přihlásí a
|
|
výsledek pošle zpět na Telegram. Po přihlášení chodí potvrzovací e-mail automaticky z webu.
|
|
|
|
## Soubory
|
|
| Soubor | Popis |
|
|
|--------|-------|
|
|
| `watcher.py` | hlavní skript |
|
|
| `config.json` | URL + údaje přihlašovaných osob |
|
|
| `state.json` | vytvoří se sám; pamatuje poslední zpracované `idwebinar` |
|
|
| `watcher.log` | log běhů |
|
|
|
|
## Přepínače v `watcher.py` (nahoře)
|
|
- `POSILATINFOPOKAZDEKONTROLE` — `True` = pošle Telegram zprávu po **každé** ranní
|
|
kontrole (i když nic nového; vhodné při zaběhávání). `True` je teď nastaveno.
|
|
Až bude vše ověřené → přepnout na `False` (ozve se jen při novém webináři).
|
|
- `DRY_RUN` — `True` = nic se reálně neodešle (registrace se jen simuluje), Telegram
|
|
dotaz proběhne. `False` = ostrý režim (reálné přihlášení po potvrzení „ano").
|
|
- `ASK_TIMEOUT` — kolik sekund ráno čekat na odpověď ano/ne (default 1800 = 30 min).
|
|
|
|
## CLI
|
|
```
|
|
python watcher.py # ostrý denní běh
|
|
python watcher.py --test # ignoruje state + VŽDY dry-run (otestuje plumbing)
|
|
python watcher.py --reset # smaže state.json
|
|
```
|
|
|
|
## Ověřená struktura webu (k 2026-06-17)
|
|
1. **Banner** na hlavní stránce: `<a href="/webinar.php?idwebinar=560">` → z něj se čte ID.
|
|
2. **Brána** `POST /check2.php` s `zdravotnicky-pracovnik=on` & `laicka-verejnost=on`
|
|
→ nastaví cookie `souhlas=1`. **Bez ní se registrační formulář vůbec nezobrazí.**
|
|
3. **Registrace** `POST /registrovat4.php`, pole:
|
|
- `email` (povinné)
|
|
- `clen` = `1` (člen SVL Ano) / `2` (Ne) → Buzalkovi `1`
|
|
- `prukaz` = číslo průkazu SVL (povinné když clen=1)
|
|
- `clk` = evidenční číslo ČLK, **přesně 10 znaků** (`pattern=.{10,10}`)
|
|
- `titul1, jmeno, prijmeni, pracoviste, mesto` — jen pro nečleny (clen=2)
|
|
- `souhlas` = `on` (souhlas se zpracováním OÚ, povinné)
|
|
- **skrytá** `webid` (= idwebinar) a `cislo` (= `PL` + DDMMRRRR, dle data webináře)
|
|
→ **čtou se živě z formuláře, nehádají se.**
|
|
|
|
> Pokud provozovatel změní názvy polí / strukturu, skript loguje, co našel
|
|
> (`watcher.log`) — podle toho se selektory upraví.
|
|
|
|
## Nasazení na tower (PRODUKCE) — Unraid, python-runner
|
|
|
|
Běží na **toweru** (Unraid, 192.168.1.76) v kontejneru **`python-runner`**,
|
|
plánováno přes **User Scripts plugin** na **8:00 denně**.
|
|
|
|
- Soubory: `/mnt/user/Scripts/Webinare/` → v kontejneru `/scripts/Webinare/`
|
|
- Telegram: na serveru **není** `Knihovny/` ani `Medevio/.env`, proto je přibalená
|
|
kopie `telegram_notify.py` + lokální `/scripts/Webinare/.env`
|
|
(jen `TELEGRAM_BOT_TOKEN` + `TELEGRAM_CHAT_ID`, práva 600).
|
|
- Wrapper: `/boot/config/plugins/user.scripts/scripts/WebinarWatcher/script`
|
|
(`flock` + `docker exec`, log `/mnt/user/Scripts/logs/webinar_watcher.log`).
|
|
- Rozvrh: záznam v `schedule.json` (`custom: 0 8 * * *`) + řádek v
|
|
`customSchedule.cron` → `update_cron` → `/etc/cron.d/root`.
|
|
- `state.json` na serveru seedován na `560` (na ten jste registrovaní).
|
|
|
|
### Nasazení / správa z Windows — `deploy_tower.py`
|
|
Heslo NIKDY v souboru, bere se z env `TOWER_PW`:
|
|
```bash
|
|
TOWER_PW=... python deploy_tower.py recon # zmapuje server (jen čte)
|
|
TOWER_PW=... python deploy_tower.py deploy # nahraje soubory (+ seed state.json)
|
|
TOWER_PW=... python deploy_tower.py env # naplní serverový .env z Medevio/.env
|
|
TOWER_PW=... python deploy_tower.py smoke # test: telegram .env + detekce (neodesílá)
|
|
TOWER_PW=... python deploy_tower.py schedule # založí/aktualizuje rozvrh 8:00
|
|
TOWER_PW=... python deploy_tower.py prodrun # ruční spuštění ostrého běhu
|
|
```
|
|
Po změně `watcher.py`/`config.json` lokálně → `deploy` znovu (idempotentní,
|
|
`state.json` ani `.env` nepřepisuje).
|
|
|
|
### Heartbeat → tichý režim
|
|
Server běží s `POSILATINFOPOKAZDEKONTROLE=True` (ranní „zkontrolováno"). Až bude
|
|
ověřeno, v lokálním `watcher.py` přepnout na `False` a `deploy` znovu.
|
|
|
|
## Alternativa — Plánovač úloh (Windows), pokud poběží lokálně
|
|
```powershell
|
|
schtasks /Create /TN "WebinarWatcher" /SC DAILY /ST 08:00 ^
|
|
/TR "python \"U:\ordinaceprojekt\Webináře\watcher.py\"" /F
|
|
```
|
|
|
|
## Notifikace
|
|
Přes sdílenou knihovnu `Knihovny/telegram_notify.py`
|
|
(`posli_telegram`, `zeptej_se_telegram`), bot **@Vlado_Claude_Bot**,
|
|
token/chat_id z `Medevio/.env`.
|