Привет! Меня зовут Боровков Евгений и я предприниматель. В этой статье я расскажу про свой pet-проект. Или как я решил проблему вечного поиска информации прямо в уютном Телеграммчике.

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

Бизнесовая часть и проблематика

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

Суть бота очень проста и видна на видео ниже:

Если смотреть не хочется, то вкратце:

Еду, значит, я в метро\такси\автобусе на работу. И тут новому подрядчику\коллеге\клиенту срочно потребовалось скинуть наши реквизиты. Для счета\договора\акта\чего угодно.

Где мне их найти быстро? В закладках? В автозамене? В загрузках в телефоне? В “Избранном”? Думаю вы уловили, или сталкивались с таким сами ????

У нас даже в какой то момент появилось специальное удобное хранилище таких файлов и информации. Но достаточно быстро оно все равно забилось и проблему не решило. Пример с реквизитами тут взят исключительно как пример. Ведь всем вокруг постоянно нужны кроме реквизитов еще и логотип в “линиях”, ссылки на какие-то сайты, или, в конце концов, смешные гифки.

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

В итоге решили писать своего. Чат-ботов мы делаем уже больше 4 лет, видение уже +- сформировалось, на серверах место для еще одного бота найдется. Поехали!

Бизнесовая логика работы бота

Второе видео как продолжение первого:

Бот работает на столько просто, что разберется даже ребенок:

  • Добавляем бота @trigger_new_bot в чат (можно не делать админом).

  • Пишем какое-то сообщение или кидаем гифку\файл\видео — что угодно.

  • Делаем реплай нужного сообщения и пишем команду /set_trigger ключевое слово (или триггер) например «/set_trigger реквизиты».

  • Бот пришлет сообщение «триггер установлен».

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

Больше бот не делает НИ ЧЕ ГО. И тем самым соблюдает две основные заповеди ботостроения: имеет простой функционал и молчит когда его не спрашивают.

Количество чатов не ограничено, количество триггеров внутри чата не ограничено.

Как это работает под капотом

Основной ЯП, который мы используем, это Java. По нему у нас накоплена самая большая компетенция. Поэтому бот построен на Spring boot стеке:

<dependency>
<groupId>org.telegram</groupId>
<artifactId>telegrambots-spring-boot-starter</artifactId>
<version>5.7.1</version>
</dependency>

База: MongoDB. Бот не хранит сами сообщения и не скачивает файлы. Ему достаточно хранить только ссылки на них.

Теперь по пунктам

  • Пишем сообщение: гифку\файл\видео — что угодно

  • Делаем реплай нужного сообщения и пишем команду /set_trigger ключевое слово (или триггер) например «/set_trigger реквизиты».

После этого бот:

  1. Достает имя триггера из сообщения

String command = userText.replace("/set_trigger", "").trim();

2. Достает ссылку на само сообщение, которое должно быть сохранено

if (reply.hasText()) {
Message reply = update.getMessage().getReplyToMessage();
String triggerMessage = reply.getText();
}
  1. Собирает триггер и сохраняет его в БД

Trigger  trigger = Trigger.builder()
.chatId(chatId)
.commandName(command)
.triggerMessage(triggerMessage)
.triggerType(triggerType)
.build();

triggerRepository.save(trigger);

4. Отправляет ответ, что все сделано

