Обновлена архитектура и документация: добавлены новые сервисы для TikTok и Yapfiles, обновлены порты для всех загрузчиков, улучшена локализация и добавлены команды бота. Обновлены инструкции по запуску и настройке.

This commit is contained in:
vrubelroman 2025-12-12 12:39:11 +03:00
parent da98462bbc
commit 77d3704909
2 changed files with 252 additions and 611 deletions

View file

@ -6,10 +6,12 @@
Система состоит из микросервисной архитектуры с раздельными сервисами для каждого источника видео: Система состоит из микросервисной архитектуры с раздельными сервисами для каждого источника видео:
1. **Основной бот** (`bot.py` в корне проекта) — Telegram бот, обрабатывающий запросы пользователей и оркестрирующий запросы к сервисам 1. **Основной бот** (`bot.py`) — Telegram бот, обрабатывающий запросы пользователей
2. **YouTube Downloader Service** (`youtube-downloader/`) — микросервис для скачивания видео с YouTube 2. **YouTube Downloader Service** (`youtube-downloader/`) — порт 5557
3. **Instagram Downloader Service** (`instagram-downloader/`) — микросервис для скачивания видео с Instagram 3. **Instagram Downloader Service** (`instagram-downloader/`) — порт 5556
4. **VK Downloader Service** (`vk-downloader/`) — микросервис для скачивания видео с VK 4. **VK Downloader Service** (`vk-downloader/`) — порт 5555
5. **Yapfiles Downloader Service** (`yapfiles-downloader/`) — порт 5558
6. **TikTok Downloader Service** (`tiktok-downloader/`) — порт 5559
``` ```
┌─────────────────┐ ┌─────────────────┐
@ -17,231 +19,112 @@
└────────┬────────┘ └────────┬────────┘
┌─────────────────────────────────────┐ ┌─────────────────────────────────────────────────────────
│ Основной бот (bot.py) │ │ Основной бот (bot.py) │
│ ┌───────────────────────────────┐ │ ┌────────────────────────────────────────────────────┐ │
│ │ Message Handler │ │ │ │ Message Handler │ │
│ │ - URL extraction │ │ │ │ - URL extraction │ │
│ │ - Source detection │ │ │ │ - Source detection (YouTube/Instagram/TikTok/VK/ │ │
│ └───────────────────────────────┘ │ │ │ Yapfiles) │ │
│ ┌───────────────────────────────┐ │ │ │ - Localization (ru/en) │ │
│ │ HTTP API Clients │──┼──┐ │ └────────────────────────────────────────────────────┘ │
│ │ - YouTube API Client │ │ │ │ ┌────────────────────────────────────────────────────┐ │
│ │ - Instagram API Client │ │ │ │ │ HTTP API Clients (httpx) │ │
│ │ - VK API Client │ │ │ │ │ - YouTube, Instagram, TikTok, VK, Yapfiles │ │
│ └───────────────────────────────┘ │ │ │ └────────────────────────────────────────────────────┘ │
│ ┌───────────────────────────────┐ │ │ │ ┌────────────────────────────────────────────────────┐ │
│ │ SQLite Database │ │ │ │ │ SQLite Database (data/bot.db) │ │
│ │ - Users │ │ │ │ │ - users (chat_id, username, locale, ...) │ │
│ │ - Stats │ │ │ │ │ - stats (total_downloads) │ │
│ └───────────────────────────────┘ │ │ │ └────────────────────────────────────────────────────┘ │
│ ┌───────────────────────────────┐ │ │ └─────────────────────────────────────────────────────────┘
│ │ Video Storage │ │ │ │ HTTP POST /download/stream
│ │ - video/ directory │ │ │
│ └───────────────────────────────┘ │ │ ┌────────┬────────┬────────┬────────┬────────┐
└─────────────────────────────────────┘ │ │YouTube │Instagram│ TikTok │ VK │Yapfiles│
│ HTTP API │ :5557 │ :5556 │ :5559 │ :5555 │ :5558 │
│ POST /download/stream │ │ │ │ │ │
│yt-dlp │yt-dlp │yt-dlp │yt-dlp │requests│
┌──────────────────────────────────┼──────────────────┐ │ │+cookies│ │ │+parsing│
│ │ │ └────────┴────────┴────────┴────────┴────────┘
▼ ▼ ▼
┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐
│ YouTube Downloader│ │Instagram Download│ │ VK Downloader │
│ Service │ │ Service │ │ Service │
│ ┌──────────────┐ │ │ ┌──────────────┐ │ │ ┌──────────────┐│
│ │ Flask API │ │ │ │ Flask API │ │ │ │ Flask API ││
│ └──────────────┘ │ │ └──────────────┘ │ │ └──────────────┘│
│ ┌──────────────┐ │ │ ┌──────────────┐ │ │ ┌──────────────┐│
│ │ yt-dlp │ │ │ │ yt-dlp │ │ │ │ yt-dlp ││
│ │ (YouTube) │ │ │ │ (Instagram) │ │ │ │ (VK only) ││
│ └──────────────┘ │ │ └──────────────┘ │ │ └──────────────┘│
│ Port: 5557 │ │ Port: 5556 │ │ Port: 5555 │
└──────────────────┘ └──────────────────┘ └──────────────────┘
``` ```
## Компоненты системы ## Компоненты системы
### 1. Основной бот (bot.py) ### 1. Основной бот (bot.py)
**Расположение:** Корень проекта
**Технологии:** **Технологии:**
- `python-telegram-bot` (v20.7) — асинхронный фреймворк для Telegram Bot API - `python-telegram-bot` — асинхронный фреймворк для Telegram Bot API
- `httpx` — асинхронный HTTP клиент для запросов к сервисам загрузчиков - `httpx` — асинхронный HTTP клиент
- `sqlite3` — база данных для хранения статистики - `sqlite3` — база данных
**Архитектурные решения:** **Ключевые функции:**
#### Обработка сообщений
- Асинхронная обработка через `asyncio`
- Каждый пользовательский запрос обрабатывается независимой корутиной
- Параллельная обработка нескольких запросов
- Автоматическое извлечение URL из текста сообщений (работа в группах)
#### Скачивание видео
- **Все источники**: HTTP запросы к соответствующим микросервисам через `httpx`
- **YouTube**: `POST http://youtube-downloader:5000/download/stream`
- **Instagram**: `POST http://instagram-downloader:5000/download/stream`
- **VK**: `POST http://vk-downloader:5000/download/stream`
- Получение бинарных данных и сохранение во временный файл
- Отправка через Telegram API
#### Хранение видео
- Все скачанные видео сохраняются в папке `video/` на хосте
- Файлы не удаляются автоматически (сохраняются для пользователей)
- Автоматическая очистка только `.part` файлов (недокачанные)
#### База данных
- SQLite с двумя таблицами:
- `users` — информация о пользователях (chat_id, username, first_name, first_seen, last_seen)
- `stats` — статистика (total_downloads)
- Инициализация при запуске через `init_database()`
- Файл базы: `data/bot.db`
#### Обработка ошибок
- Retry механизм для всех источников (3 попытки по умолчанию)
- Логирование всех ошибок
- Информативные сообщения пользователю
- Автоматическая очистка `.part` файлов при ошибках
### 2. YouTube Downloader Service
**Расположение:** `youtube-downloader/`
**Технологии:**
- Flask — веб-фреймворк для REST API
- `yt-dlp` — библиотека для скачивания видео с YouTube
- Flask-CORS — для поддержки CORS
**API Endpoints:**
1. `GET /health` — проверка работоспособности сервиса
- Возвращает: `{"status": "ok", "service": "youtube-downloader"}`
2. `POST /download/stream` — скачивание видео
- Request: `{"url": "https://youtube.com/watch?v=..."}`
- Response: Бинарные данные видео (200 OK) или JSON с ошибкой (400/500)
**Особенности:**
- Использует специальные настройки yt-dlp для YouTube (player_client, headers)
- Поддержка различных форматов видео (mp4, webm, mkv)
- Временные файлы сохраняются в `downloads/` и удаляются после отправки
**Порт:** 5557 (внешний) → 5000 (внутренний)
### 3. Instagram Downloader Service
**Расположение:** `instagram-downloader/`
**Технологии:**
- Flask — веб-фреймворк для REST API
- `yt-dlp` — библиотека для скачивания видео с Instagram
- Flask-CORS — для поддержки CORS
**API Endpoints:**
1. `GET /health` — проверка работоспособности сервиса
- Возвращает: `{"status": "ok", "service": "instagram-downloader"}`
2. `POST /download/stream` — скачивание видео
- Request: `{"url": "https://instagram.com/p/..."}`
- Response: Бинарные данные видео (200 OK) или JSON с ошибкой (400/500)
**Особенности:**
- Требует файл с cookies Instagram (`instagram_cookies.txt` в папке сервиса)
- Автоматическая проверка срока действия cookies
- Поддержка CSRF токенов и session cookies
- Скрипты для получения/обновления cookies в папке сервиса
**Порт:** 5556 (внешний) → 5000 (внутренний)
### 4. VK Downloader Service
**Расположение:** `vk-downloader/`
**Технологии:**
- Flask — веб-фреймворк для REST API
- `yt-dlp` — библиотека для скачивания видео с VK
- Flask-CORS — для поддержки CORS
**API Endpoints:**
1. `GET /health` — проверка работоспособности сервиса
- Возвращает: `{"status": "ok", "service": "vk-downloader"}`
2. `POST /download/stream` — скачивание видео
- Request: `{"url": "https://vk.com/clip-..."}`
- Response: Бинарные данные видео (200 OK) или JSON с ошибкой (400/500)
**Особенности:**
- Специальные заголовки для VK (User-Agent, Referer)
- Обработка кириллицы в именах файлов
- Временные файлы сохраняются в `downloads/` и удаляются после отправки
**Порт:** 5555 (внешний) → 5000 (внутренний)
### 5. Определение источника видео
Функция `detect_video_source(url)` анализирует домен URL:
#### Локализация
```python ```python
- youtube.com / youtu.be → 'youtube' TEXTS = {
- instagram.com → 'instagram' 'ru': { 'start': '...', 'support': '...', ... },
- vk.com / vkontakte.ru → 'vk' 'en': { 'start': '...', 'support': '...', ... }
- иначе → 'unknown' }
def get_locale_from_language_code(language_code: str) -> str:
# 'ru*' → 'ru', иначе → 'en'
``` ```
### 6. Потоки данных #### Определение источника
```python
#### Общий поток скачивания def detect_video_source(url: str) -> str:
# youtube.com, youtu.be → 'youtube'
``` # instagram.com → 'instagram'
User → Bot → extract_urls_from_text() → detect_video_source() # tiktok.com → 'tiktok'
# vk.com, vkontakte.ru → 'vk'
HTTP POST /download/stream → [YouTube/Instagram/VK] Service # yapfiles.ru → 'yapfiles'
# иначе → 'unknown'
yt-dlp → video file → HTTP Response (binary)
Bot receives binary → saves to video/ → Telegram API → User
``` ```
#### Детальный поток для каждого источника #### Команды
- `/start` — приветствие с локализацией
- `/stat` — статистика бота
- `/support` — информация о боте и контакт автора
**YouTube:** ### 2. Сервисы загрузчиков
```
User → Bot → download_youtube_video() Все сервисы имеют единый API:
httpx.AsyncClient → POST http://youtube-downloader:5000/download/stream | Endpoint | Метод | Описание |
|----------|-------|----------|
YouTube Service → yt-dlp → binary data | `/health` | GET | Проверка работоспособности |
| `/download/stream` | POST | Скачивание видео |
Bot saves to video/ → sends to User
**Request:**
```json
{"url": "https://..."}
``` ```
**Instagram:** **Response:** Бинарные данные видео или JSON с ошибкой.
```
User → Bot → download_instagram_video()
httpx.AsyncClient → POST http://instagram-downloader:5000/download/stream
Instagram Service → yt-dlp (with cookies) → binary data
Bot saves to video/ → sends to User
```
**VK:** #### YouTube Downloader (порт 5557)
``` - Использует `yt-dlp` с настройками для YouTube
User → Bot → download_vk_video() - Поддержка shorts, плейлистов
httpx.AsyncClient → POST http://vk-downloader:5000/download/stream
VK Service → yt-dlp → binary data
Bot saves to video/ → sends to User
```
### 7. База данных #### Instagram Downloader (порт 5556)
- Использует `yt-dlp` с cookies
- Требует `instagram_cookies.txt`
#### TikTok Downloader (порт 5559)
- Использует `yt-dlp`
- Поддержка коротких и полных ссылок
#### VK Downloader (порт 5555)
- Использует `yt-dlp` с русскими заголовками
- Не требует VPN в РФ
#### Yapfiles Downloader (порт 5558)
- Парсит HTML страницу
- Извлекает прямую ссылку на видео
- Использует `requests` + `BeautifulSoup`
### 3. База данных
**Схема:** **Схема:**
@ -251,7 +134,8 @@ CREATE TABLE users (
username TEXT, username TEXT,
first_name TEXT, first_name TEXT,
first_seen TEXT NOT NULL, first_seen TEXT NOT NULL,
last_seen TEXT NOT NULL last_seen TEXT NOT NULL,
locale TEXT DEFAULT 'en' -- ru/en
); );
CREATE TABLE stats ( CREATE TABLE stats (
@ -260,255 +144,105 @@ CREATE TABLE stats (
); );
``` ```
**Операции:** **Миграция:** При запуске бот автоматически добавляет колонку `locale` если её нет (для совместимости со старой базой).
- `add_user()` — добавление/обновление пользователя (при каждом взаимодействии)
- `get_total_users()` — получение количества уникальных пользователей
- `increment_downloads()` — увеличение счетчика скачанных видео
- `get_total_downloads()` — получение количества скачанных видео
**Персистентность:** ### 4. Скрипт рассылки (broadcast.py)
- База хранится в `data/bot.db` на хосте
- Монтируется как volume в Docker Консольная утилита для отправки сообщений всем пользователям:
- Сохраняется между перезапусками контейнера
```bash
./broadcast.py -y "Текст сообщения"
./broadcast.py -y --html "<b>Жирный</b> текст"
./broadcast.py -y --file message.txt
./broadcast.py --list # показать пользователей
```
Автоматически читает `.env` для получения токена бота.
## Docker архитектура ## Docker архитектура
### Основной бот ### Порты
**Расположение:** Корень проекта | Сервис | Внешний порт | Внутренний порт |
|--------|--------------|-----------------|
| VK | 5555 | 5000 |
| Instagram | 5556 | 5000 |
| YouTube | 5557 | 5000 |
| Yapfiles | 5558 | 5000 |
| TikTok | 5559 | 5000 |
**Образ:** ### Volumes
- Базовый: `python:3.11-slim`
- Python пакеты из `requirements.txt` (python-telegram-bot, httpx)
**Volumes:** **Основной бот:**
- `./video:/app/video`сохраненные видео (не удаляются) - `./video:/app/video`скачанные видео
- `./data:/app/data:Z` — база данных (SELinux relabel) - `./data:/app/data` — база данных
**Network:** **Сервисы загрузчиков:**
- `network_mode: host` — для доступа к сервисам по localhost или IP - `./downloads:/app/downloads` — временные файлы
- (Instagram) `./instagram_cookies.txt:/app/instagram_cookies.txt:ro`
## Потоки данных
```
User → Telegram → Bot
detect_video_source(url)
download_{source}_video()
HTTP POST → Service → yt-dlp/parser
binary video data
save to video/ → send to User
increment_downloads()
```
## Развертывание
### Вариант 1: Все на одном хосте
**Запуск:**
```bash ```bash
# Запуск всех сервисов
for dir in youtube instagram vk yapfiles tiktok; do
cd ${dir}-downloader && docker compose up -d && cd ..
done
docker compose up -d docker compose up -d
``` ```
### YouTube Downloader Service ### Вариант 2: Раздельное развертывание
**Расположение:** `youtube-downloader/` **Хост 1 (с VPN для YouTube/Instagram/TikTok):**
- Основной бот
- YouTube, Instagram, TikTok сервисы
**Образ:** **Хост 2 (без VPN):**
- Базовый: `python:3.11-slim` - VK, Yapfiles сервисы
- Зависимости: `ffmpeg`, `wget`
- Python пакеты: Flask, flask-cors, yt-dlp
**Volumes:** В `.env` на хосте 1:
- `./downloads:/app/downloads` — временные файлы ```env
VK_DOWNLOADER_URL=http://<host2_ip>:5555
**Ports:** YAPFILES_DOWNLOADER_URL=http://<host2_ip>:5558
- `5557:5000` — внешний порт 5557, внутренний 5000
**Запуск:**
```bash
cd youtube-downloader && docker compose up -d
```
### Instagram Downloader Service
**Расположение:** `instagram-downloader/`
**Образ:**
- Базовый: `python:3.11-slim`
- Зависимости: `ffmpeg`, `wget`
- Python пакеты: Flask, flask-cors, yt-dlp
**Volumes:**
- `./downloads:/app/downloads` — временные файлы
- `./instagram_cookies.txt:/app/instagram_cookies.txt:ro` — cookies (read-only)
**Environment:**
- `INSTAGRAM_COOKIES_FILE=/app/instagram_cookies.txt`
**Ports:**
- `5556:5000` — внешний порт 5556, внутренний 5000
**Запуск:**
```bash
cd instagram-downloader && docker compose up -d
```
### VK Downloader Service
**Расположение:** `vk-downloader/`
**Образ:**
- Базовый: `python:3.11-slim`
- Зависимости: `ffmpeg`, `wget`
- Python пакеты: Flask, flask-cors, yt-dlp, requests
**Volumes:**
- `./downloads:/app/downloads` — временные файлы
**Ports:**
- `5555:5000` — внешний порт 5555, внутренний 5000
**Запуск:**
```bash
cd vk-downloader && docker compose up -d
``` ```
## Безопасность ## Безопасность
### Переменные окружения - Токен бота в `.env` (не коммитится)
- Токен бота хранится в `.env` (не коммитится в Git) - Cookies Instagram в отдельном файле (не коммитится)
- Cookies для Instagram хранятся в файле `instagram-downloader/instagram_cookies.txt` (не коммитится) - Сервисы доступны только по указанным URL
- URL сервисов настраиваются через `.env` - Можно добавить API key между сервисами
### Ограничения доступа
- Сервисы загрузчиков доступны только по указанным IP/URL
- Нет аутентификации между ботом и сервисами (можно добавить API key)
- Cookies файл монтируется read-only
### Файловая система
- Видео сохраняются в `video/` и не удаляются автоматически
- Временные файлы в сервисах удаляются после отправки
- Автоматическая очистка только `.part` файлов
## Масштабирование
### Текущие ограничения
1. **Основной бот:**
- Один экземпляр (можно запустить несколько с разными токенами)
- Параллельная обработка запросов через asyncio
- Ограничения: ресурсы CPU/сети
2. **Сервисы загрузчиков:**
- Flask dev server — последовательная обработка
- Один экземпляр контейнера каждого сервиса
- Можно масштабировать горизонтально
### Рекомендации для масштабирования
1. **Сервисы загрузчиков:**
- Использовать Gunicorn с несколькими worker'ами:
```bash
gunicorn -w 4 -b 0.0.0.0:5000 app:app
```
- Горизонтальное масштабирование: несколько контейнеров за nginx/HAProxy
- Load balancing для распределения нагрузки
2. **Основной бот:**
- Webhook режим вместо polling (для больших нагрузок)
- Кеширование информации о видео
- Очередь задач (Celery) для скачивания
3. **База данных:**
- Миграция на PostgreSQL для многопользовательской нагрузки
- Connection pooling
## Мониторинг ## Мониторинг
### Логирование - Все сервисы логируют в stdout
- Все компоненты логируют в stdout/stderr - Health check: `GET /health` на каждом сервисе
- Docker автоматически собирает логи - Логи Docker: `docker compose logs -f`
- Уровни: INFO, WARNING, ERROR
### Метрики (можно добавить)
- Количество запросов в секунду
- Время обработки запроса
- Количество ошибок
- Размер скачанных файлов
### Health checks
- Все сервисы: `GET /health`
- Основной бот: проверка через статус контейнера
## Производительность
### Оптимизации
1. **Асинхронная обработка:**
- Основной бот использует asyncio для неблокирующих операций
- HTTP запросы к сервисам через httpx (асинхронный)
2. **Хранение видео:**
- Видео сохраняются на хосте (volume), не в образе контейнера
- Файлы доступны для пользователей после скачивания
3. **Кеширование:**
- Можно добавить кеш информации о видео (title, duration)
- Кеш для часто запрашиваемых видео
### Узкие места
1. **Сервисы загрузчиков:**
- Последовательная обработка запросов (Flask dev server)
- Скачивание файла перед отправкой (занимает память)
2. **Сеть:**
- Зависимость от скорости интернета
- Задержки при обращении к внешним сервисам
- Задержки между ботом и сервисами загрузчиков
## Развертывание
### Локальная разработка
```bash
# Запуск сервисов загрузчиков (каждый в своей папке)
cd youtube-downloader && docker compose up -d
cd ../instagram-downloader && docker compose up -d
cd ../vk-downloader && docker compose up -d
# Запуск основного бота (из корня проекта)
cd ..
docker compose up -d
```
### Продакшен (раздельное развертывание)
**Хост 1 (с VPN для YouTube/Instagram):**
- Основной бот
- YouTube сервис (порт 5557)
- Instagram сервис (порт 5556)
- VPN для доступа к YouTube/Instagram
- `.env`:
- `YOUTUBE_DOWNLOADER_URL=http://localhost:5557`
- `INSTAGRAM_DOWNLOADER_URL=http://localhost:5556`
- `VK_DOWNLOADER_URL=http://<host2_ip>:5555`
**Хост 2 (без VPN для VK):**
- VK Downloader Service (порт 5555)
- Доступен по IP для хоста 1
- Можно масштабировать горизонтально
### CI/CD (опционально)
1. Автоматический build Docker образов
2. Тестирование перед деплоем
3. Автоматический деплой при коммите в main
## Будущие улучшения ## Будущие улучшения
1. **Аутентификация между сервисами:** 1. **Аутентификация между сервисами** — API key/JWT
- API key для сервисов загрузчиков 2. **Очередь задач** — Celery для фоновой обработки
- JWT токены 3. **Prometheus метрики** — мониторинг производительности
4. **Кеширование** — Redis для частых запросов
2. **Очередь задач:** 5. **Поддержка новых источников** — Twitter, Facebook, etc.
- Celery/RQ для фоновой обработки
- Retry механизм через очередь
3. **Мониторинг:**
- Prometheus метрики
- Grafana дашборды
4. **Улучшение сервисов:**
- Переход на FastAPI (более производительный)
- Поддержка WebSockets для прогресса
- Stream ответа вместо полной загрузки в память
5. **Хранение видео:**
- Организация по датам/пользователям
- Автоматическая очистка старых файлов (опционально)
- Интеграция с облачным хранилищем

251
README.md
View file

@ -1,6 +1,6 @@
# Telegram Video Download Bot # Telegram Video Download Bot
Telegram бот для скачивания видео с YouTube, Instagram и VK. Микросервисная архитектура с раздельными сервисами для каждого источника. Telegram бот для скачивания видео с YouTube, Instagram, TikTok, VK и Yapfiles. Микросервисная архитектура с раздельными сервисами для каждого источника.
## Архитектура ## Архитектура
@ -10,6 +10,8 @@ Telegram бот для скачивания видео с YouTube, Instagram и
- **youtube-downloader** - сервис для скачивания с YouTube (порт 5557) - **youtube-downloader** - сервис для скачивания с YouTube (порт 5557)
- **instagram-downloader** - сервис для скачивания с Instagram (порт 5556) - **instagram-downloader** - сервис для скачивания с Instagram (порт 5556)
- **vk-downloader** - сервис для скачивания с VK (порт 5555) - **vk-downloader** - сервис для скачивания с VK (порт 5555)
- **yapfiles-downloader** - сервис для скачивания с Yapfiles (порт 5558)
- **tiktok-downloader** - сервис для скачивания с TikTok (порт 5559)
Каждый сервис работает в отдельном Docker контейнере и может быть развернут независимо. Каждый сервис работает в отдельном Docker контейнере и может быть развернут независимо.
@ -17,10 +19,20 @@ Telegram бот для скачивания видео с YouTube, Instagram и
- 📹 Скачивание видео с YouTube - 📹 Скачивание видео с YouTube
- 📸 Скачивание видео с Instagram (требуются cookies) - 📸 Скачивание видео с Instagram (требуются cookies)
- 🎵 Скачивание видео с TikTok
- 🎬 Скачивание видео с VK - 🎬 Скачивание видео с VK
- 📁 Скачивание видео с Yapfiles
- 🌍 Локализация интерфейса (русский/английский) на основе языка пользователя
- 📊 Статистика скачанных видео и пользователей - 📊 Статистика скачанных видео и пользователей
- 🔄 Автоматическое сохранение статистики в базу данных - 🔄 Автоматическое сохранение статистики в базу данных
- 👥 Работа в группах с автоматическим обнаружением ссылок - 👥 Работа в группах с автоматическим обнаружением ссылок
- 📢 Рассылка сообщений всем пользователям (`broadcast.py`)
## Команды бота
- `/start` — начало работы с ботом
- `/stat` — статистика: количество пользователей и скачанных видео
- `/support` — информация о боте и контакт автора
## Требования ## Требования
@ -53,173 +65,97 @@ TELEGRAM_BOT_TOKEN=your_telegram_bot_token_here
TELEGRAM_BOT_USERNAME=your_bot_username TELEGRAM_BOT_USERNAME=your_bot_username
# Downloader Services URLs # Downloader Services URLs
# Для локальной разработки через docker-compose используются внутренние имена сервисов YOUTUBE_DOWNLOADER_URL=http://localhost:5557
YOUTUBE_DOWNLOADER_URL=http://youtube-downloader:5000 INSTAGRAM_DOWNLOADER_URL=http://localhost:5556
INSTAGRAM_DOWNLOADER_URL=http://instagram-downloader:5000 VK_DOWNLOADER_URL=http://localhost:5555
VK_DOWNLOADER_URL=http://vk-downloader:5000 YAPFILES_DOWNLOADER_URL=http://localhost:5558
TIKTOK_DOWNLOADER_URL=http://localhost:5559
``` ```
- **TELEGRAM_BOT_TOKEN** — токен бота от @BotFather
- **TELEGRAM_BOT_USERNAME** — username бота (без @), используется в подписи видео
- **YOUTUBE_DOWNLOADER_URL** — URL YouTube сервиса (для docker-compose: `http://youtube-downloader:5000`, для продакшена: `http://<ip>:5557`)
- **INSTAGRAM_DOWNLOADER_URL** — URL Instagram сервиса (для docker-compose: `http://instagram-downloader:5000`, для продакшена: `http://<ip>:5556`)
- **VK_DOWNLOADER_URL** — URL VK сервиса (для docker-compose: `http://vk-downloader:5000`, для продакшена: `http://<ip>:5555`)
### 3. Настройка Instagram (опционально) ### 3. Настройка Instagram (опционально)
Если планируете скачивать видео с Instagram: Если планируете скачивать видео с Instagram:
1. Экспортируйте cookies из браузера (см. `instagram-downloader/INSTAGRAM_COOKIES_INSTRUCTIONS.md`) 1. Экспортируйте cookies из браузера (см. `instagram-downloader/INSTAGRAM_COOKIES_INSTRUCTIONS.md`)
2. Сохраните файл как `instagram_cookies.txt` в папке `instagram-downloader/` 2. Сохраните файл как `instagram_cookies.txt` в папке `instagram-downloader/`
3. Формат: Netscape cookies file
**Быстрое получение cookies через скрипт:**
```bash ```bash
cd instagram-downloader cd instagram-downloader
./get_instagram_cookies.sh ./get_instagram_cookies.sh
``` ```
Или обновление существующих cookies:
```bash
cd instagram-downloader
./update_instagram_cookies.sh
```
**Примечание:** Без cookies Instagram может блокировать запросы. При первом запуске обновите cookies вручную.
### 4. Запуск сервисов ### 4. Запуск сервисов
**Важно:** Каждый сервис запускается отдельно на своем хосте (или на одном хосте, но отдельными командами). **Каждый сервис запускается отдельно:**
#### Запуск основного бота
```bash ```bash
# Из корня проекта # Запуск сервисов загрузчиков
cd youtube-downloader && docker compose up -d && cd ..
cd instagram-downloader && docker compose up -d && cd ..
cd vk-downloader && docker compose up -d && cd ..
cd yapfiles-downloader && docker compose up -d && cd ..
cd tiktok-downloader && docker compose up -d && cd ..
# Запуск основного бота (из корня проекта)
docker compose up -d docker compose up -d
``` ```
Это запустит только основной Telegram бот.
#### Запуск сервисов загрузчиков
Каждый сервис запускается отдельно в своей папке:
```bash
# Запуск YouTube сервиса (порт 5557)
cd youtube-downloader
docker compose up -d
# Запуск Instagram сервиса (порт 5556)
cd ../instagram-downloader
docker compose up -d
# Запуск VK сервиса (порт 5555)
cd ../vk-downloader
docker compose up -d
```
**Порядок запуска:** Сначала запустите сервисы загрузчиков, затем основной бот.
#### Раздельное развертывание на разных хостах (рекомендуется для продакшена)
**Хост 1 (с VPN для YouTube/Instagram):**
- YouTube сервис (порт 5557)
- Instagram сервис (порт 5556)
- Основной бот
**Хост 2 (без VPN для VK):**
- VK сервис (порт 5555)
В `.env` файле в корне проекта на хосте 1 укажите IP адреса сервисов:
```env
YOUTUBE_DOWNLOADER_URL=http://localhost:5557
INSTAGRAM_DOWNLOADER_URL=http://localhost:5556
VK_DOWNLOADER_URL=http://<ip_хоста_2>:5555
```
### 5. Проверка статуса ### 5. Проверка статуса
Проверить статус сервисов:
```bash ```bash
# Основной бот (из корня проекта) # Проверка всех сервисов
docker compose ps docker ps | grep -E "(video_download_bot|youtube|instagram|vk|yapfiles|tiktok)"
# Сервисы загрузчиков (из соответствующих папок)
cd youtube-downloader && docker compose ps
cd ../instagram-downloader && docker compose ps
cd ../vk-downloader && docker compose ps
``` ```
Просмотр логов: ## Порты сервисов
| Сервис | Порт |
|--------|------|
| VK Downloader | 5555 |
| Instagram Downloader | 5556 |
| YouTube Downloader | 5557 |
| Yapfiles Downloader | 5558 |
| TikTok Downloader | 5559 |
## Рассылка сообщений
Скрипт `broadcast.py` позволяет отправить сообщение всем пользователям бота:
```bash ```bash
# Основной бот (из корня проекта) # Простое сообщение
docker compose logs -f bot ./broadcast.py -y "Текст сообщения"
# Сервисы загрузчиков (из соответствующих папок) # С HTML-разметкой
cd youtube-downloader && docker compose logs -f ./broadcast.py -y --html '<b>Важно!</b> Новая функция добавлена.'
cd ../instagram-downloader && docker compose logs -f
cd ../vk-downloader && docker compose logs -f # Из файла
./broadcast.py -y --file announcement.txt --html
# Посмотреть список пользователей
./broadcast.py --list
``` ```
## Использование
1. Найдите вашего бота в Telegram по username
2. Отправьте команду `/start`
3. Отправьте ссылку на видео (YouTube, Instagram или VK)
4. Дождитесь скачивания и получите файл
### Работа в группах
Добавьте бота в группу и дайте ему права администратора (нужно право на удаление сообщений). После этого бот будет автоматически находить ссылки на видео в сообщениях участников, скачивать их и отправлять прямо в группу, заменяя исходное сообщение со ссылкой.
### Команды
- `/start` — начало работы с ботом
- `/stat` — статистика: количество пользователей и скачанных видео
## Структура проекта ## Структура проекта
``` ```
videoDownloadBot/ videoDownloadBot/
├── bot.py # Код основного Telegram бота ├── bot.py # Код основного Telegram бота
├── broadcast.py # Скрипт для рассылки сообщений
├── requirements.txt # Python зависимости бота ├── requirements.txt # Python зависимости бота
├── Dockerfile # Образ для бота ├── Dockerfile # Образ для бота
├── docker-compose.yml # Оркестратор всех сервисов ├── docker-compose.yml # Конфигурация бота
├── .env.example # Пример конфигурации ├── .env.example # Пример конфигурации
├── data/ # База данных (bot.db)
├── video/ # Скачанные видео
├── youtube-downloader/ # Сервис для YouTube ├── youtube-downloader/ # Сервис для YouTube
│ ├── app.py # Flask API сервис
│ ├── requirements.txt # Python зависимости
│ ├── Dockerfile # Образ для YouTube сервиса
│ └── docker-compose.yml # Конфигурация YouTube сервиса
├── instagram-downloader/ # Сервис для Instagram ├── instagram-downloader/ # Сервис для Instagram
│ ├── app.py # Flask API сервис
│ ├── requirements.txt # Python зависимости
│ ├── Dockerfile # Образ для Instagram сервиса
│ ├── docker-compose.yml # Конфигурация Instagram сервиса
│ ├── instagram_cookies.txt # Cookies для Instagram (создать вручную)
│ ├── get_instagram_cookies.sh # Скрипт для получения cookies
│ ├── update_instagram_cookies.sh # Скрипт для обновления cookies
│ ├── INSTAGRAM_COOKIES_INSTRUCTIONS.md # Инструкции по cookies
│ └── README.md # Документация сервиса
├── vk-downloader/ # Сервис для VK ├── vk-downloader/ # Сервис для VK
│ ├── app.py # Flask API сервис ├── yapfiles-downloader/ # Сервис для Yapfiles
│ ├── requirements.txt # Python зависимости ├── tiktok-downloader/ # Сервис для TikTok
│ ├── Dockerfile # Образ для VK сервиса ├── README.md # Этот файл
│ └── docker-compose.yml # Конфигурация VK сервиса └── ARCHITECTURE.md # Описание архитектуры
└── README.md # Этот файл
``` ```
## Порты сервисов
- **Основной бот**: не требует внешних портов (работает через Telegram API)
- **YouTube Downloader**: порт 5557
- **Instagram Downloader**: порт 5556
- **VK Downloader**: порт 5555
## API Endpoints ## API Endpoints
Все сервисы загрузчиков предоставляют одинаковый API: Все сервисы загрузчиков предоставляют одинаковый API:
@ -227,7 +163,6 @@ videoDownloadBot/
- `GET /health` - проверка здоровья сервиса - `GET /health` - проверка здоровья сервиса
- `POST /download/stream` - скачивание видео (возвращает бинарные данные) - `POST /download/stream` - скачивание видео (возвращает бинарные данные)
Пример запроса:
```json ```json
POST /download/stream POST /download/stream
Content-Type: application/json Content-Type: application/json
@ -242,51 +177,24 @@ Content-Type: application/json
```bash ```bash
git pull git pull
# Пересобрать и перезапустить основной бот (из корня проекта) # Пересобрать и перезапустить основной бот
docker compose build && docker compose up -d docker compose down && docker compose up -d --build
# Пересобрать и перезапустить каждый сервис загрузчика отдельно # Пересобрать сервисы загрузчиков
cd youtube-downloader && docker compose build && docker compose up -d cd youtube-downloader && docker compose up -d --build && cd ..
cd ../instagram-downloader && docker compose build && docker compose up -d cd instagram-downloader && docker compose up -d --build && cd ..
cd ../vk-downloader && docker compose build && docker compose up -d cd vk-downloader && docker compose up -d --build && cd ..
cd yapfiles-downloader && docker compose up -d --build && cd ..
cd tiktok-downloader && docker compose up -d --build && cd ..
``` ```
## Остановка ## Локализация
```bash Бот автоматически определяет язык пользователя из настроек Telegram:
# Остановить основной бот (из корня проекта) - Если язык начинается с `ru` — интерфейс на русском
docker compose down - Иначе — интерфейс на английском
# Остановить каждый сервис загрузчика отдельно Язык сохраняется в базе данных для каждого пользователя.
cd youtube-downloader && docker compose down
cd ../instagram-downloader && docker compose down
cd ../vk-downloader && docker compose down
```
## Развертывание на продакшене
### Вариант 1: Все на одном хосте (с VPN)
1. Настройте VPN для доступа к YouTube и Instagram
2. Запустите каждый сервис отдельно в своей папке
3. В `.env` в корне проекта укажите: `http://localhost:5557`, `http://localhost:5556`, `http://localhost:5555`
### Вариант 2: Раздельное развертывание (рекомендуется)
**Хост 1 (с VPN):**
- Основной бот
- YouTube сервис
- Instagram сервис
- В `.env` в корне: `YOUTUBE_DOWNLOADER_URL=http://localhost:5557`, `INSTAGRAM_DOWNLOADER_URL=http://localhost:5556`, `VK_DOWNLOADER_URL=http://<ip_хоста_2>:5555`
**Хост 2 (без VPN):**
- VK сервис
- В `.env` corebot на хосте 1: IP этого хоста
**Преимущества:**
- VK работает быстрее без VPN
- Меньше нагрузка на VPN канал
- Возможность масштабирования сервисов отдельно
## Troubleshooting ## Troubleshooting
@ -295,14 +203,13 @@ cd ../vk-downloader && docker compose down
- Убедитесь, что токен правильный в `.env` - Убедитесь, что токен правильный в `.env`
- Проверьте, что все сервисы запущены и доступны - Проверьте, что все сервисы запущены и доступны
### YouTube/Instagram/VK не работает ### Сервис не работает
- Проверьте, что соответствующий сервис запущен: `docker compose ps` - Проверьте логи сервиса: `cd <service>-downloader && docker compose logs -f`
- Проверьте URL в `.env` corebot - Проверьте URL в `.env`
- Проверьте логи сервиса: `docker compose logs -f` - Для Instagram: проверьте валидность cookies
- Для Instagram: проверьте наличие и валидность `instagram-downloader/instagram_cookies.txt`
### База данных не сохраняется ### База данных не сохраняется
- Проверьте права на папку `data/` в корне проекта - Проверьте права на папку `data/`
- Убедитесь, что volume смонтирован в `docker-compose.yml` - Убедитесь, что volume смонтирован в `docker-compose.yml`
## Лицензия ## Лицензия
@ -311,4 +218,4 @@ MIT
## Поддержка ## Поддержка
При возникновении проблем создайте issue в репозитории. При возникновении проблем создайте issue в репозитории или свяжитесь с автором: @rvrubel