Кто ты в digital-войсках: пример создания Telegram-бота на Node.js
Озадаченные вопросом как поздравить сильную половину человечества и реализовать свой творческий потенциал, компания Центр Высоких Технологий создала Telegram-бота @DigitalArmyHTCBot.
Несмотря на то, что Telegram — запрещенный канал связи и «совсем» недоступен в России. Для поздравления наших друзей, коллег и клиентов мы решили использовать именно его.
Бот представляет собой анкету-опрос по ИТ-тематике с элементами из Project management и выбором ответа из нескольких предложенных вариантов.
Используемые технологии:
- Node. js — js интерпретатор
- node-telegram-bot-api — библиотека для работы с Telegram
- AWS EC2 — сервер
Подробная инструкция по созданию бота
Инициализация бота:
Начать необходимо с создания объекта с пользователями, в котором ключами являются chatID, а свойствами — объект с состоянием пользователя (IDLE/IN_PROGRESS/DONE) и количеством пройденных вопросов.
(На самом деле, в этом боте состояния IDLE/IN_PROGRESS/DONE не понадобились, так как логика очень простая, но обычно бывает очень удобно представить бота как конечный автомат с каким-то заданным набором состояний и переходов между ними).
При получении сообщения в аргумент функции обратного вызова или callback приходит объект типа Message, в котором есть свойство-объект chat, а у него в свою очередь есть свойство id. То есть, получить chatID, чтобы записать его в объект пользователей, можно, например, при получении команды /start (она приходит в любом случае, если пользователь начинает общение с ботом).
Выглядеть это будет примерно так:
У библиотеки node-telegram-bot-api есть метод. sendPhoto, в который можно передать url изображения и библиотека будет отправлять это изображение пользователю. Однако, при его использовании мы столкнулся с проблемой — метод не отправляет изображение и выкидывает ошибку 400 «Bad request». После просмотра issues в GitHub и безуспешных поисков, мы решили использовать другой метод — .sendDocument, который принимает такой же набор аргументов, тоже принимает url и высылает изображение, но в виде документа.
Для отправки сообщения пользователю используется метод. sendMessage(chatID, message, options). Он принимает в аргументы chatID, текст сообщения и параметры. В параметрах можно, например, указать «parse_mode»: «HTML», чтобы можно было отправлять стилизованный текст (жирный, курсив и др).
Чтобы отправлять сообщения, как варианты ответа боту, есть специальное свойство в аргументе options метода. sendMessage «reply_markup», в котором есть свойство «keyboard», где указывается массив с вариантами ответов.
Все фразы содержатся в отдельном файле. Есть приветствие, вопросы с вариантами ответов и порядковым номером, профессии с ссылками на соответствующие изображения и результирующий текст.
Попробовать, что у нас получилось можно в Telegram @DigitalArmyHTCBot