Skip to content

Runbook: Telegram Bridge

Přehled

Relay API zprávy pro Libora (fronta fess) se přeposílají do Telegramu přes bota. Libor může odpovídat inline a odpovědi se routují zpět k původnímu odesílateli.

Komponenty

Script Cron Funkce
/root/scripts/relay-to-telegram.sh */5 * * * * fess fronta → Telegram bot
/root/scripts/telegram-callbacks.sh */1 * * * * button clicks + reply → zpět odesílateli

Credentials

  • Soubor: /root/secrets/telegram/.env
  • Proměnné: BOT_TOKEN, CHAT_ID
  • NIKDY nesdílet přes Relay API

Message map

  • Soubor: /root/secrets/telegram/message-map.json
  • Mapuje Telegram msg_id{from, subject, type}
  • Používá se pro routing odpovědí zpět k odesílateli

Inline keyboard (buttons)

Zprávy mohou obsahovat inline tlačítka:

{"body": "Text zprávy\n\n[BUTTONS:{\"inline_keyboard\":[[{\"text\":\"Ano\",\"callback_data\":\"approve\"},{\"text\":\"Ne\",\"callback_data\":\"reject\"}]]}]"}
  • telegram-callbacks.sh zpracovává callback_data
  • Odpověď se posílá zpět přes Relay API jako zpráva pro původního odesílatele

Diagnostika

# Logy relay-to-telegram
grep "relay-to-telegram" /var/log/syslog | tail -20

# Logy callbacks
grep "telegram-callbacks" /var/log/syslog | tail -20

# Test bota
source /root/secrets/telegram/.env
curl -s "https://api.telegram.org/bot${BOT_TOKEN}/getMe" | python3 -m json.tool

# Poslední zprávy bota
curl -s "https://api.telegram.org/bot${BOT_TOKEN}/getUpdates?limit=5" | python3 -m json.tool

# Message map (poslední záznamy)
tail -5 /root/secrets/telegram/message-map.json

# Cron aktivní?
crontab -l | grep telegram

Ruční odeslání Telegram zprávy

source /root/secrets/telegram/.env
curl -s -X POST "https://api.telegram.org/bot${BOT_TOKEN}/sendMessage" \
  -d chat_id="${CHAT_ID}" \
  -d text="Test zpráva" \
  -d parse_mode="HTML"

Známé problémy

  • Relay API peek (GET /api/messages/) označuje zprávy jako read — proto relay-to-telegram.sh používá /api/history/ s filtrováním podle timestampu
  • Pokud message-map.json roste příliš → rotovat (archivovat staré záznamy)