Files
transmission-telegram/README.md

317 lines
17 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# transmission-telegram
#### Управляйте Transmission через Telegram.
<img src="https://raw.github.com/pyed/transmission-telegram/master/demo.gif" width="400" />
## CLI
### Установка
Просто [скачайте](https://github.com/pyed/transmission-telegram/releases) подходящий бинарный файл для вашей ОС, поместите `transmission-telegram` в ваш `$PATH` и готово.
Или, если у вас установлен `Go`: `go get -u github.com/pyed/transmission-telegram`
## Использование
[Wiki](https://github.com/pyed/transmission-telegram/wiki)
## Установка через Docker
### Standalone
```bash
docker run -d --name transmission-telegram \
kevinhalpin/transmission-telegram:latest \
-token=<Ваш Токен Бота> \
-master=<Ваш Username> \
-url=<Transmission RPC> \
-username=<Transmission Если Нужно> \
-password=<Transmission Если Нужно>
```
### Пример docker-compose
```yaml
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 и отслеживает изменение статуса торрентов с "Загрузка" на "Раздача".
#### Как это работает
1. **Автоматический запуск**: Мониторинг запускается автоматически при старте бота
2. **Polling**: Бот опрашивает статус торрентов каждые 10 секунд через RPC API
3. **Обнаружение завершения**: При переходе торрента из статуса "Downloading" в "Seeding" (или при достижении 100% загрузки) отправляется уведомление
4. **Активация**: Отправьте боту любое сообщение (например, `/help`), чтобы он запомнил ваш chat ID для отправки уведомлений
#### Преимущества
-Не требует доступа к файловой системе
-Не требует настройки логирования в Transmission
- ✅ Работает в любой конфигурации (Docker, standalone, и т.д.)
- ✅ Более надежный и быстрый метод
-Не зависит от формата логов
#### Пример уведомления
Когда торрент завершит загрузку, вы получите сообщение вида:
```
✅ Completed: My-Torrent-Name
```
### Метод 2: Мониторинг через лог-файл (альтернативный)
Альтернативный метод - мониторинг лог-файла Transmission. Этот метод требует дополнительной настройки, но может быть полезен в некоторых случаях.
#### Шаг 1: Включение логирования в Transmission
1. Откройте настройки Transmission (через веб-интерфейс или конфигурационный файл `settings.json`)
2. Включите логирование, установив параметр `"message-level": 2` (или выше) в `settings.json`
3. Убедитесь, что логирование включено: `"logging-enabled": true`
Для Docker-контейнера Transmission (linuxserver/transmission) логи обычно находятся в:
- `/config/transmission.log` (внутри контейнера)
- `${CONFIG}/transmission/transmission.log` (на хосте, если смонтирован volume)
**Пример настройки в `settings.json`:**
```json
{
"logging-enabled": true,
"message-level": 2
}
```
#### Шаг 2: Настройка бота для мониторинга логов
Добавьте параметр `-transmission-logfile` с путем к лог-файлу Transmission при запуске бота.
#### Для CLI:
```bash
transmission-telegram \
-token=<Ваш Токен Бота> \
-master=<Ваш Username> \
-url=<Transmission RPC> \
-transmission-logfile=/path/to/transmission.log
```
#### Для Docker Standalone:
```bash
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:
```yaml
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
- Для Docker: убедитесь, что volume с лог-файлом смонтирован правильно
- Проверьте права доступа к файлу
- **Бот не видит изменения в логе**:
- Убедитесь, что Transmission действительно пишет в указанный файл
- Проверьте уровень логирования (`message-level` должен быть 2 или выше)
#### Устранение проблем (метод через RPC API)
- **Уведомления не приходят**:
- Убедитесь, что бот имеет доступ к Transmission RPC API
- Проверьте, что Transmission работает и доступен по указанному URL
- Отправьте боту сообщение после запуска, чтобы он запомнил ваш chat ID
- Проверьте логи бота на наличие ошибок подключения к Transmission
- **Задержка уведомлений**:
- Бот опрашивает статус каждые 10 секунд, поэтому может быть небольшая задержка
- Это нормальное поведение и не требует настройки