🎬

Downloader Bot: скачать видео из TikTok и YouTube в Telegram

собственный бот: без водяных знаков, качество до 4K, MP3, файлы до 2 ГБ

Telegram-бот для скачивания видео и музыки по ссылке: TikTok без водяного знака, YouTube и Shorts, Reels, VK Video и ещё восемь площадок. yt-dlp, FFmpeg, локальный Bot API для файлов до 2 ГБ, кэш file_id.

В продакшене · собственный продукт
12 площадок
TikTok, YouTube, Instagram, VK Video, X, Reddit, Pinterest, Twitch, SoundCloud, Vimeo, Coub, Яндекс.Видео
до 4K
выбор качества от 240p, вес файла показан на кнопке до скачивания
2 ГБ
потолок файла с локальным Bot API вместо 50 МБ облачного

Задача

Чтобы сохранить понравившийся ролик, обычно приходится идти на сайт-скачивалку: терпеть рекламу, ловить редиректы, качать файл в загрузки телефона, а потом искать его в файловом менеджере, чтобы переслать другу. TikTok вдобавок вклеивает водяной знак поверх видео. Онлайн-сервисы регулярно ломаются, требуют оплату или уводят трафик на рекламу.

Нужен был бот для скачивания видео из TikTok, YouTube и Instagram, который живёт там же, где и переписка: кидаешь ссылку в чат и получаешь файл в том же чате. Он сразу пересылается кому угодно, потому что уже лежит в Telegram.

Решение

Downloader Bot — собственный Telegram-бот, версия 2.6.3. Реализовано:

  • Площадки. TikTok без водяного знака, YouTube и Shorts, Instagram Reels и посты, фото-слайдшоу TikTok (склеиваются в mp4), VK Video, X (Twitter), Reddit, Pinterest, Twitch, SoundCloud, Vimeo, Coub, Яндекс.Видео. Отдельно, только для админов, Hi-Res музыка Qobuz, Deezer и Tidal через движок ToshaMusic.
  • Выбор качества. От 240p до 4K, вес файла показан на кнопке заранее.
  • Извлечение звука. MP3 с обложкой и метаданными; битрейт берётся по лучшей аудиодорожке ролика, от 192 до 320 kbps.
  • Мгновенные повторы. Уже скачанное отдаётся по file_id без перекачивания.
  • Живой прогресс. Полоса, скорость, оставшееся время.
  • Обход лимита 50 МБ. Автосжатие ffmpeg или нарезка на части; с локальным Bot API до 2000 МБ.
  • Cookies. Возрастные и приватные видео, обход «Sign in to confirm» у YouTube; загрузка файла через админку.
  • Формат по умолчанию. Команда /format: качать сразу, без вопросов.
  • Админ-панель. Сводка, аналитика по платформам и дням, пользователи, модерация, рассылка с отчётом о доставке, cookies, настройки на лету, логи, обслуживание.

Ссылку не обязательно присылать отдельным сообщением: бот найдёт её внутри любого текста.

Как это устроено

yt-dlp как универсальный движок

yt-dlp — открытая библиотека, которая умеет получать видео и аудио с сотен площадок. Бот один раз зондирует ссылку, получает список форматов с весом и переиспользует этот результат при скачивании, экономя сетевой запрос. Новые площадки добавляются распознаванием домена: Vimeo и Coub пошли тем же путём, что Reddit или Twitch, без отдельного кода. yt-dlp и ffmpeg работают в отдельных потоках и процессах, поэтому пока качается чужое видео, бот отвечает остальным; семафор ограничивает число одновременных загрузок.

TikTok без водяного знака

Для TikTok используется прямой API, отдающий ролик без вклеенного знака. Фото-посты TikTok (слайдшоу) yt-dlp не умеет вовсе: бот сам склеивает картинки и музыку поста в один mp4 через ffmpeg, каждой картинке отводится поровну от общей длительности, разные соотношения сторон приводятся к 1080×1920.

PO-токены и подпись ссылок YouTube

YouTube защищает ссылки на медиафайлы двумя механизмами, и оба не относятся к коду бота. Подпись ссылок считает обфусцированный JavaScript самого YouTube, поэтому нужен JS-рантайм Deno, он вшит в образ. Второй механизм — PO-токен, токен сессии, привязанный к браузеру; его выдаёт отдельный сервис, который поднимается рядом в docker-compose и наружу не смотрит. Без Deno падает видео, без токенов — аудио, причём метаданные извлекаются нормально, и ошибка всплывает уже после нажатия кнопки качества. YouTube меняет защиту регулярно, поэтому первое действие при отказах — обновить yt-dlp.

Обход лимита 50 МБ: локальный Bot API

Облачный Bot API Telegram не даёт боту отдать файл больше 50 МБ. Бот показывает вес каждого качества до скачивания, помечает то, что тяжелее лимита, но поддаётся сжатию, и то, что уже не спасти, обрывает заведомо неотправляемую закачку и пережимает файл через ffmpeg с понижением разрешения при необходимости. Если качество стало бы неприемлемым, бот предлагает нарезать на части. Для файлов до 2000 МБ в docker-compose описан локальный Bot API server (профиль bigfiles): в режиме local он отдаёт путь на диске вместо ссылки, и бот получает доступ к тем же файлам.

