Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Node.js
Code

Создание Slack Bot с помощью Node.js

by
Length:LongLanguages:

Russian (Pусский) translation by Masha Kolesnikova (you can also view the original English article)

Slack быстро становится новым отраслевым стандартом общения для команд. На самом деле, он настолько популярен, что, когда я набрал Slack в Google, как я и ожидал, первым результатом было определение слова из словаря. За этим последовал сразу сайт Slack!

Это почти неслыханно для большинства распространенных слов в английском словаре. Обычно в определении Google следуют несколько ссылок на верхние словарные сайты.

Что такое Slack?

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

На данный момент вам может быть интересно узнать, откуда здесь Node.js. Как я уже упоминал, в его самом основном, Slack - система обмена сообщениями; однако он может быть бесконечно расширен и настроен. Slack предоставляет невероятно гибкую систему для настройки интеграции вашей команды, в том числе:

  • создание пользовательских приветственных сообщений
  • создание пользовательских emojis
  • установка сторонних приложений
  • создание собственных приложений
  • создание пользовательских Slack Bots

В этой статье я собираюсь продемонстрировать, как создать Slack Bot на Node.js, который можно добавить в конфигурацию Slack вашей команды.

Определены Slack бота

Задача Slack Bot - получать события, отправленные из Slack и обрабатывать их. Существует множество событий, которые будут отправлены вашему боту, и именно здесь нам понадобится Node.js. Мы должны решить не только, какие события обрабатывать, но и как обрабатывать каждое отдельное событие.

Например, некоторые общие события, которые будет обрабатывать Bot:

  • member_joined_channel
  • member_left_channel
  • message

В этой статье я создам приложение Node.js и Slack Bot, которые могут быть добавлены в ваш командный проект для выполнения определенных действий на основе событий, которые он получает.

Для начала мне нужно создать Bot на Slack. Можно создать два типа ботов:

  • пользовательский бот
  • создание приложения и добавление пользователя-бота

В этой статье будет создан пользовательский бот, потому что пользователь-бот приложения будет более уместным, если вы планируете писать и публиковать приложение на Slack. Учитывая, что я хочу, чтобы этот бот был закрыт для моей команды, будет достаточно специального бота.

Создание пользовательского Slack Bot

Пользовательский бот можно создать здесь: https://my.slack.com/apps/A0F7YS25R-bots. Если вы уже вошли в свою учетную запись Slack, слева выберите кнопку «Добавить конфигурацию»; в противном случае войдите в свою учетную запись Slack, прежде чем продолжить. Если у вас нет учетной записи Slack, вы можете зарегистрироваться бесплатно.

Это приведет вас к новой странице, в которой вам необходимо указать имя пользователя для своего бота. Введите свое имя пользователя, следуя инструкциям по наименованию Slack. После того как вы выбрали удивительное имя бота, нажмите «Добавить конфигурацию бота».

После того, как вы успешно создали своего бота, Slack перенаправляет вас на страницу, которая позволяет выполнить дополнительную настройку вашего бота. Я оставлю эту творческую часть для вас. Единственное, что нужно от этой страницы, это токен API, который начинается с xoxb-. Я бы либо скопировал этот токен в безопасное место для последующего использования, либо просто оставил эту страницу открытой, пока нам не понадобится токен для приложения Node.js.

Конфигурации

Прежде чем перейти к коду, потребуется еще две конфигурации Slack:

  1. Создайте или выберите существующий канал, с которым будет взаимодействовать ваш бот. Пока я тестирую своего нового бота, я решил создать новый канал. Обязательно запомните название канала, оно вам понадобится в ближайшее время.
  2. Добавьте/Пригласите своего бота на канал, чтобы он мог взаимодействовать с ним.

Теперь, когда у меня настроен Slack Bot, пришло время перейти к приложению Node.js. Если у вас уже установлен Node.js, вы можете перейти к следующему шагу. Если у вас нет Node.js, я предлагаю вам начать с посещения страницы загрузки Node.js и выбрать установщика для вашей системы.

Для моего Slack Bot я собираюсь создать новое приложение Node.js, выполнив процесс npm init. В командной строке, в которой указано, где вы хотите установить приложение, вы можете запускать следующие команды:

Если вы не знакомы с npm init, запускается утилита, которая поможет вам настроить ваш новый проект. Первое, что она спросит, - это имя. Это по умолчанию мой slackbot, с которым мне удобно. Если вы хотите изменить свое имя приложения, сделайте это сейчас; в противном случае нажмите « Enter», чтобы перейти к следующему шагу конфигурации. Следующие опции - это версия и описание. Я оставил оба по умолчанию и просто продолжал, нажимая Enter для обоих этих параметров.

