Files
2026-06-17 11:53:54 +02:00

4.6 KiB

Webináře — hlídač nových webinářů (praktickylekar.online)

Účel

Jednou denně (8:00, Plánovač úloh) zkontroluje 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)

  • POSILATINFOPOKAZDEKONTROLETrue = 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_RUNTrue = 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.cronupdate_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:

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ě

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.