All checks were successful
CI/CD Pipeline / build-and-deploy (push) Successful in 1m47s
- Remove get_cookies.sh (targets a container without yt-dlp, already broken), get_cookies_local.sh, start_all.sh/stop_all.sh — these implement the old per-service-compose startup that now conflicts with the unified root docker-compose.yml. - Add cookies-cron/ — a reference copy of the scripts actually running via cron on the separate browser-equipped machine, with setup requirements and instructions for standing up a new cron host. - Update README.md/ARCHITECTURE.md to describe the current unified docker-compose + CI/CD deploy flow and host-mounted cookies instead of the old per-folder workflow.
220 lines
10 KiB
Markdown
220 lines
10 KiB
Markdown
# Telegram Video Download Bot
|
||
|
||
Telegram бот для скачивания видео с YouTube, Instagram, TikTok, VK и Yapfiles. Микросервисная архитектура с раздельными сервисами для каждого источника.
|
||
|
||
## Архитектура
|
||
|
||
Проект разделен на микросервисы:
|
||
|
||
- **Основной бот** (в корне проекта) - Telegram бот, обрабатывает сообщения и оркестрирует запросы к сервисам
|
||
- **youtube-downloader** - сервис для скачивания с YouTube (порт 5557)
|
||
- **instagram-downloader** - сервис для скачивания с Instagram (порт 5556)
|
||
- **vk-downloader** - сервис для скачивания с VK (порт 5555)
|
||
- **yapfiles-downloader** - сервис для скачивания с Yapfiles (порт 5558)
|
||
- **tiktok-downloader** - сервис для скачивания с TikTok (порт 5559)
|
||
|
||
Каждый сервис работает в отдельном Docker контейнере и может быть развернут независимо.
|
||
|
||
## Возможности
|
||
|
||
- 📹 Скачивание видео с YouTube
|
||
- 📸 Скачивание видео с Instagram (требуются cookies)
|
||
- 🎵 Скачивание видео с TikTok
|
||
- 🎬 Скачивание видео с VK
|
||
- 📁 Скачивание видео с Yapfiles
|
||
- 🌍 Локализация интерфейса (русский/английский) на основе языка пользователя
|
||
- 📊 Статистика скачанных видео и пользователей
|
||
- 🔄 Автоматическое сохранение статистики в базу данных
|
||
- 👥 Работа в группах с автоматическим обнаружением ссылок
|
||
- 📢 Рассылка сообщений всем пользователям (`broadcast.py`)
|
||
|
||
## Команды бота
|
||
|
||
- `/start` — начало работы с ботом
|
||
- `/stat` — статистика: количество пользователей и скачанных видео
|
||
- `/support` — информация о боте и контакт автора
|
||
|
||
## Требования
|
||
|
||
- Docker и Docker Compose
|
||
- Telegram Bot Token (получить у [@BotFather](https://t.me/BotFather))
|
||
- Для Instagram: файл с cookies (см. раздел Instagram ниже)
|
||
|
||
## Быстрый старт
|
||
|
||
### 1. Клонирование репозитория
|
||
|
||
```bash
|
||
git clone <repository_url>
|
||
cd videoDownloadBot
|
||
```
|
||
|
||
### 2. Настройка переменных окружения
|
||
|
||
Скопируйте `.env.example` в `.env` в корне проекта и заполните:
|
||
|
||
```bash
|
||
cp .env.example .env
|
||
nano .env # или используйте любой редактор
|
||
```
|
||
|
||
**Необходимые переменные:**
|
||
|
||
```env
|
||
TELEGRAM_BOT_TOKEN=your_telegram_bot_token_here
|
||
TELEGRAM_BOT_USERNAME=your_bot_username
|
||
|
||
# Downloader Services URLs
|
||
YOUTUBE_DOWNLOADER_URL=http://localhost:5557
|
||
INSTAGRAM_DOWNLOADER_URL=http://localhost:5556
|
||
VK_DOWNLOADER_URL=http://localhost:5555
|
||
YAPFILES_DOWNLOADER_URL=http://localhost:5558
|
||
TIKTOK_DOWNLOADER_URL=http://localhost:5559
|
||
```
|
||
|
||
### 3. Настройка Instagram (опционально)
|
||
|
||
Если планируете скачивать видео с Instagram:
|
||
|
||
1. Экспортируйте cookies из браузера (см. `instagram-downloader/INSTAGRAM_COOKIES_INSTRUCTIONS.md`)
|
||
2. Сохраните файл как `instagram_cookies.txt` в папке `instagram-downloader/`
|
||
|
||
```bash
|
||
cd instagram-downloader
|
||
./get_instagram_cookies.sh
|
||
```
|
||
|
||
### 4. Запуск сервисов
|
||
|
||
Все 7 сервисов (бот, admin-бот, 5 загрузчиков) собираются и запускаются одной командой из корня проекта — единый `docker-compose.yml` уже содержит build-контексты для всех подпапок:
|
||
|
||
```bash
|
||
docker compose up -d --build
|
||
```
|
||
|
||
Перезапустить/пересобрать только один сервис (например, при правке `youtube-downloader/app.py`):
|
||
|
||
```bash
|
||
docker compose up -d --build youtube-downloader
|
||
```
|
||
|
||
### 5. Проверка статуса
|
||
|
||
```bash
|
||
# Проверка всех сервисов
|
||
docker ps | grep -E "(video_download_bot|youtube|instagram|vk|yapfiles|tiktok)"
|
||
```
|
||
|
||
## Порты сервисов
|
||
|
||
| Сервис | Порт |
|
||
|--------|------|
|
||
| VK Downloader | 5555 |
|
||
| Instagram Downloader | 5556 |
|
||
| YouTube Downloader | 5557 |
|
||
| Yapfiles Downloader | 5558 |
|
||
| TikTok Downloader | 5559 |
|
||
|
||
## Рассылка сообщений
|
||
|
||
Скрипт `broadcast.py` позволяет отправить сообщение всем пользователям бота:
|
||
|
||
```bash
|
||
# Простое сообщение
|
||
./broadcast.py -y "Текст сообщения"
|
||
|
||
# С HTML-разметкой
|
||
./broadcast.py -y --html '<b>Важно!</b> Новая функция добавлена.'
|
||
|
||
# Из файла
|
||
./broadcast.py -y --file announcement.txt --html
|
||
|
||
# Посмотреть список пользователей
|
||
./broadcast.py --list
|
||
```
|
||
|
||
## Структура проекта
|
||
|
||
```
|
||
videoDownloadBot/
|
||
├── bot.py # Код основного Telegram бота
|
||
├── broadcast.py # Скрипт для рассылки сообщений
|
||
├── requirements.txt # Python зависимости бота
|
||
├── Dockerfile # Образ для бота
|
||
├── docker-compose.yml # Конфигурация бота
|
||
├── .env.example # Пример конфигурации
|
||
├── data/ # База данных (bot.db)
|
||
├── video/ # Скачанные видео
|
||
├── youtube-downloader/ # Сервис для YouTube
|
||
├── instagram-downloader/ # Сервис для Instagram
|
||
├── vk-downloader/ # Сервис для VK
|
||
├── yapfiles-downloader/ # Сервис для Yapfiles
|
||
├── tiktok-downloader/ # Сервис для TikTok
|
||
├── README.md # Этот файл
|
||
└── ARCHITECTURE.md # Описание архитектуры
|
||
```
|
||
|
||
## API Endpoints
|
||
|
||
Все сервисы загрузчиков предоставляют одинаковый API:
|
||
|
||
- `GET /health` - проверка здоровья сервиса
|
||
- `POST /download/stream` - скачивание видео (возвращает бинарные данные)
|
||
|
||
```json
|
||
POST /download/stream
|
||
Content-Type: application/json
|
||
|
||
{
|
||
"url": "https://youtube.com/watch?v=..."
|
||
}
|
||
```
|
||
|
||
## Cookies на проде (YouTube/Instagram)
|
||
|
||
В проде `youtube_cookies.txt`/`instagram_cookies.txt` монтируются в контейнеры с хоста (`docker-compose.prod.yml`), а не запекаются в образ — это позволяет обновлять их без пересборки/передеплоя. `yt-dlp`/`app.py` читают файл с диска при каждом запросе — рестарт контейнера не требуется.
|
||
|
||
Куки получает по крону (раз в 20 минут) отдельная машина с графическим окружением и реальным залогиненным браузером (на самом проде это сделать нельзя — там нет GUI/браузера), и разливает результат по `scp` сразу на прод и на тестовый стенд. Скрипты для этого, требования к cron-машине и инструкция по развёртыванию на новой машине — в [`cookies-cron/`](cookies-cron/README.md). Это копия того, что реально крутится на cron-машине; `youtube-downloader/get_youtube_cookies.sh` и `instagram-downloader/get_instagram_cookies.sh` в подпапках сервисов — более старые версии тех же скриптов, с тех пор разошедшиеся.
|
||
|
||
## Обновление
|
||
|
||
Деплой на прод выполняется автоматически через Forgejo CI/CD (`.forgejo/workflows/deploy.yml`) при пуше в `main`: сборка всех 7 образов → push в registry → `docker save`/`ssh`/`docker load` на прод-хост (registry не доступен с внешнего VPS напрямую) → `docker compose up -d --remove-orphans`.
|
||
|
||
Для ручного локального обновления:
|
||
|
||
```bash
|
||
git pull
|
||
docker compose up -d --build
|
||
```
|
||
|
||
## Локализация
|
||
|
||
Бот автоматически определяет язык пользователя из настроек Telegram:
|
||
- Если язык начинается с `ru` — интерфейс на русском
|
||
- Иначе — интерфейс на английском
|
||
|
||
Язык сохраняется в базе данных для каждого пользователя.
|
||
|
||
## Troubleshooting
|
||
|
||
### Бот не отвечает
|
||
- Проверьте логи: `docker compose logs bot`
|
||
- Убедитесь, что токен правильный в `.env`
|
||
- Проверьте, что все сервисы запущены и доступны
|
||
|
||
### Сервис не работает
|
||
- Проверьте логи сервиса: `docker compose logs -f <service>-downloader`
|
||
- Проверьте URL в `.env`
|
||
- Для Instagram: проверьте валидность cookies
|
||
|
||
### База данных не сохраняется
|
||
- Проверьте права на папку `data/`
|
||
- Убедитесь, что volume смонтирован в `docker-compose.yml`
|
||
|
||
## Лицензия
|
||
|
||
MIT
|
||
|
||
## Поддержка
|
||
|
||
При возникновении проблем создайте issue в репозитории или свяжитесь с автором: @rvrubel
|