Кэш file_id

Каждый файл, однажды загруженный в Telegram, получает идентификатор file_id. Бот хранит его в SQLite и по повторной ссылке пересылает файл мгновенно, без трафика. Срок жизни кэша настраивается, по умолчанию 30 дней.

Cookies и админ-панель

Cookies нужны для возрастных и приватных видео и обхода проверки «Sign in to confirm» у YouTube. Файл cookies.txt загружается через раздел админки, бот проверяет формат Netscape и показывает свежесть каждого файла. Админ-панель работает на inline-кнопках под сообщением: сводка, аналитика по платформам и дням, топ ошибок, пользователи с поиском, бан с причиной, рассылка с предпросмотром и отчётом, лимиты и режим обслуживания, логи, состояние сервера, очистка кэша, экспорт базы. Заблокировавшие бота пользователи после рассылки автоматически удаляются из базы.

Результат

  • Ссылка в чат, файл в ответ: без сайтов-скачивалок, рекламы и водяных знаков.
  • 12 площадок плюс Hi-Res музыка для админов.
  • Качество от 240p до 4K, MP3 с обложкой, вес файла известен до скачивания.
  • Файлы больше 50 МБ сжимаются, режутся или уходят целиком через локальный Bot API до 2000 МБ.
  • Повторные ссылки отдаются из кэша без перекачивания.
  • Зависшая ссылка обрывается таймаутом с понятной ошибкой, а не бесконечным «Читаю ссылку».
  • Быстрые наборы тестов (модульные и маршрутизация с фейковым Telegram) не требуют сети; отдельный флаг гоняет живую загрузку с YouTube.

Технологии: что и зачем

  • Python 3.14 и aiogram 3 — асинхронный бот, inline-клавиатуры, антифлуд и режим обслуживания в middleware.
  • yt-dlp — универсальный движок скачивания; плагин bgutil-ytdlp-pot-provider для PO-токенов YouTube.
  • Deno — JS-рантайм для подписи ссылок YouTube, вшит в образ.
  • FFmpeg — склейка, MP3, сжатие, нарезка, превью, сборка слайдшоу.
  • SQLite (aiosqlite) — пользователи, журнал, кэш file_id, настройки.
  • aiohttp — клиент API TikTok и движка Hi-Res.
  • Local Bot API (telegram-bot-api) — опциональный профиль для файлов до 2000 МБ.
  • Docker Compose — бот и сервис PO-токенов; профили bigfiles, hires и ruproxy подключаются флагом.

Статус

Собственный продукт, в продакшене. Текущая версия 2.6.3 от 27 сентября 2026 года. За сентябрь добавлены: фото-слайдшоу TikTok (2.3.0), раздел Hi-Res музыки через отдельный сервис ToshaMusic (2.4.0), честный битрейт MP3 по исходной дорожке (2.4.1), точная оценка веса YouTube без HLS-дубликатов (2.4.2), Vimeo и Coub (2.5.0), подпись «Сделано в DevUnit Lab» (2.6.0), таймаут чтения метаданных (2.6.1), Яндекс.Видео через SOCKS5-туннель с российским выходом (2.6.2) и cookies для его антибот-проверки (2.6.3).

Ограничения: YouTube меняет защиту регулярно, при отказах первым делом обновляется yt-dlp; Instagram без cookies часто отдаёт пустой ответ; для Яндекс.Видео гарантий нет. Тесты запускаются вручную, CI нет.

Вопросы по проекту

Как скачать видео из TikTok без водяного знака через Telegram?
Отправьте ссылку боту, можно внутри любого текста. Для TikTok используется прямой API без водяного знака; фото-слайдшоу TikTok склеиваются в один mp4 с музыкой поста. Файл приходит в тот же чат и сразу пересылается кому угодно.
Как скачать видео с YouTube через Telegram-бота?
Бот показывает кнопки качества от 240p до 4K с весом файла и отдаёт видео или MP3 с обложкой и метаданными. YouTube требует двух внешних компонентов: JS-рантайма Deno для подписи ссылок и сервиса PO-токенов; в Docker оба уже подняты.
Как обойти лимит 50 МБ в Telegram?
Облачный Bot API не даёт боту отдать файл больше 50 МБ. Бот заранее помечает тяжёлые качества, пережимает через ffmpeg или нарезает на части. С локальным Bot API server (профиль bigfiles в docker-compose) потолок поднимается до 2000 МБ.
Почему повторная ссылка отдаётся мгновенно?
Уже загруженный в Telegram файл кэшируется по file_id и пересылается без перекачивания и трафика. Срок жизни кэша настраивается, по умолчанию 30 дней.
Нужны ли cookies?
Для возрастных и приватных видео и обхода проверки «Sign in to confirm» у YouTube. Файл cookies.txt загружается через админку без пересборки образа, в списке видна его свежесть. Instagram без cookies часто отдаёт пустой ответ.
Можно ли сделать такого бота под другие площадки?
Да. Движок yt-dlp универсальный: Vimeo и Coub, например, добавлены без платформо-специфичного кода. Набор площадок, лимиты и админ-панель настраиваются под задачу.

Нужно похожее?

Расскажите о задаче — покажем, как решали такое, и прикинем объём работ.