transmission-telegram
Управляйте Transmission через Telegram.
CLI
Установка
Просто скачайте подходящий бинарный файл для вашей ОС, поместите transmission-telegram в ваш $PATH и готово.
Или, если у вас установлен Go: go get -u github.com/pyed/transmission-telegram
Использование
Установка через Docker
Standalone
docker run -d --name transmission-telegram \
kevinhalpin/transmission-telegram:latest \
-token=<Ваш Токен Бота> \
-master=<Ваш Username> \
-url=<Transmission RPC> \
-username=<Transmission Если Нужно> \
-password=<Transmission Если Нужно>
Пример docker-compose
version: '2.4'
services:
transmission:
container_name: transmission
environment:
- PUID=${PUID_DOCKUSER}
- PGID=${PGID_APPZ}
image: linuxserver/transmission
network_mode: 'host'
hostname: 'transmission'
volumes:
- ${CONFIG}/transmission:/config
- ${DATA}/transmission/downloads:/downloads
telegram-transmission-bot:
container_name: telegram-transmission-bot
restart: on-failure
depends_on:
- transmission
- plex
- emby
network_mode: 'host'
image: kevinhalpin/transmission-telegram:latest
command: '-token=${TELEGRAM_TRANSMISSION_BOT} -master=${TELEGRAM_USERNAME} -url=${TRANSMISSION_URL} -username=${TRANSMISSION_USERNAME} -password=${PASS}'
Возможности
Этот проект представляет собой Telegram-бота для управления клиентом BitTorrent Transmission. Бот позволяет:
- Просмотр торрентов: список всех торрентов, фильтрация по статусу (загрузка, раздача, на паузе, проверка), поиск по имени или трекеру
- Управление торрентами: добавление (по URL, magnet-ссылке или файлу .torrent), запуск, остановка, удаление, проверка целостности
- Мониторинг: просмотр статистики, скорости загрузки/отдачи, информации о конкретных торрентах с live-обновлениями
- Настройки: установка лимитов скорости, изменение директории загрузки, сортировка торрентов
- Уведомления: автоматические уведомления о завершении загрузок через мониторинг RPC API (работает автоматически, без дополнительной настройки)
Бот работает только с авторизованными пользователями (masters), что обеспечивает безопасность управления вашими торрентами.
Архитектура проекта
Проект использует модульную архитектуру для улучшения поддерживаемости, тестируемости и расширяемости кода.
Структура проекта
transmission-telegram/
├── cmd/
│ └── bot/
│ └── main.go # Точка входа приложения
├── internal/
│ ├── config/ # Конфигурация приложения
│ │ ├── config.go # Загрузка и валидация конфигурации
│ │ └── constants.go # Константы приложения
│ ├── bot/ # Telegram бот
│ │ ├── bot.go # Основная структура бота
│ │ ├── handlers.go # Обработчики команд
│ │ ├── helpers.go # Вспомогательные функции
│ │ └── constants.go # Константы бота (HELP текст)
│ ├── transmission/ # Transmission клиент
│ │ ├── client.go # Кэшированный клиент с TTL
│ │ └── interfaces.go # Интерфейсы для тестируемости
│ ├── monitor/ # Мониторинг завершения торрентов
│ │ └── monitor.go # RPC polling мониторинг
│ ├── formatter/ # Форматирование сообщений
│ │ └── formatter.go # Форматирование торрентов для Telegram
│ └── logger/ # Логирование
│ └── logger.go # Логгер с маскированием секретов
├── pkg/
│ └── utils/ # Утилиты
│ └── markdown.go # Экранирование Markdown
├── main.go # Старый файл (legacy, для обратной совместимости)
├── Dockerfile # Docker образ
└── go.mod # Зависимости Go
Основные компоненты
internal/config
- Загрузка конфигурации из флагов и переменных окружения
- Валидация параметров при старте
- Безопасное хранение конфигурации
internal/bot
- Обработка Telegram обновлений
- Маршрутизация команд к соответствующим обработчикам
- Управление live-обновлениями сообщений
- Отправка сообщений с автоматическим разбиением на части
internal/transmission
- Обертка над Transmission RPC API
- Кэширование результатов запросов (TTL: 2 секунды)
- Автоматическая инвалидация кэша при изменениях
- Интерфейсы для упрощения тестирования
internal/monitor
- Мониторинг завершения торрентов через RPC polling
- Отслеживание изменения статусов торрентов
- Callback-уведомления о завершении загрузок
internal/formatter
- Единообразное форматирование информации о торрентах
- Поддержка различных форматов (краткий, детальный, для паузы и т.д.)
- Экранирование Markdown символов
internal/logger
- Централизованное логирование
- Автоматическое маскирование секретных данных (токены, пароли)
- Поддержка записи в файл или stdout
Преимущества новой архитектуры
- Модульность: Каждый компонент имеет четкую ответственность
- Тестируемость: Интерфейсы позволяют легко создавать mock-объекты
- Безопасность: Маскирование секретов в логах, валидация конфигурации
- Производительность: Кэширование API запросов, оптимизация live-обновлений
- Поддерживаемость: Устранено дублирование кода, улучшена читаемость
- Расширяемость: Легко добавлять новые команды и функции
Dependency Injection
Проект использует dependency injection вместо глобальных переменных:
- Все зависимости передаются через конструкторы
- Упрощает тестирование и изоляцию компонентов
- Позволяет легко заменять реализации (например, для тестов)
Настройка уведомлений о завершении загрузок
Бот автоматически отправляет уведомления в Telegram, когда торрент завершает загрузку. Для этого используется мониторинг через RPC API (рекомендуемый метод), который работает без дополнительной настройки.
Метод 1: Мониторинг через RPC API (рекомендуется) ⭐
Этот метод работает автоматически и не требует дополнительной настройки. Бот периодически опрашивает Transmission через RPC API и отслеживает изменение статуса торрентов с "Загрузка" на "Раздача".
Как это работает
- Автоматический запуск: Мониторинг запускается автоматически при старте бота
- Polling: Бот опрашивает статус торрентов каждые 10 секунд через RPC API
- Обнаружение завершения: При переходе торрента из статуса "Downloading" в "Seeding" (или при достижении 100% загрузки) отправляется уведомление
- Активация: Отправьте боту любое сообщение (например,
/help), чтобы он запомнил ваш chat ID для отправки уведомлений
Преимущества
- ✅ Не требует доступа к файловой системе
- ✅ Не требует настройки логирования в Transmission
- ✅ Работает в любой конфигурации (Docker, standalone, и т.д.)
- ✅ Более надежный и быстрый метод
- ✅ Не зависит от формата логов
Пример уведомления
Когда торрент завершит загрузку, вы получите сообщение вида:
✅ Completed: My-Torrent-Name
Метод 2: Мониторинг через лог-файл (альтернативный)
Альтернативный метод - мониторинг лог-файла Transmission. Этот метод требует дополнительной настройки, но может быть полезен в некоторых случаях.
Шаг 1: Включение логирования в Transmission
- Откройте настройки Transmission (через веб-интерфейс или конфигурационный файл
settings.json) - Включите логирование, установив параметр
"message-level": 2(или выше) вsettings.json - Убедитесь, что логирование включено:
"logging-enabled": true
Для Docker-контейнера Transmission (linuxserver/transmission) логи обычно находятся в:
/config/transmission.log(внутри контейнера)${CONFIG}/transmission/transmission.log(на хосте, если смонтирован volume)
Пример настройки в settings.json:
{
"logging-enabled": true,
"message-level": 2
}
Шаг 2: Настройка бота для мониторинга логов
Добавьте параметр -transmission-logfile с путем к лог-файлу Transmission при запуске бота.
Для CLI:
transmission-telegram \
-token=<Ваш Токен Бота> \
-master=<Ваш Username> \
-url=<Transmission RPC> \
-transmission-logfile=/path/to/transmission.log
Для Docker Standalone:
docker run -d --name transmission-telegram \
-v /path/to/transmission.log:/transmission.log:ro \
kevinhalpin/transmission-telegram:latest \
-token=<Ваш Токен Бота> \
-master=<Ваш Username> \
-url=<Transmission RPC> \
-transmission-logfile=/transmission.log
Для docker-compose:
version: '2.4'
services:
transmission:
container_name: transmission
environment:
- PUID=${PUID_DOCKUSER}
- PGID=${PGID_APPZ}
image: linuxserver/transmission
network_mode: 'host'
hostname: 'transmission'
volumes:
- ${CONFIG}/transmission:/config
- ${DATA}/transmission/downloads:/downloads
telegram-transmission-bot:
container_name: telegram-transmission-bot
restart: on-failure
depends_on:
- transmission
network_mode: 'host'
image: kevinhalpin/transmission-telegram:latest
volumes:
- ${CONFIG}/transmission/transmission.log:/transmission.log:ro
command: >
-token=${TELEGRAM_TRANSMISSION_BOT}
-master=${TELEGRAM_USERNAME}
-url=${TRANSMISSION_URL}
-username=${TRANSMISSION_USERNAME}
-password=${PASS}
-transmission-logfile=/transmission.log
Шаг 3: Активация уведомлений
Важно: После запуска бота с параметром -transmission-logfile, отправьте боту любое сообщение (например, /help или list). Это необходимо для того, чтобы бот запомнил ваш chat ID и мог отправлять уведомления.
Как это работает
Бот мониторит указанный лог-файл в реальном времени и ищет строки с паттерном "Incomplete" to "Complete", которые Transmission записывает при завершении загрузки торрента. При обнаружении такой строки бот автоматически извлекает имя завершенного торрента и отправляет уведомление в Telegram.
Пример строки в логе Transmission:
[2017-02-22 21:00:00.898] My-Torrent-Name State changed from "Incomplete" to "Complete" (torrent.c:2218)
Устранение проблем
Устранение проблем (метод через лог-файл)
-
Уведомления не приходят:
- Убедитесь, что логирование включено в Transmission (
logging-enabled: true) - Проверьте, что путь к лог-файлу указан правильно
- Убедитесь, что бот имеет доступ на чтение к лог-файлу
- Отправьте боту сообщение после запуска, чтобы он запомнил ваш chat ID
- Убедитесь, что логирование включено в Transmission (
-
Лог-файл не найден:
- Проверьте путь к файлу в настройках Transmission
- Для Docker: убедитесь, что volume с лог-файлом смонтирован правильно
- Проверьте права доступа к файлу
-
Бот не видит изменения в логе:
- Убедитесь, что Transmission действительно пишет в указанный файл
- Проверьте уровень логирования (
message-levelдолжен быть 2 или выше)
Устранение проблем (метод через RPC API)
-
Уведомления не приходят:
- Убедитесь, что бот имеет доступ к Transmission RPC API
- Проверьте, что Transmission работает и доступен по указанному URL
- Отправьте боту сообщение после запуска, чтобы он запомнил ваш chat ID
- Проверьте логи бота на наличие ошибок подключения к Transmission
-
Задержка уведомлений:
- Бот опрашивает статус каждые 10 секунд, поэтому может быть небольшая задержка
- Это нормальное поведение и не требует настройки