# Telegram Video Download Bot

Telegram бот для скачивания видео с YouTube, Instagram и VK. Микросервисная архитектура с раздельными сервисами для каждого источника.

## Архитектура

Проект разделен на микросервисы:

- **Основной бот** (в корне проекта) - Telegram бот, обрабатывает сообщения и оркестрирует запросы к сервисам
- **youtube-downloader** - сервис для скачивания с YouTube (порт 5557)
- **instagram-downloader** - сервис для скачивания с Instagram (порт 5556)
- **vk-downloader** - сервис для скачивания с VK (порт 5555)

Каждый сервис работает в отдельном Docker контейнере и может быть развернут независимо.

## Возможности

- 📹 Скачивание видео с YouTube
- 📸 Скачивание видео с Instagram (требуются cookies)
- 🎬 Скачивание видео с VK
- 📊 Статистика скачанных видео и пользователей
- 🔄 Автоматическое сохранение статистики в базу данных
- 👥 Работа в группах с автоматическим обнаружением ссылок

## Требования

- 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
# Для локальной разработки через docker-compose используются внутренние имена сервисов
YOUTUBE_DOWNLOADER_URL=http://youtube-downloader:5000
INSTAGRAM_DOWNLOADER_URL=http://instagram-downloader:5000
VK_DOWNLOADER_URL=http://vk-downloader:5000
```

- **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 (опционально)

Если планируете скачивать видео с Instagram:

1. Экспортируйте cookies из браузера (см. `instagram-downloader/INSTAGRAM_COOKIES_INSTRUCTIONS.md`)
2. Сохраните файл как `instagram_cookies.txt` в папке `instagram-downloader/`
3. Формат: Netscape cookies file

**Быстрое получение cookies через скрипт:**

```bash
cd instagram-downloader
./get_instagram_cookies.sh
```

Или обновление существующих cookies:

```bash
cd instagram-downloader
./update_instagram_cookies.sh
```

**Примечание:** Без cookies Instagram может блокировать запросы. При первом запуске обновите cookies вручную.

### 4. Запуск сервисов

**Важно:** Каждый сервис запускается отдельно на своем хосте (или на одном хосте, но отдельными командами).

#### Запуск основного бота

```bash
# Из корня проекта
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. Проверка статуса

Проверить статус сервисов:

```bash
# Основной бот (из корня проекта)
docker compose ps

# Сервисы загрузчиков (из соответствующих папок)
cd youtube-downloader && docker compose ps
cd ../instagram-downloader && docker compose ps
cd ../vk-downloader && docker compose ps
```

Просмотр логов:

```bash
# Основной бот (из корня проекта)
docker compose logs -f bot

# Сервисы загрузчиков (из соответствующих папок)
cd youtube-downloader && docker compose logs -f
cd ../instagram-downloader && docker compose logs -f
cd ../vk-downloader && docker compose logs -f
```

## Использование

1. Найдите вашего бота в Telegram по username
2. Отправьте команду `/start`
3. Отправьте ссылку на видео (YouTube, Instagram или VK)
4. Дождитесь скачивания и получите файл

### Работа в группах

Добавьте бота в группу и дайте ему права администратора (нужно право на удаление сообщений). После этого бот будет автоматически находить ссылки на видео в сообщениях участников, скачивать их и отправлять прямо в группу, заменяя исходное сообщение со ссылкой.

### Команды

- `/start` — начало работы с ботом
- `/stat` — статистика: количество пользователей и скачанных видео

## Структура проекта

```
videoDownloadBot/
├── bot.py                      # Код основного Telegram бота
├── requirements.txt            # Python зависимости бота
├── Dockerfile                  # Образ для бота
├── docker-compose.yml          # Оркестратор всех сервисов
├── .env.example               # Пример конфигурации
├── youtube-downloader/         # Сервис для YouTube
│   ├── app.py                # Flask API сервис
│   ├── requirements.txt      # Python зависимости
│   ├── Dockerfile            # Образ для YouTube сервиса
│   └── docker-compose.yml    # Конфигурация YouTube сервиса
├── 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
│   ├── app.py                # Flask API сервис
│   ├── requirements.txt      # Python зависимости
│   ├── Dockerfile            # Образ для VK сервиса
│   └── docker-compose.yml   # Конфигурация VK сервиса
└── README.md                  # Этот файл
```

## Порты сервисов

- **Основной бот**: не требует внешних портов (работает через Telegram API)
- **YouTube Downloader**: порт 5557
- **Instagram Downloader**: порт 5556
- **VK Downloader**: порт 5555

## API Endpoints

Все сервисы загрузчиков предоставляют одинаковый API:

- `GET /health` - проверка здоровья сервиса
- `POST /download/stream` - скачивание видео (возвращает бинарные данные)

Пример запроса:
```json
POST /download/stream
Content-Type: application/json

{
  "url": "https://youtube.com/watch?v=..."
}
```

## Обновление

```bash
git pull

# Пересобрать и перезапустить основной бот (из корня проекта)
docker compose build && docker compose up -d

# Пересобрать и перезапустить каждый сервис загрузчика отдельно
cd youtube-downloader && docker compose build && docker compose up -d
cd ../instagram-downloader && docker compose build && docker compose up -d
cd ../vk-downloader && docker compose build && docker compose up -d
```

## Остановка

```bash
# Остановить основной бот (из корня проекта)
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

### Бот не отвечает
- Проверьте логи: `docker compose logs bot`
- Убедитесь, что токен правильный в `.env`
- Проверьте, что все сервисы запущены и доступны

### YouTube/Instagram/VK не работает
- Проверьте, что соответствующий сервис запущен: `docker compose ps`
- Проверьте URL в `.env` corebot
- Проверьте логи сервиса: `docker compose logs -f`
- Для Instagram: проверьте наличие и валидность `instagram-downloader/instagram_cookies.txt`

### База данных не сохраняется
- Проверьте права на папку `data/` в корне проекта
- Убедитесь, что volume смонтирован в `docker-compose.yml`

## Лицензия

MIT

## Поддержка

При возникновении проблем создайте issue в репозитории.
