Автор выбрал Tech Education Fund для получения пожертвования в рамках программы Write for DOnations.
Slack — это коммуникационная платформа, предназначенная для продуктивной связи на рабочем месте. Она поддерживает прямую отправку сообщений, публичные и частные каналы, телефонию, видеосвязь и интеграцию ботов. Бот Slackbot — это автоматизированная программа, которая может выполнять в Slack разнообразные функции, от отправки сообщений до активации задач и отправки оповещений об определенных событиях.
В этом обучающем модуле мы создадим бот Slackbot на языке программирования Python. Python — это популярный язык программирования, отличающийся простотой и удобством чтения синтаксиса. В Slack имеется функциональный Python Slack API для интеграции со Slack с целью выполнения распространенных задач, в том числе отправки сообщений, добавления эмодзи в сообщения и т. д. Также в Slack имеется Python Slack Events API для интеграции с событиями в Slack, позволяющий выполнять действия при определенных событиях, например отправлять сообщения и делать упоминания.
В качестве интересного концептуального испытания, которое покажет возможности Python и его Slack API, мы создадим CoinBot
— бот Slackbot, отслеживающий канал и бросающий монетку при активации. После этого вы сможете модифицировать свой бот CoinBot
для выполнения любого количества _немного _более практичных задач.
Обратите внимание, что в этом обучающем модуле используется Python 3, и что он не совместим с Python 2.
Для выполнения этого обучающего руководства вам потребуется следующее:
Рабочее пространство Slack Workspace, куда вы можете устанавливать приложения. Если вы создали рабочее пространство, такая возможность у вас есть. Если вы еще не сделали этого, вы можете создать рабочее пространство на сайте Slack.
(Необязательно) Сервер или компьютер с публичным IP-адресом для разработки. Мы рекомендуем использовать сервер со свежеустановленной ОС Ubuntu 20.04, пользователем без прав root с привилегиями sudo
и поддержкой SSH. Вы можете воспользоваться этим руководством для инициализации сервера и выполнения этих шагов.
Вы можете проверить этот обучающий модуль на сервере с публичным IP-адресом. Slack потребуется возможность отправлять вашему боту события, в том числе сообщения. Если вы выполняете тестирование на локальном компьютере, вам потребуется порт для пересылки трафика через брандмауэр на локальный компьютер. Если вы ищете способ разработки на облачном сервере, ознакомьтесь с обучающим модулем «Использование Visual Studio Code для удаленной разработки через плагин Remote-SSH».
Для начала создайте приложение Slack в панели управления Slack API. Войдите в рабочее пространство Slack через браузер и перейдите в панель управления API. Нажмите кнопку Create an App (Создать приложение).
Далее вам будет предложено указать название приложения и выбрать рабочее пространство Slack для разработки. Для целей этого обучающего модуля назовите свое приложение CoinBot
и выберите рабочее пространство, к которому у вас есть доступ с правами администратора. После этого нажмите кнопку Create App (Создать приложение).
После создания вашего приложения вам будет представлена следующая информационная панель приложения по умолчанию. На этой информационной панели вы будете управлять приложением, устанавливая разрешения, подписываясь на события, устанавливая приложение в рабочие пространства и т. д.
Чтобы ваше приложение могло отправлять сообщения на канал, вы должны предоставить ему разрешения на отправку сообщений. Для этого нажмите кнопку Permissions (Разрешения) на панели управления.
Прокрутите вниз страницу OAuth & Permissions (OAuth и разрешения), пока не найдете раздел Scopes (Области действия). Найдите подраздел Bot Token Scopes (Области действия токена бота) в области действия и нажмите кнопку Add an OAuth Scope (Добавить область действия OAuth).
Нажмите кнопку и введите chat:write
. Выберите это разрешение, чтобы добавить его для вашего бота. Это позволит приложению отправлять сообщения на каналы, к которым у него есть доступ. Дополнительную информацию о доступных разрешениях можно найти в документации Slack.
Мы добавили необходимое разрешение и теперь можем установить приложение в рабочее пространство Slack. Прокрутите страницу OAuth & Permissions (OAuth и разрешения) вверх и нажмите кнопку Install App to Workspace (Установить приложение в рабочее пространство) сверху.
Нажмите эту кнопку и посмотрите, какие действия приложение может выполнять на канале. После этого нажмите кнопку Allow (Разрешить) для завершения установки.
После установки бота вы получите для вашего приложения токен доступа Bot User OAuth Access Token, который оно сможет использовать для выполнения действий в рабочем пространстве. Скопируйте этот токен, поскольку позднее он вам потребуется.
В заключение добавьте новый бот в канал внутри вашего рабочего пространства. Если вы еще не создали канала, используйте канал #general, который создается по умолчанию в вашем рабочем пространстве Slack. Найдите приложение в разделе Apps (Приложения) на панели навигации клиента Slack и нажмите на него. Затем откройте меню Details (Сведения) в правом верхнем углу. Если ваш клиент Slack открыт не в полноэкранном режиме, значок этого меню будет выглядеть как буква i
внутри окружности.
Чтобы завершить добавление приложения на канал, нажмите кнопку More (Дополнительно) со значком трех точек на странице сведений и выберите Add this app to a channel… (Добавить это приложение в канал…). Введите название канала в открытое модальное окно и нажмите Add (Добавить).
Вы успешно создали приложение и добавили его в канал в своем рабочем пространстве Slack. Когда вы напишете код своего приложения, оно сможет отправлять сообщения в этот канал. В следующем разделе мы начнем писать код Python, на основе которого будет работать CoinBot
.
Вначале настроим среду разработки Python, чтобы вы могли заняться разработкой Slackbot.
Откройте терминал и установите в свою систему python3
и необходимые инструменты:
Далее нужно создать виртуальную среду, чтобы изолировать ваши пакеты Python от системной установки Python. Для этого создайте каталог, где вы создадите свою виртуальную среду. Создайте новый каталог ~/.venvs
:
Затем создайте виртуальную среду Python:
Затем активируйте виртуальную среду, чтобы использовать установленную версию Python и установочные пакеты:
В заголовке командной строки теперь будет отображаться название виртуальной среды (в скобках). Оно будет выглядеть примерно так:
Используйте pip
для установки необходимых пакетов Python в вашу виртуальную среду:
slackclient
и slackeventsapi
упрощают взаимодействие Python с API Slack. Flask
— популярная веб-микроструктура, которую мы используем для развертывания приложения:
Мы настроили среду разработки и теперь можем приступить к написанию бота Python Slackbot:
Сообщения в Slack отправляются через полезную нагрузку JSON в определенном формате. Вот пример кода JSON, составляемого Slackbot и отправляемого как сообщение:
Вы можете вручную создать этот код JSON и отправить его, но вместо этого мы создадим класс Python, который не только создает эту полезную нагрузку, но также моделирует бросок монеты.
Для начала используйте команду touch
, чтобы создать файл с именем coinbot.py
:
Затем откройте этот файл с помощью nano
или своего любимого редактора:
Добавьте следующие строки кода, чтобы импортировать необходимые библиотеки для вашего приложения. Для этого класса вам потребуется только библиотека random
из числа стандартных библиотек Python. Эта библиотека позволяет моделировать бросок монеты.
Добавьте в файл coinbot.py
следующие строки, чтобы импортировать все необходимые библиотеки:
Затем создайте класс CoinBot
и экземпляр этого класса для создания полезной нагрузки сообщения. Добавьте в файл coinbot.py
следующие строки, чтобы создать класс CoinBot
:
Затем сделайте один отступ и создайте константы, конструкторы и методы, необходимые для вашего класса. Для начала создадим константу, где будет храниться база полезной нагрузки сообщения. В этом разделе указывается, что эта константа относится к типу раздела, и что текст отформатирован через разметку. Также в нем указывается, какой текст вы хотите вывести. Вы можете найти дополнительную информацию о разных вариантах полезной нагрузки в официальной документации по полезной нагрузке сообщений Slack.
Добавьте в файл coinbot.py
следующие строки, чтобы создать базовый шаблон полезной нагрузки:
Затем создайте конструктор вашего класса, чтобы иметь возможность создавать отдельный экземпляр вашего бота для каждого запроса. Не беспокойтесь об издержках памяти, сборщик мусора Python будет очищать эти экземпляры, когда они больше не будут нужны. Этот код устанавливает канал получателя на базе параметра, передаваемого конструктору.
Добавьте в файл coinbot.py
следующие строки для создания конструктора:
Теперь напишите код, моделирующий бросок монеты. Мы будем случайным образом генерировать единицу или ноль, представляющие орел и решку соответственно.
Добавьте в файл coinbot.py
следующие строки, чтобы моделировать бросок монеты и возвращать подготовленную полезную нагрузку:
В заключение создайте метод, который строит и возвращает всю полезную нагрузку сообщения, включая данные вашего конструктора, вызывая метод _flip_coin
.
Добавьте в файл coinbot.py
следующие строки, чтобы создать метод, который будет генерировать готовую полезную нагрузку:
Мы завершили создание класса CoinBot
, и теперь он готов к тестированию. Прежде чем продолжить, убедитесь, что готовый файл coinbot.py
содержит следующие строки:
Сохраните и закройте файл.
У нас есть класс Python, готовый выполнять работу для бота Slackbot, и теперь мы сделаем так, чтобы этот класс создавал полезную нагрузку сообщений, и чтобы у вас была возможность отправлять ее в ваше рабочее пространство.
Протестируем этот класс и убедимся, что он создает надлежащую полезную нагрузку. Создайте файл с именем coinbot_test.py
:
Добавьте в него следующий код. Обязательно измените имя канала в экземпляре класса coinbot coin_bot = coinbot("#YOUR_CHANNEL_HERE ")
. Этот код создаст в Python клиент Slack, который будет отправлять сообщение на указанный вами канал, куда вы уже установили приложение:
Сохраните и закройте файл.
Прежде чем вы сможете запустить этот файл, вам нужно будет экспортировать токен Slack, сохраненный на шаге 1, как переменную среды:
Протестируйте этот файл и запустите в терминале следующий скрипт, чтобы проверить создание и отправку полезной нагрузки. Убедитесь, что ваша виртуальная среда активирована. Чтобы проверить это, посмотрите, отображается ли текст (slackbot)
в заголовке командной строки bash. Запустите эту команду, чтобы получить от бота Slackbot сообщение с результатами броска монеты:
Проверьте канал, на который вы установили приложение, и убедитесь, что ваш бот действительно отправил сообщение о броске монеты. Результатом будет орел или решка.
Мы убедились, что наш бот Slackbot может бросить монету, создать сообщение и доставить его. Теперь мы создадим Flask для постоянного выполнения этого приложения и сделаем так, чтобы он моделировал бросок монеты и публиковал результаты, когда увидит в сообщениях на канале определенный текст.
У нас есть работающее приложение, которое может отправлять сообщения в рабочее пространство Slack, и теперь необходимо создать долгосрочный процесс, чтобы бот мог прослушивать отправляемые в канал сообщения и отвечать на них, если их текст соответствует определенным критериям. Мы используем веб-инфраструктуру Python Flask для запуска этого процесса и прослушивания событий на канале.
В этом разделе мы запустим приложение Flask с сервера с публичным IP-адресом, чтобы API Slack мог отправлять нам события. В случае локального запуска на персональной рабочей станции необходимо подключить переадресацию порта персонального брандмауэра на порт, который будет использоваться на рабочей станции. Это может быть один и тот же порт, в этом обучающем модуле мы используем порт 3000
.
Настроите брандмауэр, чтобы разрешить трафик через порт 3000
:
Проверьте статус ufw
:
Результат должен будет выглядеть следующим образом:
OutputStatus: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
3000 ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
3000 (v6) ALLOW Anywhere (v6)
Создайте файл для вашего приложения Flask и присвойте ему имя app.py
:
Откройте этот файл в предпочитаемом текстовом редакторе:
Добавьте следующие statements
импорта. Мы импортируем следующие библиотеки по следующим причинам:
import os
— доступ к переменным средыimport logging
— регистрация событий приложенияfrom flask import Flask
— создание приложения Flaskfrom slack import WebClient
— отправка сообщений через Slackfrom slackeventsapi import SlackEventAdapter
— получение событий Slack и их обработкаfrom coinbot import CoinBot
— создание экземпляра CoinBot и генерирование полезной нагрузки сообщения.Добавьте в файл app.py
следующие строки, чтобы импортировать все необходимые библиотеки:
Теперь создайте приложение Flask и зарегистрируйте в вашем приложении Slack адаптер Slack Event Adapter с конечной точкой /slack/events
. В вашем приложении Slack будет создан маршрут для отправки и обработки событий Slack. Для этого вам нужно будет получить от приложения Slack еще один токен, что мы сделаем на следующих шагах этого обучающего модуля. После получения этой переменной мы экспортируем ее как переменную среды с именем SLACK_EVENTS_TOKEN
. Теперь напишите код, чтобы прочитать его при создании адаптера SlackEventAdapter
, хотя вы еще не задали токен.
Добавьте в файл app.py
следующие строки, чтобы создать приложение Flask и зарегистрировать адаптер событий в этом приложении:
Затем создайте объект веб-клиента, который позволит вашему приложению выполнять в рабочем пространстве различные действия, в том числе отправлять сообщения. Это похоже на то, что мы делали ранее при тестировании файла coinbot.py
.
Добавьте в файл app.py
следующую строку для создания slack_web_client
:
Теперь создайте вызываемую функцию, которая будет создавать экземпляр CoinBot
, а затем использовать этот экземпляр для создания полезной нагрузки сообщения и ее передачи в веб-клиент Slack для доставки. Эта функция будет принимать единственный параметр, channel
, который будет определять канал, куда будет доставляться сообщение.
Добавьте в файл app.py
следующие строки для создания этой функции:
Мы создали функцию приложения для работы с сообщениями, а теперь создадим функцию, которая будет отслеживать события Slack на предмет определенных действий, а затем запускать бота. Мы настроим приложение так, чтобы оно отправляло результаты броска монеты в ответ на фразу «Hey Sammy, Flip a coin». Приложение будет отвечать на эту фразу в любом виде независимо от регистра.
Вначале добавьте в функцию синтаксис @slack_events_adapter.on
, позволяющий функции получать события. Укажите, что хотите получать только события message
, и разрешите функции принимать параметр полезной нагрузки, содержащий всю необходимую информацию Slack. После получения полезной нагрузки функция будет выполнять синтаксический анализ извлеченного текста, а при обнаружении активирующей фразы приложение будет отправлять результаты броска монеты.
Добавьте в файл app.py
следующий код, чтобы получать и анализировать входящие сообщения и реагировать на них:
В заключение создайте раздел main
, создающий регистратор для просмотра внутренних данных приложения и запускающий приложение с внешнего IP-адреса через порт 3000
. Чтобы обрабатывать события Slack (например, при отправке нового сообщения), необходимо протестировать приложение на общедоступном IP-адресе.
Добавьте в файл app.py
следующие строки для настройки раздела main:
Мы завершили создание приложения Flask, и теперь оно готово к тестированию. Прежде чем двигаться дальше, убедитесь, что готовый файл app.py
содержит следующие строки:
Сохраните и закройте файл.
Приложение Flask теперь готово обслуживать ваше приложение, и сейчас мы протестируем это.
В заключение мы соединим все элементы и запустим наше приложение.
Прежде всего, добавьте работающее приложение как авторизованный обработчик Slackbot.
Перейдите в раздел Basic Information (Базовая информация) вашего приложения в пользовательском интерфейсе Slack. Прокручивайте экран вниз, пока не найдете раздел App Credentials (Полномочия приложения).
Скопируйте секретную подпись (Signing Secret) и экспортируйте ее в переменную среды SLACK_EVENTS_TOKEN
:
Теперь у вас имеются все необходимые токены API для запуска вашего приложения. Обратитесь к шагу 1, если вам потребуется напоминание о том, как экспортировать SLACK_TOKEN
. Теперь вы можете запустить свое приложение и убедиться, что оно действительно работает. Убедитесь, что виртуальная среда активирована, и выполните следующую команду для запуска приложения Flask:
Результат должен будет выглядеть следующим образом:
(slackbot) [20:04:03] sammy:coinbot$ python app.py
* Serving Flask app "app" (lazy loading)
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: off
* Running on http://0.0.0.0:3000/ (Press CTRL+C to quit)
Чтобы убедиться, что ваше приложение работает, откройте новое окно терминала и запустите команду curl
с IP-адресом вашего сервера, указав правильный порт /slack/events
:
В результате выполнения curl
будет получено следующее:
OutputThese are not the slackbots you're looking for.
Получение сообщения These are not the slackbots you're looking for.
означает, что ваше приложение запущено и работает.
Оставьте это приложение Flask работать, пока вы не завершите настройку приложения в пользовательском интерфейсе Slack.
Предоставьте своему приложению необходимые разрешения для мониторинга сообщений и реагирования на них. Откройте раздел Event Subscriptions (Подписка на события) в боковой панели пользовательского интерфейса и нажмите кнопку Enable Events (Активировать события).
После этого введите свой IP-адрес, порт и конечную точку /slack/events
в поле Request URL (URL-адрес запроса). Не забудьте указать префикс протокола HTTP
. Slack попытается выполнить подключение к указанной конечной точке. После успешного подключения вы увидите зеленую отметку со словом Verified (Проверено).
Затем откройте раздел Subscribe to bot events (Подписка на события ботов) и добавьте для вашего приложения разрешение message.channels
. Это позволит вашему приложению получать сообщения от канала и обрабатывать их.
После этого вы увидите событие в списке в разделе Subscribe to bot events (Подписка на события ботов). Затем нажмите зеленую кнопку Save Changes (Сохранить изменения) в правом нижнем углу.
После этого вы увидите на экране желтый баннер, показывающий, что вам нужно переустановить приложение для следующих изменений. При каждом изменении разрешений вам потребуется переустановить приложение. Нажмите ссылку reinstall your app (переустановить приложение) на этом баннере, чтобы переустановить ваше приложение.
Вы увидите экран подтверждения со сводной информацией о разрешениях вашего бота и запросом на его установку. Нажмите зеленую кнопку Allow (Разрешить), чтобы завершить процесс установки.
Теперь ваше приложение должно быть готово к работе. Вернитесь на канал, где вы установили CoinBot
, и отправьте сообщение с фразой «Hey Sammy, Flip a coin». Ваш бот смоделирует бросок монеты и ответит с результатами. Поздравляем! Вы создали бота Slackbot!
После завершения разработки приложения вам нужно будет развернуть его на сервере для переноса в производственную среду. Это необходимо, потому что сервер разработки Flask не является защищенной производственной средой. Будет лучше, если вы развернете приложение с помощью WSGI и, возможно, закрепите за ним доменное имя и создадите запись DNS для вашего сервера. Существует много вариантов развертывания приложения Flask, некоторые из которых перечислены ниже:
Помимо этих, существует и много других способов развертывания приложения. Как обычно, при выборе вариантов развертывания и инфраструктуры выбирайте то, что лучше всего подходит именно вам.
В любом случае теперь у вас есть бот Slackbot, который вы можете использовать для броска монеты для принятия решений, например, при выборе меню на обед.
Также вы можете взять этот код как основу и изменить его для собственных нужд, будь то автоматизированная поддержка, управление ресурсами, фотографии котиков или что-нибудь еще. Полную документацию по Python Slack API можно посмотреть здесь.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!