Как создать простого Slack-бота

Slack — удивительно простой инструмент для общения. Все в пределах досягаемости ваших пальцев. Вы можете привлечь чье-либо внимание несколькими нажатиями клавиш. Отвлекайте их вопросом всякий раз, когда вам слишком скучно, чтобы найти ответ самостоятельно ;-)

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

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

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

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

Мы создадим нашего бота на Node.js, поэтому вам необходимо установить node и npm. Если вы хотите развернуть свое приложение на Heroku, вам также понадобится учетная запись Heroku, а также установленный CLI. Чтобы запустить ваше приложение локально, вам также необходимо установить и запустить экземпляр RethinkDB.

Чтобы создать приложение, запустите в терминале следующее.

$ mkdir stalker-bot && cd stalker-bot
$ npm init -y
$ npm install @slack/events-api @slack/web-api rethinkdb

Это инициализирует приложение Node.js и установит все необходимые зависимости.

Прослушивание событий Slack

Мы создадим сервер Node.js для прослушивания событий Slack. Создайте файл index.js и добавьте следующий код сервера.

Сначала мы настраиваем библиотеки slack, а именно сервер прослушивателя событий и веб-клиент. Затем мы слушаем message событий. Прямые сообщения интерпретируются как команды, а сообщения в каналах прослушиваются на случай, если нам нужно уведомить сталкера.

Команды бота

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

  • subscribe пользователю канала
  • unsubscribe от пользователя на канале
  • list все текущие подписки

Чтобы сохранить все подписки, мы будем использовать мою любимую в последнее время базу данных документов RethinkDB. Он похож на MongoDB, но дополнительно имеет встроенную реактивность и по-прежнему имеет открытый исходный код. Нам понадобятся две таблицы, одна для сохранения всех пользователей и одна для сохранения их подписок. Мы займемся управлением подключениями к базе данных и выполнением миграций позже.

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

При обработке команд мы в основном ищем одну из трех команд в сообщении. Мы также используем регулярное выражение, чтобы иметь возможность извлечь пользователя и канал из команд (un)subscribe.

Подписаться на пользователя

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

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

Отписаться от пользователя

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

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

Список подписок

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

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

Займитесь настоящим преследованием

Когда мы подписываемся на пользователя в канале, бот присоединяется к указанному каналу. Он обрабатывает каждое сообщение и реагирует соответствующим образом, если автор сообщения представляет интерес. Если для указанного автора есть слушатель, бот отправляет прямое сообщение слушателю.

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

Управление базами данных

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

Переосмысление соединения с БД

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

В Heroku надстройка RethinkDB Cloud установит переменные среды. Для локально работающего экземпляра RethinkDB должны работать значения по умолчанию.

Миграция

Приложение не работает без таблиц users и subscriptions. Таким образом, нам нужна миграция базы данных, которая добавляет эти таблицы.

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

Создайте приложение Heroku

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

Чтобы развернуть приложение на Heroku, нам нужно создать приложение Heroku:

$ git init
$ heroku create
Creating app... done, ⬢ fast-inlet-79371
https://fast-inlet-79371.herokuapp.com/ | https://git.heroku.com/fast-inlet-79371.git

Создание приложения Heroku вернет вам URL-адрес со случайным именем. Обратите внимание на этот URL-адрес, поскольку позже он потребуется для URL-адреса обратного вызова Slack.

Нам также понадобится экземпляр RethinkDB для хранения и подписки на сообщения чата, отправляемые между пользователями. Вы можете сделать это через RethinkDB Cloud add-on следующим образом:

$ heroku addons:create rethinkdb

Дополнение RethinkDB Cloud в настоящее время находится в стадии альфа-тестирования. Запросите приглашение на адрес электронной почты вашей учетной записи Heroku.

Разверните приложение на Heroku

Чтобы развернуть нашего слабого бота на Heroku, нам нужно создать файл Procfile. Этот файл в основном сообщает Heroku, какие процессы запускать.

// Procfile
release: node migrate.js
web: node index.js

Процессы release и web распознаются Heroku как команда, запускаемая после выпуска, и основное веб-приложение соответственно.

Разверните приложение на Heroku с помощью

$ echo node_modules > .gitignore
$ git add .
$ git commit -m 'A stalker bot'
$ git push heroku master

Приложение пока не будет работать, потому что в нем отсутствуют две переменные среды, а именно SLACK_SIGNING_SECRET и SLACK_TOKEN. Мы получим их, когда создадим фактическое приложение Slack.

Создайте Slack-приложение

Чтобы создать приложение Slack, перейдите на api.slack.com/apps (если вы не вошли в систему, войдите в систему, а затем вернитесь к этому URL-адресу). Нажмите Создать приложение и введите имя и рабочую область, с которой будет связано приложение.

Разрешения

Сначала нам нужно объявить все разрешения, необходимые для нашего приложения. Это можно сделать на вкладке «OAuth и разрешения». Прокрутите вниз до карточки «Scopes» и добавьте следующие «Scopes Token Scopes»:

  • каналы:история
  • каналы: присоединяйтесь
  • чат: написать
  • я:история

Разрешение channels:history и im:history позволяет боту читать сообщения в каналах, к которым он принадлежит, а также прямые сообщения. Разрешение channels:join позволяет боту присоединяться к новым каналам. Наконец, разрешение chat:write позволяет боту писать прямые сообщения (например, вам).

Установить переменные среды

Нам нужно два ключа Slack в нашем боте. Секрет подписи для проверки сообщений, которые мы получаем от Slack, и токен для аутентификации наших действий в качестве бота. Секрет подписи можно найти в карточке «Учетные данные приложения» на вкладке «Основная информация». Токен OAuth отображается на вкладке «OAuth и разрешения». Добавьте оба ключа в свое приложение Heroku с помощью

$ heroku config:set SLACK_SIGNING_SECRET=...
$ heroku config:set SLACK_TOKEN=xoxb-...

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

Подписка на события

Наше приложение работает только в том случае, если мы можем реагировать на события, происходящие на рабочем месте Slack. Перейдите на вкладку «Подписки на события» и включите события. Для URL-адреса запроса введите URL-адрес приложения, полученный от Heroku, и добавьте маршрут events, например, https://fast-inlet-79371.herokuapp.com/events. Затем подпишитесь на следующие события бота:

  • сообщения.каналы
  • сообщение.im

Вы увидите, что для этих двух событий требуются разрешения channels:history и im:history, которые мы добавили на предыдущем шаге. Сохраните изменения, чтобы они вступили в силу.

Установить приложение

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

Проверьте это

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

Первоначально опубликовано на https://www.rethinkdb.cloud 16 ноября 2020 г.