IT-инфраструктура для бизнеса и творчества
Разработка
Yandex.Cloud

Инструкция: делаем простой бот для 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 и бизнесе.

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

{ "author_name": "Yandex.Cloud", "author_type": "editor", "tags": [], "comments": 0, "likes": 10, "favorites": 22, "is_advertisement": false, "subsite_label": "dev", "id": 273993, "is_wide": true, "is_ugc": false, "date": "Tue, 27 Jul 2021 11:11:33 +0300", "is_special": false }
(function () { let cdnUrl = `https://specialsf378ef5-a.akamaihd.net/SelectelBranding/images/` let previousArticleNumber = null let currentArticleNumber = 0 let platform = 'Desktop' let articles = [ // { // name: 'camera', // url: `${cdnUrl}CameraCat`, // text: 'умную камеру для\u00A0наблюдения за\u00A0котиками', // link: '1', // }, { name: 'chill', url: `${cdnUrl}ChillCat`, text: 'трекер, который подскажет, когда пора отдохнуть', link: 'https://vc.ru/promo/288561-eye-tracker', }, // { // name: 'cloud', // url: `${cdnUrl}CloudCat`, // text: 'котика: даёшь ему «пять», а\u00A0он делает бэкап в облако', // link: '3', // } ] let buttonCycle = document.querySelector('.button--cycle') let textField = document.querySelector('.selectel-footer-subtitle') let imageAgent = document.querySelector('.image--agent') let banner = document.querySelector('.selectel-footer') buttonCycle.addEventListener('click', cycleClick) let media = window.matchMedia("(max-width: 570px)") media.addEventListener('change', matchMedia) function matchMedia() { if (media.matches) { platform = 'Mobile' } else { platform = 'Desktop' } update() } matchMedia() function cycleClick(event) { if (event) { event.preventDefault() event.stopPropagation() } window.open('https://vc.ru/tag/selectelDIY', '_blank') //cycle(event) } function cycle(event) { // incrementArticleNumber() textField.innerHTML = generatedText() imageAgent.src = articles[currentArticleNumber].url + platform + '.svg?5' imageAgent.setAttribute("class", "") imageAgent.classList.add('image--agent', articles[currentArticleNumber].name) banner.href = articles[currentArticleNumber].link } function update() { banner.href = articles[currentArticleNumber].link imageAgent.src = articles[currentArticleNumber].url + platform + '.svg?5' textField.innerHTML = generatedText() } function incrementArticleNumber() { previousArticleNumber = currentArticleNumber if (currentArticleNumber >= articles.length - 1) { currentArticleNumber = 0 } else { currentArticleNumber++ } } function generatedText() { let defaultText if (platform === 'Desktop') { defaultText = `Мы тут собрали %text%. Хотите почитать?` } else { defaultText = `Мы тут собрали %text%.` } return defaultText.replace('%text%', articles[currentArticleNumber].text) } function getRandom(min, max) { min = Math.ceil(min) max = Math.floor(max) return Math.floor(Math.random() * (max - min + 1)) + min } (function create() { currentArticleNumber = getRandom(0, articles.length - 1) cycle() let page = document.querySelector('.page--entry') if (page) { function insertAfter() { let parents = page.querySelectorAll('[data-id="7"]') let referenceNode = parents[0] referenceNode.parentNode.insertBefore(banner, referenceNode.nextSibling); loaded() } setTimeout(() => insertAfter(), 0) } }()) function loaded() { banner.classList.add('loaded') } loadImages([ `${cdnUrl}CameraCatDesktop.svg`, `${cdnUrl}ChillCatDesktop.svg`, `${cdnUrl}CloudCatDesktop.svg`, `${cdnUrl}CameraCatMobile.svg`, `${cdnUrl}ChillCatMobile.svg`, `${cdnUrl}CloudCatMobile.svg`, ]) function loadImages(urls) { return Promise.all(urls.map(function (url) { return new Promise(function (resolve) { var img = document.createElement('img'); img.onload = resolve; img.onerror = resolve; img.src = url; }); })); } }())
0
0 комментариев
Популярные
По порядку
Читать все 0 комментариев
Как использовать облачные технологии для роста бизнеса в 2022 году: расскажем на Yandex Scale

А ещё представим новые продукты.

Обманутые дольщики и долг в $300 млрд: проблемы китайского застройщика Evergrande сравнивают с началом кризиса 2008 года Статьи редакции

23 сентября компания должна выплатить проценты по облигациям или объявить по ним дефолт — эксперт называет это более важным событием, чем заседание ФРС.

Здания Evergrande в китайской провинции Цзянсу NYT
Вкратце: ноутбук с экраном на шарнире, смартфон Duo 2 с двумя экранами и другие анонсы Microsoft Fall 2021 Статьи редакции

22 сентября Microsoft провела презентацию, на которой представила новые планшеты, ноутбук, смартфон и аксессуары линейки Surface.

Задания от самого титулованного программиста в мире и 3,72 млн призовых: каким был VK Cup в этом году

Зачем в VK Cup ежегодно участвуют тысячи специалистов из разных стран и чем запомнится турнир в этом году? Отвечаем на главные вопросы.

Microsoft представила свой второй складной смартфон с двойным экраном — Surface Duo 2 Статьи редакции

Компания проделала работу над ошибками и оснастила его тремя камерами, обновлённым процессором и новым шарниром.

Как облегчить планирование в редакции: опыт «Лайфхакера»
Пять брендов, которые выпускают одежду, аксессуары и декор из мусора

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

Еду к деду
Белорусский сервис PandaDoc для управления электронными документами стал «единорогом» — оценка превысила $1 млрд Статьи редакции

За год оценка компании выросла почти в четыре раза.

#20вопросов Сергею Костюку, советнику заместителя председателя правления Московского кредитного банка

В середине сентября МКБ и GenerationS, платформа по развитию корпоративных инноваций, запустили корпоративный акселератор "МКБ Реактор". Для МКБ это первый полноценный проект, включающий сразу несколько важных этапов, по итогам которого будут определены проекты для дальнейшего долгосрочного сотрудничества.
Финтех сегодня востребован как никогда –…

null