телеграм бот что скидывает видосы в телегу по ссылке
Find a file
vrubelroman b5f0670754
All checks were successful
CI/CD Pipeline / build-and-deploy (push) Successful in 47s
feat(admin_bot): показывать состояние загрузчиков в /stat
Раньше о поломке сервиса админ узнавал только из алерта health-check или
из ошибки живого пользователя. Теперь /stat отдаёт состояние всех пяти
загрузчиков по запросу.

У YouTube и Instagram дёргается /cookies/check, поэтому статусы различают
причину: работает / cookies протухли / не извлекает видео (не cookies) /
недоступен. Остальные три проверяются через /health.

Проверка ходит в реальные YouTube и Instagram и занимает секунды, поэтому
статистика отправляется сразу, а блок состояния дозаполняется правкой
сообщения. Все сервисы опрашиваются параллельно — последовательно набежало
бы под полминуты.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-26 00:40:32 +00:00
.forgejo/workflows ci: add Forgejo Actions CI/CD pipeline for build, push and prod deploy 2026-06-30 19:44:05 +00:00
cookies fix(downloaders): Deno runtime, свежий yt-dlp, честный health-check, смоук-тест 2026-07-26 00:31:16 +00:00
instagram-downloader fix(downloaders): Deno runtime, свежий yt-dlp, честный health-check, смоук-тест 2026-07-26 00:31:16 +00:00
tiktok-downloader Fix YouTube 500 error (n-challenge) and Telegram callback_data overflow 2026-04-30 17:21:10 +03:00
vk-downloader fix: prevent VK downloader from blocking queue 2026-05-25 16:46:35 +00:00
yapfiles-downloader Fix YouTube 500 error (n-challenge) and Telegram callback_data overflow 2026-04-30 17:21:10 +03:00
youtube-downloader fix(downloaders): Deno runtime, свежий yt-dlp, честный health-check, смоук-тест 2026-07-26 00:31:16 +00:00
.dockerignore Рефакторинг: микросервисная архитектура 2025-12-11 01:07:04 +03:00
.env.example fix: отправка видео как документ (без сжатия Telegram) и исправление format_id для точного выбора качества 2026-04-30 01:36:43 +03:00
.gitignore Исключить папки downloads/ из git 2025-12-11 01:07:23 +03:00
admin_bot.py feat(admin_bot): показывать состояние загрузчиков в /stat 2026-07-26 00:40:32 +00:00
ARCHITECTURE.md fix(downloaders): Deno runtime, свежий yt-dlp, честный health-check, смоук-тест 2026-07-26 00:31:16 +00:00
bot.py fix(downloaders): Deno runtime, свежий yt-dlp, честный health-check, смоук-тест 2026-07-26 00:31:16 +00:00
broadcast.py Обновлено подтверждение перед отправкой сообщения: добавлена обработка исключений для ввода пользователя, чтобы избежать ошибок при некорректном вводе. 2025-12-12 11:34:20 +03:00
docker-compose.prod.yml fix(cookies): mount youtube/instagram cookies from host instead of baking into image 2026-06-30 22:02:14 +00:00
docker-compose.yml fix(cookies): mount youtube/instagram cookies from host instead of baking into image 2026-06-30 22:02:14 +00:00
Dockerfile add admin bot 2025-12-20 22:17:20 +03:00
README.md fix(downloaders): Deno runtime, свежий yt-dlp, честный health-check, смоук-тест 2026-07-26 00:31:16 +00:00
requirements.txt Рефакторинг: микросервисная архитектура 2025-12-11 01:07:04 +03:00
smoke_test.py fix(downloaders): Deno runtime, свежий yt-dlp, честный health-check, смоук-тест 2026-07-26 00:31:16 +00:00

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)
  • Для Instagram: файл с cookies (см. раздел Instagram ниже)

Быстрый старт

1. Клонирование репозитория

git clone <repository_url>
cd videoDownloadBot

2. Настройка переменных окружения

Скопируйте .env.example в .env в корне проекта и заполните:

cp .env.example .env
nano .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 из браузера расширением для cookies.txt — процедура в cookies/README.md
  2. Сохраните файл как instagram_cookies.txt в папке instagram-downloader/

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

Все 7 сервисов (бот, admin-бот, 5 загрузчиков) собираются и запускаются одной командой из корня проекта — единый docker-compose.yml уже содержит build-контексты для всех подпапок:

docker compose up -d --build

Перезапустить/пересобрать только один сервис (например, при правке youtube-downloader/app.py):

docker compose up -d --build youtube-downloader

5. Проверка статуса

# Проверка всех сервисов
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 позволяет отправить сообщение всем пользователям бота:

# Простое сообщение
./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 - скачивание видео (возвращает бинарные данные)
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 читают файл с диска при каждом запросе — рестарт контейнера не требуется.

Куки обновляются вручную и редко — по алерту 🍪⚠️ COOKIES ПРОТУХЛИ из админ-бота, а не по расписанию. Ключевые куки живут около года, поэтому регулярный экспорт не нужен; за состоянием следит фоновая проверка в bot.py (check_cookies_health, раз в 30 минут дёргает POST /cookies/check у youtube- и instagram-downloader).

Экспорт делается с машины с браузером (на проде нет GUI) и требует точной процедуры — для YouTube только через приватное окно, иначе сессия ротируется и куки протухают. Пошаговая инструкция и скрипт доставки — в cookies/.

Смоук-тест

После любой правки, до коммита, на поднятом тестовом контуре:

python3 smoke_test.py

Гоняет реальные ссылки через запущенные сервисы и печатает таблицу: /cookies/check обоих загрузчиков, /formats на возрастном YouTube-видео (ловит отсутствие рабочего JS-рантайма) и реальные скачивания YouTube и Instagram. Код возврата 0 — всё прошло, 1 — есть падения. Адреса переопределяются через YOUTUBE_DOWNLOADER_URL/INSTAGRAM_DOWNLOADER_URL.

Если сервисы пересобирались — поднимать их через docker compose up -d --force-recreate <service>: без флага up -d просто стартует старый контейнер, и правка в проверку не попадёт.

Обновление

Деплой на прод выполняется автоматически через Forgejo CI/CD (.forgejo/workflows/deploy.yml) при пуше в main: сборка всех 7 образов → push в registry → docker save/ssh/docker load на прод-хост (registry не доступен с внешнего VPS напрямую) → docker compose up -d --remove-orphans.

Для ручного локального обновления:

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