Точки входа

Следующее, что требуется, - это точка входа. По умолчанию используется index.js; однако многие люди любят использовать app.js. Я не хочу вступать в эту дискуссию, и если мое приложение не потребует интенсивной структуры проекта, я собираюсь оставить мое значение по умолчанию index.js.

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

  • команда тестирования
  • репозиторий git
  • ключевые слова
  • автор
  • лицензия

Для целей этой статьи я оставил все параметры по умолчанию. Наконец, после того, как все параметры были настроены, перед созданием файла отображается подтверждение файла package.json. Нажмите «Enter», чтобы завершить настройку.

Погружаемся в SDK

Чтобы облегчить взаимодействие со Slack, я также собираюсь установить пакет Slack Developer Kit следующим образом:

Готовы ли вы к некоторому коду? Я уверен, что да. Для начала я собираюсь использовать код примера с веб-сайта Slack Developer Kit, который отправляет сообщение Slack с использованием Real-Time Messaging API (RTM) с несколькими настройками.

Учитывая, что точкой входа, которую я выбрал, был index.js, пришло время создать этот файл. Пример с сайта Slack Developer Kit составляет примерно 20 строк кода. Я собираюсь разбить его по нескольким строкам за раз, только чтобы дать объяснения тому, что делают эти строки. Но учтите, что все эти строки должны содержаться в вашем файле index.js.

Код начинается с включения двух модулей из пакета Slack Developer Kit:

RtmClient будет нашим бот-объектом, который ссылается на RTM API. CLIENT_EVENTS - это те события, которые наш бот будет слушать.

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

Обязательно замените токен API, на ваш токен, полученный во время создания Slack Bot.

Вызов функции start на моем RtmClient инициализирует сеанс бота. Это попытается аутентифицировать моего бота. Когда мой бот успешно подключится к Slack, события будут отправлены. На мгновение эти события будут показаны.

При создании экземпляра клиента создается переменная channel, которая мгновенно заполняется внутри одного из событий CLIENT_EVENTS.

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

Когда сеанс RTM запущен (rtm.start();) и задан действительный токен API для бота, будет отправлено сообщение RTM.AUTHENTICATED. Следующие несколько строк прослушивают это событие:

Когда получено событие RTM.AUTHENTICATED, предыдущий код выполняет цикл for через список командных каналов Slack. В моем случае я специально ищу jamiestestchannel и гарантирую, что мой бот является членом этого канала. Когда это условие выполняется, идентификатор канала сохраняется в переменной channel.

Отладка

Чтобы помочь в отладке, регистрируется сообщение консоли, в котором отображается сообщение о том, что бот успешно прошел аутентификацию, отображая его имя (${rtmStartData.self.name}) и имя команды (${rtmStartData.team.name}) которой он принадлежит.

После того, как бот прошел аутентификацию, запускается другое событие (RTM.RTM_CONNECTION_OPENED), которое означает, что бот полностью подключен и может начать взаимодействовать с Slack. Следующие строки кода создают слушателя событий; после успеха, сообщение Hello! отправляется в канал (в моем случае jamiestestchannel).

На этом этапе я могу запустить приложение Node и посмотреть, как мой бот автоматически публикует новое сообщение на моем канале:

Результаты выполнения этой команды (при успешном завершении) двоякие:

  1. Я получаю сообщение об отладке, указывающее, что мой бот успешно вошел в систему. Это произошло из RTM.AUTHENTICATED, вызванного после запуска RTM-клиента.
  2. Я получаю сообщение Hello! в моем канале Slack. Это произошло, когда сообщение RTM.RTM_CONNECTION_OPENED было получено и обработано приложением.

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

  1. Создал пользовательского Slack Bot.
  2. Создал пользовательский Slack Channel и пригласил туда моего бота.
  3. Создано новое приложение Node.js, под названием slackbot.
  4. Установил пакет Slack Developer Kit в мое приложение.
  5. Создал мой файл index.js, который создает RtmClient, используя мой токен API из моего пользовательского бота.
  6. Создал прослушиватель событий для RTM.AUTHENTICATED, который находит Slack Channel, в который входит мой бот.
  7. Создал слушателя событий для RTM.RTM_CONNECTION_OPENED, который отправляет  сообщение Hello! моему в мой Slack каналl.
  8. Вызывается метод RTM Start Session, чтобы начать процесс аутентификации, который обрабатывают мои слушатели событий.

