Привет Хабр!
Это моя первая статья, в которой я решил поделиться своей мини историей одного проекта, который неожиданно для меня вышел за рамки "решения для друзей". Может кого-то вдохновит эта история :-)
Давным давно, в далекой-далекой галактике...
В начале 2022 года, Telegram выпустил довольно интересное обновление. Самым главным (как по мне), было появление «Видео стикеров»:

Поначалу было не совсем понятно для чего это нововведение, учитывая существующие на тот момент проблемы и баги, к тому же были "Анимированные" и "Статичные" стикеры, которые стали довольно привычной вещью и их вполне хватало (может не всем, могу сказать только за себя), да и наличие гиф в целом покрывало многие задачи. Но все же было интересно пощупать эту вундервафлю.
К тому же сделать видео-стикер было проще чем анимированный, благодаря не сильно сложным критериям и требованиям. Благодаря этому довольно быстро появились способы автоматизации этого процесса, от людей с прямыми руками, в виде телеграмм ботов. (Все как завещал Генри Форд :-) )
Первым ботом который я пользовался был на то время "Telegram Video Stickers". Процесс был очень простой:
Отправляем видео или гиф
Бот обрезает и подготавливает наш файл
Получаем в ответ .webm для офф. бота
Пьем чай с печеньем

Будущее казалось светлым и безоблачным. Тут же появилось множество наборов с нарезками кадров из фильмов, сериалов, игр, мемов, да из чего угодно. Некоторые из них (судя по статистике телеграмма, которую я видел на тот момент) имели очень большую популярность в десятки тысяч установок.
Иногда конечно были проблемы, когда бот не корректно конвертировал видео и телеграмм ругался на слишком длинный файл или не правильное разрешение. Но даже с этим можно было работать, хотя и не всегда комфортно. Однако кирпич прилетел откуда не ждали...
И в этот момент я осознал
В какой-то момент бот перестал работать. И длилось это довольно долго, около месяца (может я и ошибаюсь, но по ощущениям это было так). В это время и я и мои друзья активно пользовались видео-стикерами и часто создавали свои. Возможно тогда уже были альтернативы, но на тот момент я не смог их найти. Был спрос, а предложение умерло.
Именно в этот момент меня посетила мысль, попробовать сделать свое "прекрасное" решение, раз есть (хоть и локальный, но все же) спрос. Я же все таки программист.

На тот момент LLM не были так развиты как сейчас (хотя уже был Copilot), поэтому всю информацию приходилось искать вручную и эмпирическим путем выполнять отладку. Привет Stack Overflow!
Тогда я создал бота через BotFather и начал проводить тесты. В целом, те инструменты которые указывал телеграмм не появились вчера и примеров как это сделать было достаточно. К тому же я нашел открытый проект бота с похожим функционалом, но на другом ЯП (я писал на Python, но его идея и наработки стали вдохновением для основы бота).
Основным инструментом стал ffmpeg, довольно мощный инструмент, но в тоже время ресурсоемкий. С его помощью в пару строк можно было выполнить все условия для стикера и отдать пользователю в руки (что в целом и было сделано):

Еще одной функцией было копирование стикера:
Изначально это называлось "Kanging" - кража чужого кода (стикера) без указания авторства и выдача его за свой, этот термин перекочевал в конечное решение. В последствии я решил его оставить как напоминание об источнике, что в целом отражало смысл этой функции :-)
Сейчас это можно сделать из телефона, просто добавив стикер в пак из уже существующего. Тогда этой функции увы не было. Да и в целом без ПК довольно сложно было получить оригинальный файл, если его нужно было немного подправить или добавить что-то еще.

В целом цель была достигнута. Бот работает, стикеры создаются, проблема решена. Но как говорится — «Дело было вечером, делать было нечего». Я увидел что можно так же создавать и свои видео‑эмодзи. Принцип тот же что и с видео‑стикерами, только меньше размер. Сказано — сделано.
После некоторого количества тестов, проб и ошибок, я добавил интерфейс из нескольких кнопок, добавил генерацию имени файлов через uuid (до этого можно было случайно перезаписать нужный файл с тем же именем).

Но и этого мне стало мало и на основе старого принципа (дело было вечером...), я решил добавить поддержку кружков (или Video note, по терминологии Telegram). Задача казалось довольно простой, пока я не сел за код. Оказалось что кружки телеграмм хранит в формате видео, но с маской которую обрезает приложение при отправке.

Проведя какое-то время в поисках Немо исследовании темы, я наткнулся на вопрос на Stack Overflow, который и стал отправной точкой для решения.

