Twitch stream notify bot for Telegram with Docker

Telegram port of the Discord notifier: tokenless decapi.me status checks,
photo+caption announce with inline link buttons, /stream_test command.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
This commit is contained in:
2026-07-13 11:39:33 +03:00
co-authored by Claude Opus 4.8
commit c63b51ff79
8 changed files with 356 additions and 0 deletions
+84
View File
@@ -0,0 +1,84 @@
# Twitch → Telegram Stream Notify Bot
Бот проверяет, вышел ли стример в эфир на Twitch, и при старте стрима
отправляет оповещение в указанный чат/канал Telegram.
Определение статуса работает через публичный [decapi.me](https://decapi.me) — **без Twitch-токенов**.
Это Telegram-версия [Discord-бота](../twitch_discord).
## Возможности
- Определение статуса стрима **без токенов Twitch** (публичный decapi.me)
- Оповещение **один раз** при переходе оффлайн → онлайн (без спама, пока стрим идёт)
- Сообщение с превью эфира, названием стрима и игрой
- Inline-кнопки под сообщением: **Twitch** и **Все ссылки**
- Команда `/stream_test` — тестовое оповещение
## Переменные окружения
| Переменная | Обязательна | Описание |
|---|---|---|
| `TELEGRAM_TOKEN` | ✅ | Токен бота из [@BotFather](https://t.me/BotFather) → `/newbot` |
| `NOTIFY_CHAT_ID` | ✅ | Куда слать: `@username` канала или числовой id чата/группы (напр. `-1001234567890`) |
| `TWITCH_LOGIN` | нет | Ник стримера из URL `twitch.tv/ЭТО`. По умолчанию `theraiwy` |
| `CHECK_INTERVAL` | нет | Интервал проверки в секундах. По умолчанию `60` |
Единственный обязательный секрет — `TELEGRAM_TOKEN`.
## Настройка Telegram-бота
1. Создайте бота у [@BotFather](https://t.me/BotFather) командой `/newbot`, получите токен.
2. **Добавьте бота в канал/группу как администратора** с правом отправлять сообщения —
иначе он не сможет писать в `NOTIFY_CHAT_ID`.
3. Укажите `NOTIFY_CHAT_ID`:
- для публичного канала — его `@username` (напр. `@theraiwy_streams`);
- для приватной группы/канала — числовой id (напр. через `@userinfobot` или
`@getidsbot`), для супергрупп/каналов он вида `-100...`.
### Как узнать числовой id чата
Добавьте бота в чат, напишите там любое сообщение и загляните в логи бота, либо
воспользуйтесь ботом `@getidsbot`.
## Запуск через Docker (рекомендуется)
```bash
cp .env.example .env # заполнить TELEGRAM_TOKEN и NOTIFY_CHAT_ID
docker compose up -d --build
```
Логи: `docker compose logs -f`
### Деплой в DockHand
`docker-compose.yml` читает значения из окружения через `${...}`, поэтому `.env`
в репозиторий не коммитится. В панели DockHand при создании стека задайте переменные
в разделе **Environment**:
```
TELEGRAM_TOKEN=твой_токен
NOTIFY_CHAT_ID=@your_channel
TWITCH_LOGIN=theraiwy
CHECK_INTERVAL=60
```
Обязательны только `TELEGRAM_TOKEN` и `NOTIFY_CHAT_ID` — у остальных есть значения по умолчанию.
## Запуск без Docker
```bash
pip install -r requirements.txt
cp .env.example .env # заполнить значения
python bot.py
```
## Команды
- `/stream_test` — отправить тестовое оповещение в целевой чат (помечается `🧪 [ТЕСТ]`).
## Как определяется стрим
Каждые `CHECK_INTERVAL` секунд бот опрашивает decapi.me (`uptime`, `title`, `game`).
При переходе оффлайн → онлайн отправляется оповещение. Публичный сервис может изредка
быть недоступен — в этом случае проверка пропускается и повторяется в следующем цикле,
бот не падает. Рекомендуемый интервал — **3060 секунд**.