Инструкция: делаем простой бот для Slack в облаке

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

Для создания бота нам понадобятся аккаунты в Yandex.Cloud и Slack.

Шаг 1: создаём приложение в Slack

Авторизуемся в Slack и переходим в панель. Нажимаем кнопку Create an app, выбираем From scratch. Вводим название нашего приложения - ServerlessBotApp и выбираем workspace, для пользователей которого будет работать наш бот.

Теперь нам нужно дать нашему боту разрешение писать в чат. Переходим в раздел OAuth & Permissions и в подразделе Bot Token Scopes нажимаем кнопку Add an OAuth Scope.

После того, как мы дали разрешение, переходим в раздел OAuth Tokens for Your Workspace и нажимаем кнопку Install to Workspace, а затем Allow.

Бот установлен для нашего workspace и Slack создал для него Bot User OAuth Token, который понадобится нам позже.

Шаг 2: создаём сервисный аккаунт в Yandex.Cloud

На стороне Slack мы создали приложение, которое может писать в чат и к которому можно подключиться извне с помощью токена. Теперь нужно создать точку доступа на стороне облака. Сначала создадим сервисный аккаунт. Для этого переходим в консоль Yandex.Cloud. Переходим в рабочий каталог и выбираем пункт меню Сервисные аккаунты. Создаём новый сервисный аккаунт slack-bot и назначаем ему роль editor.

После создания сервисного аккаунта в разделе Обзор получаем Идентификатор, в дальнейшем он будет использоваться в настройках API-шлюз.

Шаг 3: создаем API-шлюз для связи облака и Slack

В консоли облака переходим в дашборд каталога и выбираем API Gateway. Нажимаем кнопку Создать API-шлюз и создаём шлюз с названием for-slack-bot.

После публикации API-шлюза в спецификации появится секция servers со служебным доменом. Этот домен будет точкой входа в приложение. Спецификация содержит правила вызова функций, каждый раз при создании функции мы будем добавлять в спецификацию новую секцию.

Шаг 4: Реализуем функцию, реагирующую на команду

Теперь мы можем реализовать функциональность, которая будет доступна из чата Slack. Для этого сначала перейдем в панель Slack и получим token и secret. В разделе OAuth& Permissions копируем Bot User OAuthToken, в дальнейшем мы используем это значение для переменной SLACK_BOT_TOKEN в облаке. В разделе Basic Information в подразделе App Credentials копируем Signing Secret и в дальнейшем используем его в качестве значения переменной SLACK_SIGNING_SECRET.

После этого переходим в консоль облака. В дашборде текущего каталога выбираем сервис Cloud Functions. Нажимаем кнопку Создать функцию. Задаем имя for-slack-bot-hello-from-serverless. Выбираем среду выполнения, например python3.7. При создании функции получаем по умолчанию файл index.py. Создадим новый файл requirements.txt, где перечисляем необходимые библиотеки.

Меняем содержимое созданного автоматически файла index.py на содержимое файла из репозитория. Указываем точку входа index.handler. Увеличиваем тайм-аут до 5 секунд. Указываем идентификатор сервисного аккаунта и переменные SLACK_BOT_TOKEN, SLACK_SIGNING_SECRET. Нажимаем кнопку Создать версию.

Наша функция готова, теперь нужно опубликовать её через API-шлюз. Для этого копируем идентификатор созданной функции и переходим в дашборд, а из него в раздел API Gateway. Редактируем созданный ранее шлюз for-slack-bot.

Копируем в спецификацию секцию /hello-from-serverless из файла for-slack-bot.yml. Заменяем IDYOURFUNCTIONHELLO на идентификатор созданной функции, а IDYOURACCOUNT — на идентификатор сервисного аккаунта. Не изменяя секцию servers, копируем из нее url шлюза. Сохраняем изменения, наша функция опубликована.

Шаг 4: создаём команду в Slack

Со стороны Slack функция должна вызываться командой из чата. Создадим эту команду. В панели Slack выбираем созданное приложение ServerlessBotApp. В секции Slash Commands нажимаем кнопку Create New Command. В поле Command вводим /hello-from-serverless. В поле Request URL вставляем скопированный ранее url API Gateway, дополнив его /hello-from-serverless. Заполняем Short Description. Нажимаем Save. Следуя появившейся инструкции переустанавливаем Slack-приложение. В workspace появилась возможность вызывать команду /hello-from-serverless.

Проверив работу команды получим сообщение от бота.

Шаг 5: создаём функцию для реагирования на сообщения пользователей

Сейчас наш бот умеет отвечать на команды, но он всё еще не умеет реагировать на сообщения в чате. Создадим для этого функцию. Переходим в консоль облака и создаем функцию for-slack-bot-small-talk с той же средой выполнения python3.7. Создаем файл requirements.txt, аналогичный предыдущему. Меняем содержимое файла index.py, созданного по умолчанию, на код из репозитория.

Выбираем сервисный аккаунт slack-bot, указываем точку входа index.handler, увеличиваем timeout до 5 секунд, не забываем указать переменные окружения SLACK_BOT_TOKEN и SLACK_SIGNING_SECRET, со значениями как и в функции for-slack-bot-hello-from-serverless. Нажимаем кнопку Создать версию. Копируем идентификатор функции. Для реализации функциональности нам понадобится сделать эту функцию публичной, поэтому в разделе Обзор передвигаем ползунок в поле Публичная функция.

Теперь нужно опубликовать функцию через API-шлюз. Для этого снова возвращаемся в раздел API Gateway. Редактируем созданный ранее шлюз for-slack-bot. Заменяем секцию / на аналогичную, содержащуюся в файле for-slack-bot.yml, не забываем заменить IDYOURFUNCTIONSMALLTALK на скопированный ранее идентификатор функции, а IDYOURACCOUNT на идентификатор сервисного аккаунта.

Шаг 6: настраиваем подписку на сообщения в Slack

После создания функции и ее публикации нам нужно настроить подписку на сообщения на стороне Slack. Возвращаемся в панель Slack и переходим в секцию Event Subscriptions. Передвигаем передвигаем ползунок Enable Events в положение on. Указываем адрес API Gateway в поле Request URL и дожидаемся появления Verified.

В секции Subscribe to bot events на той же странице нажимаем кнопку Add Bot User Event и выбираем message.im. Сохраняем изменения. Переустанавливаем приложение следуя появившейся инструкции.

Наш бот умеет реагировать на сообщения пользователя ":wave:" и "knock knock», проверим его работу в чате.

Мы создали бота, который может обрабатывать сообщения из чата и реагировать на команды пользователя. Его функциональность можно расширять, например, используя Yandex Database для хранения полученных сторонних данных, или используя Object Storage для хранения необходимых файлов.

Оставляем полезные ссылки на каналы и сообщества Serverless в мире и в России, где вы сможете найти еще больше полезных примеров использования функций:

Подписывайтесь на блог Yandex.Cloud, чтобы узнавать еще больше новостей и историй об IT и бизнесе.

Другие истории, которые активно читают наши подписчики:

0
Комментарии
-3 комментариев
Раскрывать всегда