Telegram: Quote-maker Bot от @Lamppilutti и @oniquefin
28.11.2018


Примечание от админа

Впервые публикую на страницах своего бложика гостевой материал. Такое волнительное событие! Сегодня речь пойдёт про бота, созданного другими людьми, но которым активно пользуются как люди в наших сообществах, так и ваш покорный слуга лично. Так что я подумал, что будет большим упущением не упоминуть про него в рамках данного цикла статей. К счастью, Ламппи Лутти с радостью согласился на моё предложение черкануть про бота пару строчек. Мне лишь оставалось немного помочь с редактурой и стилистическим оформлением. Прошу любить и жаловать!

Почему заголовок в этот раз не содержит юзернейма бота? Поймёте по ходу чтения статьи =)


Вступление

Всем привет, я Lämppi Lütti, и меня пригласили написать о моём боте в цикле статей о Telegram-ботах.


Бот, который нравился многим

Сначала это был бот для выполнения хотелок одного товарища из небезызвестной Telegram-конфы @kdr_flood. Одной из его хотелок было создание картинок-цитат из выбраного сообщения. Так как автор [яблочный пирог — прим. редактора] не мог и не хотел заниматься вопросами хостинга, бот часто лежал и постоянно приходилось ждать его запуска. После, к этому прибавились постоянные падения из-за попыток зацитатить нетекстовые сообщения. Так как эта функция забавляла некоторых обывателей конфы, то были предложения от @kozalo и @iosys о хостинге бота, если падения будут исправлены. Но автор не стремился что-либо исправлять и просто забил. Шли разговоры о том, что было бы неплохо воскресить бота, но лезть исправлять код никто не спешил. В конечном итоге залез я, благо автор оставил исходники в открытом доступе. Отсюда берёт начало Quote-maker (или @iosys_bot, так как я тоже не сильно хотел заниматься хостингом и просто отправил бота тому, кто предложил его захостить). Это был маленький бот, который понравился многим.


Бот, который использовали

Как говорилось ранее, новый бот — это всего лишь одна функция «зацитатить в картинку», поэтому количество команд у него равно двум: это /quote_ru — для цитирования с русским заголовком и /quote_en — для цитирования с английским заголовком. Наличие цитирования на английском — это не попытка выхода на международный рынок, а функция для тех ситуаций, когда цитируется сообщение на английском (чтобы было гармонично: английский текст с английским заголовком). Также были внесены небольшие нововведения:

  • исправлены падения от попыток цитирования нетекстовых сообщений;
  • размер картинки стал зависеть от количества текста;
  • небольшое изменение в рисовании.

Это был бот, который использовали.

Этот бот, как и его прародитель, написан на Python 3, с использованием библиотек pyTelegramBotApi (для работы с Telegram Bot API) и Pillow (для рисования). Сам код написан не в лучшем стиле. Кому интересно, вот репозиторий.


Бот, который был нужен только мне

После завершения работы над ботом на Python я нашёл для себя интересным язык Clojure (диалект LISP для JVM) и в качестве тренировки решил переписать бота-цитатера на него, попутно исправляя ошибки и добавляя некоторые «фичи». После окончания работы над ботом @iosys по надуманным причинам отказывал в хостинге, а после заявил, что бот на Clojure работает медленнее, чем на Python, да и к тому же требует больше оперативной памяти. Проблема с медленной скоростью действительно есть, хотя всё не так страшно. Дело в том, что для каждого сообщения боту приходится просчитывать координаты (это нужно для динамического растягивания картинки в зависимости от количества текста), но просчёт идёт один раз для одного и того же набора входных данных. То есть если бот получает сообщение размером, допустим, в 40 символов, то расчёты для примерно такого же по размерам сообщения будут взяты из кеша (особенность Clojure). Из-за этого и увеличивются требования к RAM (не считая того, что требует JVM). Возможно, всё можно было решить обычной настройкой виртуальной машины, которую никто не делал.

Конечно, позже я занялся вопросом хостинга и даже запустил бота на своём VPS! Но @iosys'у — хостеру и, по совместительству, админу тех двух конф, для которых писался бот, — всё это дело как-то не очень понравилось, и всё сошлось к тому, что бота не стало ни в одной из них. Не то чтобы у меня не было других конф, просто эти были единственными с либеральной политикой по отношению к ботам. И всё пришло к тому, что я отказался от аренды VPS и удалил бота из Телеги. В итоге получился бот, который был нужен только мне.

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

  • возможность подключения тем;
  • цитирование нескольких сообщений;
  • цитирование с изображением/стикером.

Для работы с Telegram Bot API используются библиотеки morse и clj-http (последняя нужна из-за сырости morse, так как в ней нет функций для получения и скачивания файлов из Telegram). Для рисования используется пакет awt из стандартной библиотеки Java.


Послесловие

Спасибо за прочтение моей статьи! Это был интересный и забавный опыт — написание статьи в чей-то персональный блог.