кейсыjw-social-downloader

enобсудить задачуменюзакрыть

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 — видео.

Карточка бота «Что умеет этот бот?»: знак со стрелкой загрузки, пять соцсетей, файл до 1,5 ГБ, до пяти ссылок за раз, три бесплатных скачивания в сутки и подписка за звёзды
Первое, что человек видит, открыв бота: пять соцсетей, файл до полутора гигабайт, до пяти ссылок за раз и три бесплатных скачивания в сутки. Инструкции читать не нужно — дальше он просто присылает ссылку.

Под каждую платформу — свой рецепт

Это главная невидимая часть работы. Для каждой из пяти соцсетей подобран свой порядок предпочтений: какой формат брать первым, на что переключаться, если его нет, и что считать негодным ни при каких условиях.

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

Звучит как мелочи, но именно из этих мелочей складывается разница между «скачалось» и «скачалось так, что можно смотреть».

Где один инструмент пасует, включается второй

Основной загрузчик отлично работает с видео и совершенно не умеет доски Pinterest, смешанные карусели Instagram и фото-слайдшоу TikTok — на них он либо возвращает пустоту, либо молча теряет половину картинок.

Для этих трёх случаев бот сразу идёт другим инструментом, а если и тот ничего не принёс — возвращается к первому. Человек об этой развилке не знает: он просто получает свой альбом целиком.

Ссылка pin.it в чате и пришедшая следом картинка с подписью «Фото из Pinterest»
Короткая ссылка pin.it — и картинка в чате. За такими бот с самого начала идёт вторым инструментом: первый на картинках Pinterest возвращает пустоту.

Видео до полутора гигабайт

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

Потолок мог бы быть и два гигабайта, но свой сервер Telegram обрывает соединение, если ответа нет дольше восьми с лишним минут. Два гигабайта на скорости домашнего канала уходят почти впритык к этому пределу, и если отправка его переждёт, бот уже не узнает, дошёл ли файл. Полтора уходят с запасом.

Большие файлы приносят свои поломки, и они закрыты заранее. Если Telegram оборвал соединение после долгой отправки, файл, скорее всего, уже ушёл: бот не отправляет его второй раз, а пишет, что Telegram ещё обрабатывает файл и он, скорее всего, появится в чате в ближайшие минуты, — иначе человек получил бы два одинаковых видео. Если YouTube не отдал кусок ролика, бот не склеивает видео с дырой, а честно говорит, что скачать не вышло, и это скачивание не засчитывает. Файл, который всё-таки вышел тяжелее лимита, не отправляется: бот говорит, сколько получилось, и советует ролик покороче.

Загрузки идут на отдельный внешний диск. Если он отвалится, файлы пошли бы на маленький системный — и гигабайтное видео уронило бы весь сервер вместе с базой. Поэтому перед каждой загрузкой бот проверяет, что места хватает, а при нехватке просит попробовать через несколько минут — и попытку не списывает.

Видно, сколько осталось

Гигабайт качается и уходит минутами, поэтому бот не молчит. Статус живёт в одном сообщении и обновляется по ходу работы.

Перед началом скачивания видно, в каком качестве и какого веса придёт видео. Если не в максимальном, бот объясняет почему: в 4K ролик весит больше, чем можно отправить, поэтому придёт лучшее, что помещается, — например, 1080p.

Во время скачивания — шкала с процентами и оставшимся временем. Когда видео склеивается со звуком, так и написано. При отправке в Telegram — примерный процент: сам Telegram ход приёма файла не сообщает, и бот считает его по средней скорости последних крупных отправок. Поэтому процент честно помечен как примерный.

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

Статус загрузки видео с YouTube: «Скачиваю видео · 1080p · 629 МБ», шкала на 23% и «осталось меньше минуты»
Почти часовое видео с YouTube: в статусе сразу качество и вес файла, ниже — шкала с процентами и сколько осталось. Сообщение одно и обновляется само.

До пяти ссылок за раз

Ссылки можно присылать пачкой — до пяти, одним сообщением или по одной. Бот ставит их в очередь и качает по одной; у каждой своё сообщение со статусом и местом в очереди: «В очереди: 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 — отвечу сам.

Удобнее написать самому — в Telegram, в WhatsApp или на почту.

Не уверены, что с сайтом не так, — проверьте его бесплатно в Telegram: @jw_site_check_bot.

Кому потом всё принадлежит и что будет, если я пропаду, — ответы на главной.