Telegram-бот для скачивания видео ·
Одно действие вместо сайта-скачивалки
Пять соцсетей отдают видео пятью разными способами, и почти каждый из них спотыкается о Telegram. Внутри бота это разложено по полочкам, снаружи — ссылка в чат и готовый файл обратно, до полутора гигабайт.

Что за задача
Видео из соцсетей приходится забирать регулярно, и почти всегда — по чужим правилам. Свой же ролик остался только в ленте. Референс, который завтра удалят. Материал, который нужно переложить из Instagram в работу. Кнопки «скачать» в соцсетях либо нет вовсе, либо она отдаёт файл с логотипом поверх кадра.
Обычный путь — сайты-скачивалки, и каждый раз он выглядит одинаково: реклама во весь экран, пара редиректов, качество хуже исходного и водяной знак самого сервиса. А файл после этого ещё нужно донести до телефона.
Бот убирает этот путь целиком. Ссылка отправляется туда, где человек и так сидит, — в мессенджер, — а обратно приходит файл, который сразу можно переслать, сохранить или положить в монтаж. Тем, кто работает с контентом каждый день — SMM, монтаж, магазины, — это экономит не минуты, а само переключение: не нужно уходить из мессенджера и возвращаться.
Проект начинался как инструмент под конкретную задачу, поэтому в нём нет ничего «на вырост»: только то, чем пользуются. Платная подписка внутри — не витрина, а рабочая часть: бот считает скачивания, различает бесплатных и платных, сам продаёт подписку за звёзды Telegram и управляется из админки.
Что это дало
Ссылка из пяти соцсетей превращается в готовый файл прямо в чате — без сайтов с рекламой и без чужих логотипов на кадре. Не только короткие ролики: видео до полутора гигабайт, в лучшем качестве, которое в них помещается. Внутри бесплатный лимит, подписка с оплатой в самом Telegram и очередь — не скрипт на вечер, а продукт, который сам принимает оплату и сам её продлевает.
Где такие боты обычно ломаются
Скачать видео умеет готовая открытая утилита, и до этого места работа занимает вечер. Дальше начинается то, из-за чего такие боты чаще всего бросают на полпути.
Видео пришло, а картинки нет
Facebook часто отдаёт дорожку в кодеке, который плеер Telegram не показывает: звук идёт, экран чёрный. Для человека это выглядит как «бот сломался», хотя файл скачался целым.
Вместо видео — один звук
У TikTok и YouTube набор дорожек меняется сам по себе. Наивное «взять лучшее» регулярно приносит то аудио без картинки, то 240p вместо честного HD.
Пятьдесят мегабайт на всё
Обычный бот в Telegram не может отправить файл тяжелее пятидесяти мегабайт. Короткому ролику хватает, длинному видео в хорошем качестве — нет: оно либо не приходит вовсе, либо приходит мутным.
Большой файл — и тишина
Гигабайт качается и уходит в Telegram минутами. Если всё это время бот молчит, человек решает, что он завис: присылает ссылку ещё раз, жмёт кнопки или просто уходит.
Карусель приходит наполовину
Telegram принимает альбом только от двух до десяти элементов и не разрешает мешать в нём картинки с файлами. Пост из двенадцати фотографий, где одна весит больше десяти мегабайт, разваливается на ровном месте.
Платформа сегодня не в духе
Капча, слетевшая авторизация, гео- и возрастные ограничения, лимит запросов. Всё это временно и лечится по-разному — но пользователь не должен видеть по этому поводу красный текст с именами файлов.
Второй человек мешает первому
Пока один качает длинное видео, второй присылает свою ссылку, третий жмёт кнопку десять раз подряд. Если этим не управлять, память кончается, база встаёт в блокировку, и бот перестаёт отвечать всем сразу — в том числе тому, у кого всё уже почти скачалось.
Ничего из этого не видно на демонстрации: там ссылка и видео. Но именно это отделяет бота, которым пользуются каждый день, от скрипта, который «в целом качает».
Что сделал
Одно действие и никаких инструкций
Человек отправляет ссылку — бот присылает файл. Больше ничего делать не нужно: ни выбирать платформу, ни указывать качество, ни чистить ссылку от хвостов.
Ссылка распознаётся в любом виде, в каком её присылают: короткие адреса
кнопки «Поделиться» — vm.tiktok.com, fb.watch, pin.it, youtu.be,
региональные адреса Pinterest, ссылка без https:// и даже ссылка в подписи
к фото или видео. Именно такие обычно и присылают, и на них обычно
спотыкаются.
Пять платформ и то, что с них забирается: Instagram — Reels, видео, карусели и отдельные фото; TikTok — видео и фото-слайдшоу; Facebook — видео; Pinterest — картинки и целые доски; YouTube — видео.