Создание бота

Теперь пришло время начать настоящую забаву. Slack предлагает (я не считал) не менее 50 различных событий, которые доступны для моего пользовательского бота. Как видно из списка Slack Events, некоторые события являются обычными для RTM API (которые мы используем), в то время как другие события являются обычными для API событий. На момент написания этой статьи я понимаю, что SDK Node.js поддерживает только RTM.

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

Вот пример того, как выглядит самое основное событие message из Slack:

В этом базовом объекте три наиболее важные вещи, которые мне будут интересны:

  1. channel. Я хочу, чтобы это сообщение принадлежало каналу, с которым мой бот взаимодействует.
  2. user. Это позволит мне напрямую взаимодействовать с пользователем или выполнять определенное действие, основанное на пользователе.
  3. text. Это, вероятно, самая важная часть, так как она содержит содержимое сообщения. Мой бот захочет отвечать только на определенные типы сообщений.

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

  • edited: дочерний объект, который описывает, какой пользователь редактировал сообщение и когда это произошло.
  • subtype: Строка, которая определяет один из множества различных типов, например channel_join, channel_leave и т. д.
  • is_starred: логическое значение, указывающее, было ли это сообщение оценено.
  • pinned_to: массив каналов, в которых это сообщение было закреплено.
  • reactions: массив объектов реакции, определяющих реакцию (например, facepalm), сколько раз это происходило, и массив пользователей, которые реагировали таким образом на сообщение.

Я собираюсь расширить ранее созданный index.js для прослушивания событий message. Чтобы уменьшить избыточность кода, следующие примеры будут содержать только часть кода, связанного с усовершенствованиями, которые касаются событий message.

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

Код для обработки события message я буду размещать в нижней части моего файла. Чтобы проверить правильность работы message, я создал новый прослушиватель событий, который регистрирует объект message в консоли следующим образом:

Теперь я могу повторно запустить приложение Node (node index.js). Когда я ввожу сообщение в свой канал, на мою консоль регистрируется следующее:

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

Теперь, когда я запускаю свое приложение, я вижу только сообщение об отладке, если событие message было для channel, которому принадлежит мой бот.

Теперь я собираюсь расширить приложение для отправки кастомного сообщения на канал, демонстрируя то, как можно пометить пользователь в сообщении:

Теперь, когда кто-то вводит сообщение в канал, мой бот отправляет свое собственное сообщение, которое выглядит примерно так: «Остановитесь, все слушайте, у @endyourif есть что-то важное для вас!»

Хорошо, но не очень полезно. Вместо этого я собираюсь закончить своего бота, улучшив слушателя событий message, чтобы он отвечал на конкретные команды. Это будет достигнуто путем выполнения следующих действий:

  1. Разделите text часть message на массив на основе пробела.
  2. Проверьте, совпадает ли первый индекс с именем пользователя моего бота.
  3. Если это так, то я смотрю второй индекс (если он существует) и рассмотрим это как команду, которую должен выполнить мой бот.

Чтобы было легко обнаружить, был ли указан мой бот, мне нужно создать новую переменную, которая будет хранить идентификатор пользователя бота. Ниже приведен обновленный раздел кода, в котором я ранее задавал переменную channel. Теперь он также сохраняет идентификатор пользователя моего бота в переменной bot.

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

Следующий код разбивает свойство text объекта message в массив на основе пробела. Затем я гарантирую, что у меня есть как минимум два элемента в массиве, в идеале - мой бот и команда для выполнения.

Когда первый элемент в массиве соответствует моему боту, я выполняю оператор switch со вторым элементом массива: командой. Поддерживаемые текущие команды - это jump и help. Когда сообщение отправляется на канал, который выглядит как «самый большой прыжок», мой бот будет отвечать специальным сообщением исходному пользователю.

Если команда не распознана, она попадет в мой оператор case по умолчанию для моего switch и бот ответит общей командой, которая будет выглядеть так: «@endyourif, извините, я не понимаю команду «привет». Для получения списка поддерживаемых команд, введите: @jamiestest help".

Вывод

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

  • Обращайтесь к члену новой команды, слушая событие team_join. Когда присоединяется новый член команды, было бы неплохо послать им разнообразную информацию и/или документацию, приветствуя их в вашей команде.
  • Увеличьте список поддерживаемых команд, с которых я начал.
  • Сделайте интерактивные команды, выполнив поиск в базе данных, Google, YouTube и т.д.
  • Создайте пользователя-бота в приложении и создайте свои собственные команды.
Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.