Bot.send(new SendMessage(
chatId.toString(),
EmojiParser.parseToUnicode(":white_check_mark:") + createdInfo + "\n + triggerMessage));

Другие технические тонкости

Собирается проект с помощью Maven. Просто так вышло, не спрашивайте почему. Другие проекты мы собираем, как правило, с помощью Gradle.

Собранный jar запущен на vps как unix-сервис. Для комфортной работы бота хватает 512 мб памяти. Не смотря даже на количество пользователей и количество заведенных триггеров, этого пока вполне достаточно.

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

Бот не требует никакого обслуживания и внимания. Единственное, что недавний переход телеги на 64-битный идентификатор заставил перелопатить некоторых наших ботов. В том числе и этого.

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

Что еще

На данный момент, мы думаем как улучшить бота, не уничтожив его “шарм минималистичности”. Если есть идеи, пишите в комментарии.

Комментарии (20)


  1. qark
    11.10.2022 12:29

    Если использовать то же имя триггера для другого сообщения, предыдущее потеряется?


    1. Borovkov Автор
      11.10.2022 12:46

      Да, старый затрется и встанет новый


  1. nagafonov
    11.10.2022 12:46
    +3

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


    1. Borovkov Автор
      11.10.2022 12:47
      +1

      Кому-то подходят закрепы, кому-то хештеги. Но мы для себя такой формат вот нашли.

      Для списка триггеров есть команда /trigger_list


    1. stranger777
      11.10.2022 14:03

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


      1. Borovkov Автор
        11.10.2022 15:51
        +1

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

        И да, разовые теги 100% забываются. Закрепы чаще всего это САМАЯ важная информация. А триггеры лепи на что угодно и в любой момент потом можно весь список их посмотреть.


  1. shamanchik
    11.10.2022 14:22

    А что произойдет, если написать в чат:
    Привет, дизайнеры не смогут сегодня предоставить проект. Дизайнеры просто не успевают


    1. Borovkov Автор
      11.10.2022 15:49
      +1

      В этом боте нет поиска по тексту. Бот просто не отреагирует.

      Мы посчитали, что так удобнее, чем получать кучу спама на каждое сообщение, в котором упоминается триггерное слово


      1. shamanchik
        11.10.2022 16:08

        Т.е. он просто реагирует на одиночные сообщения содержащие триггер?
        Если так, то - ок ????


        1. Borovkov Автор
          11.10.2022 16:26

          Да, только если точное совпадение. С учетом регистра.

          "Гифка" и "гифка" это разные триггеры


          1. shamanchik
            11.10.2022 16:49

            Подумалось: а почему Вы используете сложную команду из двух слов и подчеркивания? Почему просто не использовать /trigger (/note, /!)? Кстати, можно ли использовать команды на русском языке (я понимаю, что переключиться не занимает много времени, но все же)?
            А с мобилки так вообще какой нибудь спец символ из того же набора где слеш

            Слой родной Apple клавиатуры с спецсимволами
            Слой родной Apple клавиатуры с спецсимволами


            1. Borovkov Автор
              11.10.2022 18:34

              Мы используем говорящие сами за себя команды. Такова практика ботостроения.

              Вот допустим мы добавим команду /trigger и что она будет значить? Удалить или добавить? А вторую тогда какую делать?

              Что касается спец символов и русского языка: телега не поддерживает их. Только англ и только нижние подчеркивания (тире тоже не прокатит).

              Ну и если бот добавлен в группу то при вводе / вылезает меню с подсказкой.

              И это не считая того, что слеш уже есть в интерфейсе


      1. ATCO_ACC
        13.10.2022 19:25

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


  1. rutexd
    13.10.2022 14:52
    +1

    Я извиняюсь но смотря на " Для комфортной работы бота хватает 512 мб памяти" хочется плакать. К автору статьи вопросов нет но...


    1. Borovkov Автор
      13.10.2022 14:52

      Но что? Это камень в огород джаве?)


      1. rutexd
        13.10.2022 15:48
        +1

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


  1. ATCO_ACC
    13.10.2022 14:52

    Доброго времени суток, я так понял, что бот работает только в чате, куда его добавили. То есть, чтобы найти нужную информацию, нужно постоянно открывать чат с ботом и пересылать сообщение. Имеет смысл настроить InlineQuery, чтобы можно было обращаться к боту из любого чата и сразу же отсылать нужное сообщение.


    1. Borovkov Автор
      13.10.2022 14:54

      Да, только в чате куда его добавили. В другом чате будут уже свои триггеры.

      Инлайн мы тоже думали сделать, но не стали. Потому что в одном чатике можно работать работу, а в другом кекать с мемасов. Эти активности перемешивать было бы странно (по крайней мере мы так подумали)


      1. ATCO_ACC
        13.10.2022 19:32

        Так вам ничего не мешает кекать или работать. Через поле ввода сообщения вы можете обращаться напрямую к конкретному боту через @ и выбирать нужную информацию, то есть в вашем "кекном" чате этот никак не будет отражаться, пока к нему не обратиться. Им можно воспользоваться в любом чате или группе, даже никуда не добавляя.

        Возможно, мы о разном функционале говорим.


      1. ATCO_ACC
        13.10.2022 19:36

        https://docs.python-telegram-bot.org/en/v20.0a4/telegram.inline-tree.html

        Я про этот режим говорю. Тут, правда, питон, но общее представление можно получить, наверное.