248 lines
9.7 KiB
Markdown
248 lines
9.7 KiB
Markdown
# Архитектура системы
|
||
|
||
Документ описывает внутреннюю архитектуру и принципы работы Telegram Video Download Bot.
|
||
|
||
## Общая архитектура
|
||
|
||
Система состоит из микросервисной архитектуры с раздельными сервисами для каждого источника видео:
|
||
|
||
1. **Основной бот** (`bot.py`) — Telegram бот, обрабатывающий запросы пользователей
|
||
2. **YouTube Downloader Service** (`youtube-downloader/`) — порт 5557
|
||
3. **Instagram Downloader Service** (`instagram-downloader/`) — порт 5556
|
||
4. **VK Downloader Service** (`vk-downloader/`) — порт 5555
|
||
5. **Yapfiles Downloader Service** (`yapfiles-downloader/`) — порт 5558
|
||
6. **TikTok Downloader Service** (`tiktok-downloader/`) — порт 5559
|
||
|
||
```
|
||
┌─────────────────┐
|
||
│ Telegram User │
|
||
└────────┬────────┘
|
||
│
|
||
▼
|
||
┌─────────────────────────────────────────────────────────┐
|
||
│ Основной бот (bot.py) │
|
||
│ ┌────────────────────────────────────────────────────┐ │
|
||
│ │ Message Handler │ │
|
||
│ │ - URL extraction │ │
|
||
│ │ - Source detection (YouTube/Instagram/TikTok/VK/ │ │
|
||
│ │ Yapfiles) │ │
|
||
│ │ - Localization (ru/en) │ │
|
||
│ └────────────────────────────────────────────────────┘ │
|
||
│ ┌────────────────────────────────────────────────────┐ │
|
||
│ │ HTTP API Clients (httpx) │ │
|
||
│ │ - YouTube, Instagram, TikTok, VK, Yapfiles │ │
|
||
│ └────────────────────────────────────────────────────┘ │
|
||
│ ┌────────────────────────────────────────────────────┐ │
|
||
│ │ SQLite Database (data/bot.db) │ │
|
||
│ │ - users (chat_id, username, locale, ...) │ │
|
||
│ │ - stats (total_downloads) │ │
|
||
│ └────────────────────────────────────────────────────┘ │
|
||
└─────────────────────────────────────────────────────────┘
|
||
│ HTTP POST /download/stream
|
||
▼
|
||
┌────────┬────────┬────────┬────────┬────────┐
|
||
│YouTube │Instagram│ TikTok │ VK │Yapfiles│
|
||
│ :5557 │ :5556 │ :5559 │ :5555 │ :5558 │
|
||
│ │ │ │ │ │
|
||
│yt-dlp │yt-dlp │yt-dlp │yt-dlp │requests│
|
||
│ │+cookies│ │ │+parsing│
|
||
└────────┴────────┴────────┴────────┴────────┘
|
||
```
|
||
|
||
## Компоненты системы
|
||
|
||
### 1. Основной бот (bot.py)
|
||
|
||
**Технологии:**
|
||
- `python-telegram-bot` — асинхронный фреймворк для Telegram Bot API
|
||
- `httpx` — асинхронный HTTP клиент
|
||
- `sqlite3` — база данных
|
||
|
||
**Ключевые функции:**
|
||
|
||
#### Локализация
|
||
```python
|
||
TEXTS = {
|
||
'ru': { 'start': '...', 'support': '...', ... },
|
||
'en': { 'start': '...', 'support': '...', ... }
|
||
}
|
||
|
||
def get_locale_from_language_code(language_code: str) -> str:
|
||
# 'ru*' → 'ru', иначе → 'en'
|
||
```
|
||
|
||
#### Определение источника
|
||
```python
|
||
def detect_video_source(url: str) -> str:
|
||
# youtube.com, youtu.be → 'youtube'
|
||
# instagram.com → 'instagram'
|
||
# tiktok.com → 'tiktok'
|
||
# vk.com, vkontakte.ru → 'vk'
|
||
# yapfiles.ru → 'yapfiles'
|
||
# иначе → 'unknown'
|
||
```
|
||
|
||
#### Команды
|
||
- `/start` — приветствие с локализацией
|
||
- `/stat` — статистика бота
|
||
- `/support` — информация о боте и контакт автора
|
||
|
||
### 2. Сервисы загрузчиков
|
||
|
||
Все сервисы имеют единый API:
|
||
|
||
| Endpoint | Метод | Описание |
|
||
|----------|-------|----------|
|
||
| `/health` | GET | Проверка работоспособности |
|
||
| `/download/stream` | POST | Скачивание видео |
|
||
|
||
**Request:**
|
||
```json
|
||
{"url": "https://..."}
|
||
```
|
||
|
||
**Response:** Бинарные данные видео или JSON с ошибкой.
|
||
|
||
#### YouTube Downloader (порт 5557)
|
||
- Использует `yt-dlp` с настройками для YouTube
|
||
- Поддержка shorts, плейлистов
|
||
|
||
#### 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. База данных
|
||
|
||
**Схема:**
|
||
|
||
```sql
|
||
CREATE TABLE users (
|
||
chat_id INTEGER PRIMARY KEY,
|
||
username TEXT,
|
||
first_name TEXT,
|
||
first_seen TEXT NOT NULL,
|
||
last_seen TEXT NOT NULL,
|
||
locale TEXT DEFAULT 'en' -- ru/en
|
||
);
|
||
|
||
CREATE TABLE stats (
|
||
id INTEGER PRIMARY KEY CHECK (id = 1),
|
||
total_downloads INTEGER DEFAULT 0
|
||
);
|
||
```
|
||
|
||
**Миграция:** При запуске бот автоматически добавляет колонку `locale` если её нет (для совместимости со старой базой).
|
||
|
||
### 4. Скрипт рассылки (broadcast.py)
|
||
|
||
Консольная утилита для отправки сообщений всем пользователям:
|
||
|
||
```bash
|
||
./broadcast.py -y "Текст сообщения"
|
||
./broadcast.py -y --html "<b>Жирный</b> текст"
|
||
./broadcast.py -y --file message.txt
|
||
./broadcast.py --list # показать пользователей
|
||
```
|
||
|
||
Автоматически читает `.env` для получения токена бота.
|
||
|
||
## Docker архитектура
|
||
|
||
### Порты
|
||
|
||
| Сервис | Внешний порт | Внутренний порт |
|
||
|--------|--------------|-----------------|
|
||
| VK | 5555 | 5000 |
|
||
| Instagram | 5556 | 5000 |
|
||
| YouTube | 5557 | 5000 |
|
||
| Yapfiles | 5558 | 5000 |
|
||
| TikTok | 5559 | 5000 |
|
||
|
||
### Volumes
|
||
|
||
**Основной бот:**
|
||
- `./video:/app/video` — скачанные видео
|
||
- `./data:/app/data` — база данных
|
||
|
||
**Сервисы загрузчиков:**
|
||
- `./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
|
||
# Запуск всех сервисов
|
||
for dir in youtube instagram vk yapfiles tiktok; do
|
||
cd ${dir}-downloader && docker compose up -d && cd ..
|
||
done
|
||
docker compose up -d
|
||
```
|
||
|
||
### Вариант 2: Раздельное развертывание
|
||
|
||
**Хост 1 (с VPN для YouTube/Instagram/TikTok):**
|
||
- Основной бот
|
||
- YouTube, Instagram, TikTok сервисы
|
||
|
||
**Хост 2 (без VPN):**
|
||
- VK, Yapfiles сервисы
|
||
|
||
В `.env` на хосте 1:
|
||
```env
|
||
VK_DOWNLOADER_URL=http://<host2_ip>:5555
|
||
YAPFILES_DOWNLOADER_URL=http://<host2_ip>:5558
|
||
```
|
||
|
||
## Безопасность
|
||
|
||
- Токен бота в `.env` (не коммитится)
|
||
- Cookies Instagram в отдельном файле (не коммитится)
|
||
- Сервисы доступны только по указанным URL
|
||
- Можно добавить API key между сервисами
|
||
|
||
## Мониторинг
|
||
|
||
- Все сервисы логируют в stdout
|
||
- Health check: `GET /health` на каждом сервисе
|
||
- Логи Docker: `docker compose logs -f`
|
||
|
||
## Будущие улучшения
|
||
|
||
1. **Аутентификация между сервисами** — API key/JWT
|
||
2. **Очередь задач** — Celery для фоновой обработки
|
||
3. **Prometheus метрики** — мониторинг производительности
|
||
4. **Кеширование** — Redis для частых запросов
|
||
5. **Поддержка новых источников** — Twitter, Facebook, etc.
|