Создание Telegram-бота, который автоматически превращает любое видео в формат видео-сообщения (кружка). Проект начинался с Python-скрипта на базе moviepy и ffmpeg, затем был обёрнут в Telegram-бота с помощью python-telegram-bot
08 открытий19 показов
Telegram давно позволяет отправлять видеосообщения в формате кружков — они выглядят живо, интерактивно, а главное — привлекают внимание куда лучше, чем обычные видеофайлы. И вот однажды мне захотелось сделать такой кружок… не с камеры, а из заранее подготовленного ролика.
Решил не останавливаться на одном видео — и написал автоматизированный скрипт на Python, а позже — и Telegram-бота, который превращает любое видео в Telegram-кружок. Рассказываю по порядку.
Что такое Telegram-кружок (video message)
С технической точки зрения это:
.mp4
видео;- квадратное (1:1), отображается в виде круга в клиенте;
- длительность — до 60 секунд;
- кодек H.264, контейнер MP4;
- ограниченный битрейт (до 1 МБ/минуту — неофициально);
- поддерживается только в мобильных клиентах (на десктопе выглядит как обычное видео).
Цель
Сделать скрипт (и впоследствии бота), который:
- принимает любое видео;
- обрезает до 1:1;
- уменьшает длительность до 60 секунд;
- кодирует в H.264;
- сохраняет в виде MP4, подходящего для отправки как кружок.
Этап 1: Простой скрипт на Python
Используем moviepy
и ffmpeg
. Убедитесь, что ffmpeg
установлен в системе (ffmpeg -version
).
Установка зависимостей
pip install moviepy
Код конвертации видео
from moviepy.editor import VideoFileClip import os def make_circle_video(input_path, output_path, max_duration=60): clip = VideoFileClip(input_path) # Обрезка до 1 минуты if clip.duration > max_duration: clip = clip.subclip(0, max_duration) # Обрезка до квадрата по центру size = min(clip.w, clip.h) x_center = clip.w / 2 y_center = clip.h / 2 clip = clip.crop( x_center=x_center, y_center=y_center, width=size, height=size ) # Сохранение clip.write_videofile( output_path, codec="libx264", audio_codec="aac", fps=30, threads=4, bitrate="800k" ) print("Готово! Сохранено в:", output_path) # Пример использования make_circle_video("input.mp4", "circle_output.mp4")
После этого вы можете отправить полученный файл в Telegram → нажать на скрепку → выбрать видео → и выбрать опцию 📹 Отправить как видео-сообщение (в мобильной версии).
Этап 2: Обёртка в Telegram-бота
Когда всё заработало локально, решил завернуть это в бота, чтобы не запускать скрипт вручную. Использовал python-telegram-bot, Flask
и простой сервер на VPS.
Архитектура:
- Telegram API (бот через Webhook)
- Обработка видео — через тот же скрипт
- Временное хранилище — /tmp и очистка старых файлов.
Логика:
- Получает видео
- Обрабатывает
- Отправляет обратно результат
Фрагмент логики обработки:
from telegram import Update from telegram.ext import ApplicationBuilder, MessageHandler, filters, ContextTypes import asyncio async def handle_video(update: Update, context: ContextTypes.DEFAULT_TYPE): video_file = await update.message.video.get_file() input_path = f"/tmp/{video_file.file_unique_id}.mp4" output_path = f"/tmp/circle_{video_file.file_unique_id}.mp4" await video_file.download_to_drive(input_path) make_circle_video(input_path, output_path) await update.message.reply_video(video=open(output_path, 'rb'), supports_streaming=True)
Добавил команды /start
и /feedback
, логику очередей и обработку ошибок. Всё — на минималках, но работает.
Ознакомится с результатом: @roundifyrobot
Что делает:
- принимает видео до 1 минуты;
- обрезает, сжимает, выдает кружок;
- можно сразу переслать в канал или другу;
- добавил простую систему фидбэка через
/feedback
.
Выводы
Этот мини-проект оказался полезным не только как утилита, но и как:
- Тренировка работы с видео в Python;
- Практика работы с Telegram Bot API;
- Реальный кейс для обработки и доставки мультимедиа в чатах;
- Возможность собрать аналитику, статистику, запросы, баги и развивать дальше.
Если вы тоже хотите сделать своего Telegram-бота с мультимедийной обработкой — берите этот проект за основу, добавляйте свои фишки, улучшайте UI/UX и выкладывайте в open source. Это отличный формат для pet-проекта или MVP стартапа.