Под каждую платформу — свой рецепт
Это главная невидимая часть работы. Для каждой из пяти соцсетей подобран свой порядок предпочтений: какой формат брать первым, на что переключаться, если его нет, и что считать негодным ни при каких условиях.
У Facebook первым идёт кодек, который Telegram показывает на всех устройствах, и бот перебирает четыре способа его добыть, прежде чем согласиться на модный новый, — ровно чтобы не приходил «звук без картинки». У YouTube бот берёт самое высокое разрешение, какое есть у ролика, — хоть 4K, — если файл помещается в лимит, и сам спускается ступенькой ниже, если не помещается; вес прикидывается заранее, чтобы не качать зря то, что всё равно не отправится. До 1080p бот по возможности берёт самый совместимый формат, а выше YouTube хранит ролики только в новых форматах сжатия — и бот берёт их: здесь выбрано качество, а не совместимость со старыми телефонами. Звук для длинных роликов подбирается отдельно, чтобы часовое видео не срывалось из-за одной дорожки. У TikTok первой берётся версия без водяного знака, а копия со знаком остаётся на самый крайний случай — лучше с меткой, чем ничего. У Instagram отдельно вытаскивается более высокое разрешение, которое платформа прячет в раздельных дорожках.
Звучит как мелочи, но именно из этих мелочей складывается разница между «скачалось» и «скачалось так, что можно смотреть».
Где один инструмент пасует, включается второй
Основной загрузчик отлично работает с видео и совершенно не умеет доски Pinterest, смешанные карусели Instagram и фото-слайдшоу TikTok — на них он либо возвращает пустоту, либо молча теряет половину картинок.
Для этих трёх случаев бот сразу идёт другим инструментом, а если и тот ничего не принёс — возвращается к первому. Человек об этой развилке не знает: он просто получает свой альбом целиком.

Видео до полутора гигабайт
Обычный бот упирается в пятьдесят мегабайт: больше Telegram от ботов не принимает. Поэтому рядом с ботом, на том же сервере, работает собственный сервер Telegram — официальная открытая программа самого Telegram как раз для таких случаев. Через него уходят файлы до полутора гигабайт.
Потолок мог бы быть и два гигабайта, но свой сервер Telegram обрывает соединение, если ответа нет дольше восьми с лишним минут. Два гигабайта на скорости домашнего канала уходят почти впритык к этому пределу, и если отправка его переждёт, бот уже не узнает, дошёл ли файл. Полтора уходят с запасом.
Большие файлы приносят свои поломки, и они закрыты заранее. Если Telegram оборвал соединение после долгой отправки, файл, скорее всего, уже ушёл: бот не отправляет его второй раз, а пишет, что Telegram ещё обрабатывает файл и он, скорее всего, появится в чате в ближайшие минуты, — иначе человек получил бы два одинаковых видео. Если YouTube не отдал кусок ролика, бот не склеивает видео с дырой, а честно говорит, что скачать не вышло, и это скачивание не засчитывает. Файл, который всё-таки вышел тяжелее лимита, не отправляется: бот говорит, сколько получилось, и советует ролик покороче.
Загрузки идут на отдельный внешний диск. Если он отвалится, файлы пошли бы на маленький системный — и гигабайтное видео уронило бы весь сервер вместе с базой. Поэтому перед каждой загрузкой бот проверяет, что места хватает, а при нехватке просит попробовать через несколько минут — и попытку не списывает.
Видно, сколько осталось
Гигабайт качается и уходит минутами, поэтому бот не молчит. Статус живёт в одном сообщении и обновляется по ходу работы.
Перед началом скачивания видно, в каком качестве и какого веса придёт видео. Если не в максимальном, бот объясняет почему: в 4K ролик весит больше, чем можно отправить, поэтому придёт лучшее, что помещается, — например, 1080p.
Во время скачивания — шкала с процентами и оставшимся временем. Когда видео склеивается со звуком, так и написано. При отправке в Telegram — примерный процент: сам Telegram ход приёма файла не сообщает, и бот считает его по средней скорости последних крупных отправок. Поэтому процент честно помечен как примерный.
Смысл простой: пока видно, что работа идёт, незачем присылать ссылку второй раз или думать, что бот завис.

