Как стать автором
Обновить

Как проект для друзей стал чем-то большим

Уровень сложностиПростой
Время на прочтение6 мин
Количество просмотров2.2K

Привет Хабр!

Это моя первая статья, в которой я решил поделиться своей мини историей одного проекта, который неожиданно для меня вышел за рамки "решения для друзей". Может кого-то вдохновит эта история :-)

Давным давно, в далекой-далекой галактике...

В начале 2022 года, Telegram выпустил довольно интересное обновление. Самым главным (как по мне), было появление «Видео стикеров»:

Как это выглядело в официальном посте Telegram
Как это выглядело в официальном посте Telegram

Поначалу было не совсем понятно для чего это нововведение, учитывая существующие на тот момент проблемы и баги, к тому же были "Анимированные" и "Статичные" стикеры, которые стали довольно привычной вещью и их вполне хватало (может не всем, могу сказать только за себя), да и наличие гиф в целом покрывало многие задачи. Но все же было интересно пощупать эту вундервафлю.

К тому же сделать видео-стикер было проще чем анимированный, благодаря не сильно сложным критериям и требованиям. Благодаря этому довольно быстро появились способы автоматизации этого процесса, от людей с прямыми руками, в виде телеграмм ботов. (Все как завещал Генри Форд :-) )

Первым ботом который я пользовался был на то время "Telegram Video Stickers". Процесс был очень простой:

  • Отправляем видео или гиф

  • Бот обрезает и подготавливает наш файл

  • Получаем в ответ .webm для офф. бота

  • Пьем чай с печеньем

Как это выглядело в самом боте
Как это выглядело в самом боте

Будущее казалось светлым и безоблачным. Тут же появилось множество наборов с нарезками кадров из фильмов, сериалов, игр, мемов, да из чего угодно. Некоторые из них (судя по статистике телеграмма, которую я видел на тот момент) имели очень большую популярность в десятки тысяч установок.

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

И в этот момент я осознал

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

Именно в этот момент меня посетила мысль, попробовать сделать свое "прекрасное" решение, раз есть (хоть и локальный, но все же) спрос. Я же все таки программист.

Примерно в такой позе и приходят такие идеи
Примерно в такой позе и приходят такие идеи

На тот момент LLM не были так развиты как сейчас (хотя уже был Copilot), поэтому всю информацию приходилось искать вручную и эмпирическим путем выполнять отладку. Привет Stack Overflow!

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

Основным инструментом стал ffmpeg, довольно мощный инструмент, но в тоже время ресурсоемкий. С его помощью в пару строк можно было выполнить все условия для стикера и отдать пользователю в руки (что в целом и было сделано):

Так выглядели первые тесты, бот называл файл используя ID аккаунта
Так выглядели первые тесты, бот называл файл используя ID аккаунта

Еще одной функцией было копирование стикера:

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

Сейчас это можно сделать из телефона, просто добавив стикер в пак из уже существующего. Тогда этой функции увы не было. Да и в целом без ПК довольно сложно было получить оригинальный файл, если его нужно было немного подправить или добавить что-то еще.

Как происходил процесс "вдохновления" :)
Как происходил процесс "вдохновления" :)

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

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

Выглядит поприличнее
Выглядит поприличнее

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

Вот как это выглядит, если скачать кружок
Вот как это выглядит, если скачать кружок

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

Как звучал сам тред
Как звучал сам тред

Сделав пару тестов, получилось найти рабочее решение которое мне подошло. Однако все равно оставался баг, из за которого белый цвет мог удаляться и на самом видео. В конечном итоге я это исправил, но это уже далекое будущее.

Однако в процессе тестов, оказалось что процесс обработки кружков требует довольно много ресурсов и если запустить параллельно несколько обработок, то хост может лечь... (да, код скорее всего был не оптимизирован и можно было сделать лучше и быстрее, но на тот момент я смог применить только такое решение). Да и сама генерация одного стикера может занимать секунд 10.

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

Пример

К сожалению старых примеров в тестовых паках не сохранилось, поэтому немного свеженького...

Процесс создания
Процесс создания
Собственно итог
Собственно итог

Вам тут письмо

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

Так бы все было и дальше, но в один момент мне приходит сообщение от незнакомого человека, а потом еще и еще, причем все на английском. Я указал в описании бота контакт аккаунта для связи, на случай если будут ошибки, что бы не потерять их в массе уведомлений.

Собственно сами месседжи

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

Найти оригинальное сообщение я не смог, но оказалось (как сказал один из обратившихся), люди находили его в поиске телеграмма. Я не знал тогда что он действительно находится в публичном доступе, а даже если и знал, то не ожидал что его вообще кто-то найдет.

В какой-то момент (как я понял) сыграло важную роль и то, что боты которыми пользовались люди, переставали работать на какое-то время и когда они ринулись искать альтернативу по ключевым словам - выпадал мой бот.

Была ситуация при которой люди даже донатили на поддержку хоста:

Неожиданно и приятно
Неожиданно и приятно

Кстати говоря, в какой-то момент этот донат помог продержать бота на хостинге месяц другой, пока я искал ему новое пристанище.

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

Я знаю, график очень "репрезентативный" :)
Я знаю, график очень "репрезентативный" :)

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

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

Это ожидаемо, но все равно слишком много...
Это ожидаемо, но все равно слишком много...

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

Даже для меня эта цифра какая-то заоблачная
Даже для меня эта цифра какая-то заоблачная

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

Даже учитывая что есть очистка дубликатов данных и проверка на повторение. Может все таки это и правда...

А если заглянуть в первые посты инфо канала, на которые попадают люди, то в целом верится в такие цифры:

Все равно выглядит не обычно
Все равно выглядит не обычно

Бот все еще работает, иногда падает и поднимается с колен, но все так же выполняет свою функцию. По мере возможностей и времени я вношу необходимые фиксы и смотрю за его состоянием. Он так же бесплатен как и был с самого начала и не ограничен по функционалу (на данный момент).

Мораль сей басни

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

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

И как и многие стартапы и проекты до меня, я сам увидел как проект для друзей может стать чем-то бОльшим :-)

Тут могла быть реклама тг канала или подписки на что-то, но ее не будет, увы. :-)

Для тех кому интересно что это за бот

Я специально не указывал ник или тег бота в самой статье, ибо смысл ее не в рекламе или продвижении, а в самой истории и полученном опыте.
Но если кто-то захочет посмотреть лично, то самого бота можно найти по тегу: @videostickers_bot

Теги:
Хабы:
+6
Комментарии2

Публикации

Ближайшие события