Сделав пару тестов, получилось найти рабочее решение которое мне подошло. Однако все равно оставался баг, из за которого белый цвет мог удаляться и на самом видео. В конечном итоге я это исправил, но это уже далекое будущее.
Однако в процессе тестов, оказалось что процесс обработки кружков требует довольно много ресурсов и если запустить параллельно несколько обработок, то хост может лечь... (да, код скорее всего был не оптимизирован и можно было сделать лучше и быстрее, но на тот момент я смог применить только такое решение). Да и сама генерация одного стикера может занимать секунд 10.
Поняв всю серьезность ситуации, я решил умолчать об этой функции и не указывать ее отдельно в интерфейсе. Пусть будет сюрпризом для любознательных или ошибающихся :)
Пример
К сожалению старых примеров в тестовых паках не сохранилось, поэтому немного свеженького...


Вам тут письмо
После того как я закончил допиливать все фичи, я загрузил бота на Heroku (благо тогда был бесплатный тариф), скинул знакомым и друзьям ссылку и пошел праздновать заниматься другими делами.
Так бы все было и дальше, но в один момент мне приходит сообщение от незнакомого человека, а потом еще и еще, причем все на английском. Я указал в описании бота контакт аккаунта для связи, на случай если будут ошибки, что бы не потерять их в массе уведомлений.
Собственно сами месседжи





Их было даже больше, все тут не уместить. Вместе с сообщениями и возросла нагрузка на бота, и я не мог сперва понять почему, из за чего лимит Heroku уходил быстрее чем я планировал. Ссылка была только у друзей и ни в какие чаты я ее не отправлял, так откуда же они?
Найти оригинальное сообщение я не смог, но оказалось (как сказал один из обратившихся), люди находили его в поиске телеграмма. Я не знал тогда что он действительно находится в публичном доступе, а даже если и знал, то не ожидал что его вообще кто-то найдет.
В какой-то момент (как я понял) сыграло важную роль и то, что боты которыми пользовались люди, переставали работать на какое-то время и когда они ринулись искать альтернативу по ключевым словам - выпадал мой бот.
Была ситуация при которой люди даже донатили на поддержку хоста:

Кстати говоря, в какой-то момент этот донат помог продержать бота на хостинге месяц другой, пока я искал ему новое пристанище.
К сожалению в тот момент, у меня не было статистики что бы увидеть реальный спрос, а жаль. За то я реализовал ее позже, с многими другими фиксами на ошибки и баги, которые люди отправляли за это время. А их, как оказалось, было не мало. Запустив сбор статистики, я получил вот такую картину и очень удивился:

Каждая точка по условию в коде, это успешно созданный и отправленный человеку стикер. Как можно видеть, люди умудрялись делать по 100+ стикеров в день. Не могу сказать, был ли это один человек или совокупность, но для проекта на коленке результат не плохой.
Хотя, судя по некоторым сообщениям, это мог быть и один человек. Кто-то прям старался перегрузить бота и это у него выходило:

С нагрузкой все таки удалось справиться и я решил доработать статистику до нормального вида, и вот что у меня получилось:

Выглядит как прикол или ошибка в коде, но если посмотреть сколько запросов человек послал на фото выше, а таких запросов в день от него или некоторого количества других могут быть десятки или сотни, то все равно:

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

Бот все еще работает, иногда падает и поднимается с колен, но все так же выполняет свою функцию. По мере возможностей и времени я вношу необходимые фиксы и смотрю за его состоянием. Он так же бесплатен как и был с самого начала и не ограничен по функционалу (на данный момент).
Мораль сей басни
Этот небольшой проект в свое время показал мне, что даже простые и в какой-то степени локальные идеи, могут быть полезны намного большему количеству людей чем ты думал изначально.
Она давала мне вдохновение делать другие проекты, выкладывать их в Open Source и создавать решения, которые возможно помогут кому-то еще. Не для заработка или цифр, а в большей степени для возможной пользы.
Кроме того, я познакомился с большим количеством людей, одним из которых стал человек, на хосте которого бот в данный момент и крутится (Привет Левицкий :-) )
И как и многие стартапы и проекты до меня, я сам увидел как проект для друзей может стать чем-то бОльшим :-)
Тут могла быть реклама тг канала или подписки на что-то, но ее не будет, увы. :-)
Для тех кому интересно что это за бот
Я специально не указывал ник или тег бота в самой статье, ибо смысл ее не в рекламе или продвижении, а в самой истории и полученном опыте.
Но если кто-то захочет посмотреть лично, то самого бота можно найти по тегу: @videostickers_bot