До пяти ссылок за раз
Ссылки можно присылать пачкой — до пяти, одним сообщением или по одной. Бот ставит их в очередь и качает по одной; у каждой своё сообщение со статусом и местом в очереди: «В очереди: 2-я». Присылать заново не нужно — бот дойдёт до каждой сам. Та же ссылка дважды в очередь не встаёт, а лишние сверх пяти бот не теряет молча: перечисляет, какие не поставил и почему.
Очередь устроена так, чтобы через неё нельзя было обойти лимит и чтобы ссылка не пропала молча. Бесплатное скачивание бронируется в момент, когда ссылка встаёт в очередь, а не когда до неё дойдёт черёд, — пачка из пяти ссылок не проскочит мимо лимита в три. Если бесплатные кончились посреди пачки, предложение подписки приходит одно, а не на каждую ссылку. А если бот перезапустился, пока ссылки ждали или качались, при старте человек получит список недокачанного, и эти скачивания ему не засчитаются.
Файлы разложены по правилам Telegram
Альбом уезжает частями, крупные картинки отправляются файлом, порядок кадров сохраняется, а смешанные наборы «видео плюс фото» не рассыпаются. Если связь с Telegram моргнула, отправка повторяется с нарастающей паузой, а когда Telegram сам просит подождать — бот ждёт ровно столько, сколько попросили, а не наугад. Короткие беззвучные ролики, которые Pinterest отдаёт вместо гифок, уходят в чат гифкой, а не видео с пустой дорожкой.
Там, где выбор дорожек богатый — у YouTube и Facebook, — бот заранее прикидывает вес и берёт вариант, который поместится в лимит, а не упирается в него в конце долгой загрузки.
Ошибки написаны словами
Приватное видео, удалённая ссылка, гео-блокировка, возрастное ограничение, слишком большой файл, слетевшая авторизация, «слишком много запросов» — на каждый случай свой человеческий ответ, а где есть что посоветовать, там и подсказка, что делать дальше. Разобрано десять самых частых отказов. На одиннадцатый, которого бот ещё не встречал, наружу уйдёт короткая техническая строчка — это край, а не обычное дело, и по ней сразу видно, что чинить. Ключи и служебные адреса из неё вырезаются.
Это не косметика. Внятная ошибка снимает обращение в поддержку: человек сам понимает, что ссылка приватная, и не пишет «у вас не работает».
Бесплатный лимит, подписка и профиль
Бесплатно — три скачивания в сутки, и сутки считаются от каждого скачивания, а не от полуночи. Неудачное скачивание не списывается. Когда бесплатные кончились, бот не просто отказывает, а говорит, через сколько откроется следующее, и тут же предлагает подписку.
Подписка — месяц без ограничений, оплата звёздами прямо в Telegram: одна кнопка, без реквизитов, переводов и скриншотов владельцу. Звёзды — внутренняя валюта Telegram, их покупают в самом приложении. Подписка продлевается сама каждые тридцать дней и отменяется в настройках Telegram. Условия, поддержка и вопросы по оплате открываются отдельными командами — этого Telegram требует от ботов, которые продают.
Главная работа здесь — не кнопка оплаты, а то, чтобы деньги нигде не потерялись. Если бот лежал, пока человек платил, при запуске он найдёт этот платёж и зачислит, а старые ссылки из той же очереди выбросит. Повторное известие о том же платеже не продлит подписку второй раз. Продление сдвигает дату ровно на тридцать дней, даже если в ту же секунду человек прислал ссылку.
В разделе «Мой статус» видно, сколько бесплатных осталось на сутки, до какого числа действует подписка и сколько скачано всего.
Админка вместо доступа к серверу
Владельцу не нужно ни базы, ни консоли: всё делается в том же Telegram. Найти человека по имени или номеру, выдать подписку на нужное число дней, заблокировать и разблокировать, посмотреть сводку — сколько всего людей, сколько активных подписок, сколько скачиваний за сутки, за неделю и за месяц.
О каждой оплате и каждом продлении владелец узнаёт сообщением. В карточке человека — его платежи, и любой можно вернуть в два нажатия: звёзды уходят обратно, автопродление отключается, подписка снимается. Вернуть один платёж дважды нельзя, и никто, кроме владельца, этого сделать не может.
После отправки не остаётся ничего
Скачанный файл удаляется сразу, как только ушёл в чат. Отдельно, раз в несколько минут, бот подчищает всё, что могло зависнуть после сбоя, — в том числе если процесс оборвался посреди загрузки.
Для такого бота это вопрос не аккуратности, а доверия: бот не складывает чужие видео у себя — его копия живёт ровно столько, сколько нужно, чтобы её отправить.
Нужен такой же бот под свою задачу — с подпиской, лимитами и админкой?
НаписатьПочему в кейсе нет цифр
Бот работает и им пользуются, но на 12 сентября 2026 людей так мало, что любые проценты по ним ничего не скажут.
Он нигде не рекламировался и никуда не подавался: появился под конкретную задачу, а дальше его открывали те, кому давали ссылку. «Рост» на таких числах — случайность, а не результат.
Считать при этом есть чем. Бот с первого дня записывает каждую загрузку: кто, какая платформа, получилось или нет, сколько весил файл. Это не аналитика, прикрученная задним числом, — из этих же записей собирается сводка в админке. Станет пользователей больше — отсюда и возьмутся цифры для кейса.
Бот проверяется и без статистики: открыть его, прислать ссылку из любой из пяти соцсетей и получить файл. Всё остальное видно в исходном коде — он открыт на GitHub.
Что это даёт бизнесу дальше
Где он работает?
На домашнем мини-сервере — облако ему не нужно. Рядом работает собственный сервер Telegram для больших файлов, загрузки идут на отдельный диск. Всё собрано в контейнеры и по готовому описанию в репозитории разворачивается на арендованном сервере, если нагрузка вырастет.
А если платформа поменяет формат?
Так и происходит, регулярно. Поэтому вся работа с платформами вынесена в открытые инструменты, которые обновляются чужими руками и чаще, чем любой заказной код: обновить их — это одна строка, а не переписывание бота. То, что от инструментов не зависит, чинится в самом боте: 27 сентября YouTube начал проверять на робота запросы с одного из адресов сервера — исправление появилось в тот же день: к YouTube бот теперь ходит через другой.
Сколько людей он выдержит?
Одновременно качаются три видео, остальные ждут и получают своё следом; у одного человека в очереди до пяти ссылок, и качаются они по одной, частые нажатия гасятся. Числа небольшие и стоят в коде одной строкой: упрётся в потолок — поднимутся вместе с сервером.
Деньги правда можно брать?
Да, и без участия владельца. Человек платит звёздами Telegram, подписка включается сразу и сама продлевается каждый месяц; владелец получает сообщение об оплате и может вернуть платёж из админки. Сложные случаи разобраны заранее: повторное известие о том же платеже, продление, возврат, простой бота во время оплаты.
Что из этого переносится на другой проект?
Почти всё, кроме самого скачивания. Учёт пользователей и квот, подписка с оплатой и возвратом, админка в Telegram, очередь задач, которая после перезапуска не теряет ссылки молча, живой статус долгой работы, защита от флуда, человеческие ошибки, автоочистка файлов — это каркас любого платного бота. Меняется только то, что бот делает между «принял запрос» и «отдал результат»: вместо видео может быть отчёт, расчёт, документ или запись на приём.
Как это устроено технически
Python 3.12, aiogram 3.x, полностью асинхронно. Загрузка — yt-dlp, для досок
Pinterest, смешанных каруселей Instagram /p/ и слайдшоу TikTok /photo/ —
gallery-dl (приоритетно, с откатом на yt-dlp). Обработка видео — ffmpeg,
JS-рантайм Deno для YouTube, curl-cffi для HTTP-impersonation на TikTok
и Instagram. Платформенные селекторы форматов: Facebook — avc1 вместо
av01 с size-aware выбором DASH-потоков; YouTube — сортировка
-S res,fps,hdr:sdr,+codec:avc:m4a (разрешение важнее кодека, SDR раньше
HDR, при равном разрешении avc1 → vp9 → av01), фильтры filesize_approx
на каждой дорожке от лимита, аудио-бюджет — пятая часть лимита с потолком
и запасная ветка wa[acodec^=mp4a] для длинных роликов; formats=dashy
и --concurrent-fragments 8, чтобы холодный узел googlevideo отдавал формат
параллельными диапазонами, --abort-on-unavailable-fragments — дыра
во фрагменте даёт ошибку с возвратом квоты, а не битый файл, --force-ipv4 —
в обход бот-чека YouTube по IPv6; TikTok — H.264 с исключением
watermark-форматов download/download_addr; Instagram — bv*+ba.
Транспорт — собственный telegram-bot-api в режиме --local рядом с ботом,
облако или свой сервер переключаются флагом USE_LOCAL_BOT_API, файлы
уходят на свой сервер multipart-загрузкой по loopback, каталог загрузок
серверу не монтируется. Потолок 1500 МБ
вместо 2000 — из серверного IDLE_TIMEOUT=500 с. Обрыв отправки после 400 с считается вероятной доставкой — без повтора и дубля в чате;
TelegramEntityTooLarge не ретраится; перед загрузкой — проверка свободного
места на диске. Прогресс — построчный разбор вывода yt-dlp и план формата
до старта; процент отправки — оценка по скользящему среднему скорости
последних крупных отправок; правки статуса троттлятся и не валят загрузку.
Параллелизм ограничен семафором (3); очередь — FIFO до 5 ссылок
на пользователя, бронь квоты при постановке, журнал pending_download: после рестарта —
уведомление о недокачанном и возврат броней. Антифлуд —
throttle-мидлварь: сообщения раз в 3 секунды с запасом на пачку ссылок,
нажатия кнопок — 0,7 секунды, successful_payment проходит мимо.
Хранилище — SQLAlchemy 2.x (async) + SQLite: write-транзакции короткие,
скачивание и аплоад идут вне сессии, чтобы не держать write-lock всю загрузку.
Бесплатная квота — журнал броней в скользящем 24-часовом окне, бронь одним
INSERT … SELECT под write-lock, без гонки за последний слот. Оплата —
Telegram Stars (XTR), подписка createInvoiceLink с периодом 30 дней;
платёж идемпотентен по telegram_payment_charge_id, возврат —
refundStarPayment плюс editUserStarSubscription по номеру первого платежа
подписки. При старте очередь простоя разбирается вручную: successful_payment
скармливается диспетчеру, остальное подтверждается и выбрасывается.
Отправка медиа — чанки по 5, картинки тяжелее 10 МБ уходят документом, ретраи
с экспоненциальным backoff и учётом retry_after от Telegram API.
Конфигурация — pydantic-settings и .env с проверкой опечаток в именах
ключей, логи — loguru с ротацией. Деплой — Docker Compose в режиме
host-network (при NAT крупные аплоады рвутся из-за path MTU), загрузки —
на диске хоста, контейнер под непривилегированным пользователем с потолками
памяти и процессов; образ telegram-bot-api закреплён на версии, для
проверок есть отдельный тестовый бот со своим токеном и базой — новую сборку
можно прогнать, не трогая боевой. Cookies подсовываются утилитам
одноразовой копией, чтобы они не перезаписали мастер-файл обрезанной банкой
при транзиторном разлогине.
Кто это делал
За jw-dev.pro — я один, а не студия и не агентство. Значит, вы говорите напрямую с тем, кто делает: без менеджера, без брифа через третьи руки и без передачи проекта другому исполнителю посреди работы.
Часовой пояс UTC+7 — как в Бангкоке и Ханое. Делаю сайты, Telegram-ботов и автоматизацию — задача редко заканчивается страницей, обычно её нужно связать с тем, что у вас уже работает.
Чем дальше, тем реже задача звучит как «сделать сайт». Одному нужно, чтобы цена правилась в одном месте, а не на двадцати страницах. Другому — чтобы канал выходил без него. Третьему — чтобы весь прайс лежал внутри Telegram, куда его клиенты и так заходят каждый день. Поэтому список работ у меня открытый: если вашей задачи в нём нет, это ещё не значит, что она не решается.
Кейсы я пишу так, чтобы их можно было проверить: что было, что сделано и чем это измерено. Есть аналитика — ставлю её цифры и период, за который они сняты; мерить рано — так и пишу. «Увеличил продажи» вы тут не найдёте: это не результат, а обещание.
Нужно похожее?
Сайт, бот или то, что сейчас делается руками, — расскажите, что у вас происходит, и я скажу, решается это или нет.
Такая работа — услуга «Разработка Telegram-бота на заказ для бизнеса».
Заявка не ушла
Текст не пропал — вернитесь назад и попробуйте ещё раз. Или напишите напрямую: в Telegram, в WhatsApp или на почту.
Удобнее написать самому — в Telegram, в WhatsApp или на почту.
Не уверены, что с сайтом не так, — проверьте его бесплатно в Telegram: @jw_site_check_bot.
Кому потом всё принадлежит и что будет, если я пропаду, — ответы на главной.