videoDownloadTGbot/README.md
vrubelroman 772e9fd5b4
All checks were successful
CI/CD Pipeline / build-and-deploy (push) Successful in 1m47s
chore: remove obsolete per-folder scripts, add cookies-cron reference, update docs
- 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.
2026-06-30 22:16:40 +00:00

220 lines
10 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.

# 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