Telegram-бот для скачивания видео через Inline Mode и личные сообщения.
Напиши @VidqueBot https://youtube.com/... в любом чате — видео появится мгновенно из кэша или скачается в фоне с уведомлением в ЛС.
Поддерживает YouTube, Instagram Reels, TikTok, Twitter/X, VK и 1000+ платформ через yt-dlp.
- Inline-режим — вставляй видео в любой чат без пересылки
- История —
@VidqueBotбез ссылки показывает последние скачанные видео - Умный кэш — топ-3 видео пользователя хранится дольше обычного
- Инвалидация кэша — после загрузки история в inline обновляется мгновенно
- Ссылки без протокола —
youtube.com/watch?v=...работает безhttps:// - До 2 ГБ через локальный Bot API сервер (стандартный лимит Telegram — 50 МБ)
- Масштабируется — Redis connection pool, настраиваемый пул воркеров
Пользователь
│ @bot https://... (inline query)
▼
Telegram Servers ──► Bot (Go)
│
Redis cache?
├─ ДА ──► answerInlineQuery(CachedVideo) [мгновенно]
│ RefreshFileIDTTL (если топ-3 истории)
└─ НЕТ ──► answerInlineQuery(loading stub, TTL 5s)
Worker Pool (N горутин)
│
yt-dlp --print title --no-simulate
│
sendVideo → Приватный канал (CDN Telegram)
│
file_id → Redis
history → Redis (LPUSH, макс 50)
IncrInlineVersion → сброс кэша inline
│
PM: "✅ Видео готово"
Стек:
| Компонент | Технология |
|---|---|
| Бот | Go 1.22, go-telegram-bot-api/v5 |
| Загрузчик | yt-dlp + ffmpeg |
| Кэш | Redis 7 |
| Bot API сервер | aiogram/telegram-bot-api (локальный, снимает лимит 50 МБ) |
| Хранилище файлов | Приватный Telegram-канал (бесплатный CDN) |
| CI/CD | GitHub Actions → GHCR → Docker |
-
Создай бота через @BotFather:
/newbot /setinline @VidqueBot /setinlinefeedback @VidqueBot -
Создай приватный канал, добавь бота администратором с правом публикации.
ID канала: перешли сообщение из канала боту @userinfobot. -
Получи API ID и Hash на my.telegram.org/apps.
cp .env.example .env
# Заполни: TELEGRAM_TOKEN, TELEGRAM_API_ID, TELEGRAM_API_HASH, STORAGE_CHANNEL_IDdocker compose up -d --build
docker compose logs -f botГотово. Напиши @VidqueBot https://youtu.be/dQw4w9WgXcQ в любом чате.
| Переменная | Обязательная | По умолчанию | Описание |
|---|---|---|---|
TELEGRAM_TOKEN |
✅ | — | Токен бота от @BotFather |
TELEGRAM_API_ID |
✅ | — | API ID с my.telegram.org |
TELEGRAM_API_HASH |
✅ | — | API Hash с my.telegram.org |
STORAGE_CHANNEL_ID |
✅ | — | ID приватного канала-хранилища |
WORKER_COUNT |
— | 5 |
Параллельных загрузок |
MAX_FILE_SIZE_MB |
— | 1900 |
Максимальный размер файла (МБ); потолок локального Bot API — 2 ГБ |
CACHE_TTL_HOURS |
— | 24 |
TTL обычных видео в кэше (часы) |
HOT_CACHE_TTL_HOURS |
— | 168 |
TTL топ-3 видео пользователя (часы) |
REDIS_POOL_SIZE |
— | 20 |
Размер пула соединений Redis |
RATE_LIMIT_PER_HOUR |
— | 50 |
Лимит запросов на пользователя в час |
LOG_LEVEL |
— | info |
info или debug |
REDIS_PASSWORD |
— | "" |
Пароль Redis |
| Команда | Описание |
|---|---|
/start |
Приветствие и инструкция |
/help |
Справка |
/stats |
Статистика: кэш, воркеры, очередь |
/history |
Последние скачанные видео |
/clear |
Очистить историю |
Telegram кэширует результаты inline-запросов на стороне клиента. После загрузки нового видео история должна обновиться мгновенно.
Решение: каждый result_id в истории содержит версию (h{ver}-{i}). После загрузки вызывается IncrInlineVersion — версия увеличивается, Telegram видит новые result_id и запрашивает свежий список вместо кэшированного.
tg-video-bot/
├── .github/workflows/
│ └── release.yml # CI/CD: сборка, тесты, публикация образа, релиз
├── cmd/bot/
│ └── main.go # точка входа
├── internal/
│ ├── config/config.go # загрузка env
│ ├── cache/redis.go # Redis: кэш, история, rate limit, inline version
│ ├── downloader/ytdlp.go # обёртка над yt-dlp
│ ├── worker/pool.go # горутин-пул, дедупликация, загрузка в канал
│ └── bot/
│ ├── bot.go # команды, PM-режим
│ └── inline.go # inline query handler
├── Dockerfile
├── docker-compose.yml
└── .env.example
Проект использует GitHub Actions:
- Push в
main→ сборка и запуск тестов - Тег
v*.*.*→ сборка Docker-образа, публикация в GHCR, создание GitHub Release с changelog
Образ доступен по адресу:
ghcr.io/Rabb1tof/tg-video-bot:latest
ghcr.io/Rabb1tof/tg-video-bot:v1.2.3
Деплой через образ:
docker pull ghcr.io/Rabb1tof/tg-video-bot:latest
# В docker-compose.yml замени build: . на image: ghcr.io/Rabb1tof/tg-video-bot:latest# В работающем контейнере:
docker compose exec bot pip install -U yt-dlp
# Или пересборка образа:
docker compose up -d --buildРекомендуемые значения для 1000+ пользователей:
WORKER_COUNT=10
REDIS_POOL_SIZE=50
RATE_LIMIT_PER_HOUR=20
CACHE_TTL_HOURS=24
HOT_CACHE_TTL_HOURS=168MIT