z230
This commit is contained in:
@@ -0,0 +1,90 @@
|
||||
# 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`.
|
||||
Reference in New Issue
Block a user