Всё началось с банальной боли: постоянно натыкаешься на классные тиктоки или шортсы, но чтобы их сохранить, нужно либо танцевать с бубном, либо качать через стандартную кнопку, получая на выходе видео с прыгающим водяным знаком.
Я подумал: а что если сделать простую тулзу прямо в Telegram? Кидаешь ссылку — получаешь чистое видео и отдельной дорожкой звук (идеально для мемоделов и тех, кто ищет музыку из видео).
Сказано — сделано. В этой статье расскажу, как я это реализовал на Python, какие инструменты использовал и с какими граблями столкнулся.
Для тех, кому лень читать про код и поднимать свой сервер, вот готовый результат — мой бот @SaveTubeMediaBot. Сразу оговорюсь, чтобы не закидали тапками: бот крутится на моем личном сервере, и плачу за него ТОЛЬКО Я.
А теперь для тех, кто хочет сделать всё сам — погнали под капот!
Никакого космоса, всё просто и надежно:
1. Python — мой основной язык программирования.
2. aiogram — отличная асинхронная библиотека для работы с Telegram API.
3. yt_dlp — неофициальная, но невероятно мощная библиотека для парсинга YouTube, TikTok и еще кучи сайтов. Именно она делает всю «магию» по получению ссылок без водяных знаков.
4. FFmpeg — швейцарский нож для работы с медиа. Бот дергает его системными командами, чтобы извлечь аудиодорожку из скачанного видео.
Архитектура: как это работает
Логика работы бота разбита на 5 простых шагов:
1. Получение ссылки: Юзер кидает ссылку на видео.
2. Валидация: Бот регулярками проверяет, что это действительно ссылка на поддерживаемый сервис, а не какой-то спам.
3. Парсинг: В дело вступает yt_dlp — вытаскивает метаданные и прямую ссылку на исходник видео (без вотермарок).
4. Скачивание: Файл летит на сервер, а оттуда через Telegram API — пользователю.
5. Извлечение аудио: FFmpeg конвертирует видео в MP3, и бот отправляет звук отдельным сообщением.
Вот базовый кусок кода, который отвечает за скачивание видео. Это ядро, вокруг которого потом наворачивается логика Telegram-бота:
import yt_dlp
def download_youtube_video(url):
ydl_opts = {
# Имя файла будет сохраняться как оригинальное название видео
'outtmpl': '%(title)s.%(ext)s',
}
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
ydl.download([url])
if __name__ == '__main__':
video_url = input("Введите ссылку на видео YouTube или TikTok: ")
download_youtube_video(video_url)
Что самое крутое: этот скрипт и библиотека переваривают не только ютуб и тикток, но и VK Видео.
Буду рад, если мой опыт кому-то пригодится. Пишите в комментариях, пользовались ли вы yt_dlp .