Downloader Bot: скачать видео из TikTok и YouTube в Telegram
собственный бот: без водяных знаков, качество до 4K, MP3, файлы до 2 ГБ
Telegram-бот для скачивания видео и музыки по ссылке: TikTok без водяного знака, YouTube и Shorts, Reels, VK Video и ещё восемь площадок. yt-dlp, FFmpeg, локальный Bot API для файлов до 2 ГБ, кэш file_id.
Задача
Чтобы сохранить понравившийся ролик, обычно приходится идти на сайт-скачивалку: терпеть рекламу, ловить редиректы, качать файл в загрузки телефона, а потом искать его в файловом менеджере, чтобы переслать другу. 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?
Как скачать видео с YouTube через Telegram-бота?
Как обойти лимит 50 МБ в Telegram?
Почему повторная ссылка отдаётся мгновенно?
Нужны ли cookies?
Можно ли сделать такого бота под другие площадки?
Ещё по этому направлению
Финансовый ассистент: учёт денег из PDF-выписок в Telegram
собственный продукт: бот и веб-дашборд, выписки четырёх банков, Gemini
Тикет-система для IT-отдела в Telegram
для музейного комплекса в Москве: заявки, учёт техники, база знаний и аналитика
Tech Poly VPN: биллинг VPN-подписок в Telegram
собственный продукт: оплата по СБП, выдача ключей в Marzban, резервный бот во ВКонтакте
Нужно похожее?
Расскажите о задаче — покажем, как решали такое, и прикинем объём работ.