Создание Slackbot с помощью Python на Ubuntu 20.04:
- Вступление
- Подготовка к работе
- Создание Slackbot
- Настройка Python
- Создание класса для сообщений Slackbot в Python
- Тестовые сообщения от нашего Slackbot
- Создание приложения Flask для запуска Slackbot
- Запуск вашего Flask приложения
Вступление:
Slack - это корпоративный мессенджер. Он предназначен для повышения продуктивности на рабочем месте. С помощью Slack можно обмениваться сообщениями, создавать открытые или же частные чаты, созваниваться с помощью голосовых или видео звонков, а также проводить интеграции с Slackbot'ами. Slackbot - это тип приложения Slack, предназначенный для взаимодействия с пользователями посредством разговора. Она имеет множество функций и опций: отправка оповещений и сообщений, запуск каких-либо задач.
В данной инструкции мы развернем Slackbot используя язык Python и Ubuntu 20.04. Slack обладает множеством инструментов, помогающих взаимодействовать с Application Programming Interface (API) Python и его интеграциями.
В качестве проверки потенциала связки Python и Slack API, мы создадим CoinBot, он будет мониторить чат и при срабатывании подбрасывать монету. Затем же вы сможете модернизировать своего бота для более практичных целей.
Помарка: В данной инструкции мы будем работать с Python 3, если же у вас версии, выпущенные ранее, то бот работать не сможет.
Перед началом работы:
Чтобы все работало как нужно, в вашем распоряжении должны присутствовать следующие элементы:
1) Установленный Slack и Workplace (рабочее пространство), в котором вы будете работать. Если у вас его нет, то вы можете создать его на официальном сайте Slack.
2)Виртуальная машина или ПК с общедоступным IP- адресом.
Создание Slackbot
Сперва создадим наше Slack-приложение в панели управления Slack API (CPSAPI). Зайдите в меню своего рабочего места и перейдите в CPSAPI.
Затем, выберите меню "Create an App", как показано на скриншоте:
Затем вам предложат ввести название для вашего приложения. Мы будем использовать название "CoinBot", но вы можете задать и свое собственное. После этого выберите более удобный для вас Workspace, куда будет установлено приложение.
После этого, ваше приложение будет создано, и у вас появится возможность взаимодействовать с панелью управления.
На этой панели вы сможете настраивать свое приложением: загружать новые разрешения, подключать уведомления к каким-либо событиям, устанавливать ваше приложение в любой Workplace и многое другое.
Для того чтобы ваше приложение смогло отправлять сообщения в ваши чаты, нам необходимо выдать ему специальные права.
Чтобы у него появилось данное разрешение: выберите контекстное меню "Permissions", как показано на скриншоте:
Затем, у вас вылезет меню "OAuth & Permissions". Вам будет необходимо пролистать к разделу "Scope". В нем выберите "Bot Token Scopes". В нем же, кликните на меню "Add on OAuth Scope":
Затем введите в поисковое меню chat:write и добавьте данное разрешение:
Оно даст вашему приложению права писать в чатах, к которым у него есть доступ.
После того, как вы добавили данное право для нашего приложения, необходимо добавить его в ваш Workspace.
Пролистайте вверх страницу OAuth и выберите меню "Install to Workspace":
После этого, Slack предложит вам посмотреть доступные для этого приложения разрешения. Если вас все устраивает, нажимайте кнопку "Разрешить":
После того, как ваш бот будет установлен, Slack предоставит вам ваш токен , который будет использован приложением для доступа к вашему Workspace:
Также в этом меню, если у вас возникла какая-либо ошибка, переустановить вашего бота, нажав на контекстное меню "Reinstall to Workspace"
Последним шагом, нам нужно будет добавить бота в чат в вашем рабочем пространстве. Если у вас уже есть созданный канал, то перейдите к шагу "Добавление бота в ваш канал"
Если же у вас нет еще созданных чатов, то выполните эти пару шагов:
Найдите контекстное меню "Добавить канал", в нем выберите "Создать новый канал":
Затем назовите свой канал и по желанию можете добавить его описание:
Добавление бота в ваш канал
Чтобы добавить бота в ваш канал, вам нужно в необходимом чате навестись на его название и нажать на контекстное меню "Посмотреть сведения о канале":
Затем перейдите в меню "Интеграции" и выберите пункт "Добавить приложение":
Затем с помощью меню поиска или просто пролистав, выберите нужное приложение. В нашем случае "CoinBot":
После этого, бот будет добавлен в ваш канал:
Настройка Python
Для начала настроим Python, чтобы вы смогли установить и управлять вашими Slack ботами.
Сперва установим python 3 и соответствующие тулы на вашу виртуальную машину с развернутым на ней Ubuntu 20.04.
Изначально на сервера Ubuntu версии 20.04 уже предустановлен Python 3, но чтобы убедиться в доступности обновлений, обновим систему с помощью данных команд:
sudo apt update
sudo apt -y upgrade
После этого, узнаем установленную у нас версию Python:
python3 -V
Ответ будет выглядеть примерно таким:
Python 3.8.2
Теперь установим инструмент pip, чтобы получить доступ к управлению пакетами:
sudo apt install -y python3-pip
Затем развернем виртуальную среду:
python3 -m venv ~/.venvs/slackbot
После этого активируем ее:
source ~/.venvs/slackbot/bin/activate
Теперь наша терминал в скобочках будет отображать виртуальную среду:
(slackbot) root@Ubuntu-Bot-Python:~#
Теперь с помощью инструмента pip установим необходимые компоненты Python:
pip install slackclient slackeventsapi Flask
Пояснение: slackclient и slackeventsapi - инструменты, облегчающие работу с Slack API. Flask же - это микровеб-фреймворк, который мы будем использовать для развертывания нашего бота.
После того, как мы настроили Python, можно приступать к настройке бота.
Создание класса для сообщений Slackbot в Python
В Slack сообщения отправляются с помощью специально отформатированными JSON данными.
Вот пример такого сообщения, который Slackbot создаст и отправит:
{
"channel":"channel",
"blocks":[
{
"type":"section",
"text":{
type":"mrkdwn",
"text":"Ок! Подбрасываем монетку....\n\n"
}
},
{
"type":"section",
"text":{
"type":"mrkdwn",
"text":"*flips coin* Результат-Орел!."
}
}
]
}
Давайте создадим класс Python, который симулирует подбрасывание монеты.
Напоминание - все действия проделываем в виртуальной среде. В нашем случае виртуальная среда - root@Ubuntu-Bot-Python:~#
Сначала с помощью команды touch, создадим файл с именем coinbot.py:
touch coinbot.py
Затем откроем данный файл с помощью редактора nano, вы можете использовать любой другой редактор:
nano coinbot.py
Добавьте следующее содержимое в наш файл:
# import the random library to help us generate the random numbers
import random
# Create the CoinBot Class
class CoinBot:
# Create a constant that contains the default text for the message
COIN_BLOCK = {
"type": "section",
"text": {
"type": "mrkdwn",
"text": (
"Ок! Подбрасываем монетку....\n\n"
),
},
}
# The constructor for the class. It takes the channel name as the a
# parameter and then sets it as an instance variable
def __init__(self, channel):
self.channel = channel
# Generate a random number to simulate flipping a coin. Then return the
# crafted slack payload with the coin flip message.
def _flip_coin(self):
rand_int = random.randint(0,1)
if rand_int == 0:
results = "Орел"
else:
results = "Решка"
text = f"The result is {results}"
return {"type": "section", "text": {"type": "mrkdwn", "text": text}},
# Craft and return the entire message payload as a dictionary.
def get_message_payload(self):
return {
"channel": self.channel,
"blocks": [
self.COIN_BLOCK,
*self._flip_coin(),
],
}
Затем сохраним и закроем наш файл с помощью комбинации клавиш.
Теперь наш бот может отправлять сообщения, а вы сможете добавить его в свое рабочее пространство.
Тестовые сообщения от нашего Slackbot
Теперь проверим, что наш класс создает правильную нагрузку.
Создайте файл с именем coinbot_test.py:
nano coinbot_test.py
Затем добавьте в созданный файл следующее содержимое
Важно: Обязательно измените название сервера на свое в coin_bot = coinbot("#YOUR_CHANNEL_HERE").
from slack import WebClient
from coinbot import CoinBot
import os
# Create a slack client
slack_web_client = WebClient(token=os.environ.get("SLACK_TOKEN"))
# Get a new CoinBot
coin_bot = CoinBot("#YOUR_CHANNEL_HERE")
# Get the onboarding message payload
message = coin_bot.get_message_payload()
# Post the onboarding message in Slack
slack_web_client.chat_postMessage(**message)
Сохраните и закройте данный файл.
Прежде чем запустить тест, вам необходимо экспортировать ваш токен, который указан на Slak API:
Теперь экспортируйте ваш токен:
export SLACK_TOKEN="Ваш токен"
Теперь мы можем протестировать нашего бота. Запустите следующий скрипт в вашем терминале:
python coinbot_test.py
После этого к вам в канал, на который вы установили свое приложение придет сообщение о подбрасывании монетки. Убедитесь, что ваш бот действительно выдал вам либо орла, либо решку.
Создание приложения Flask для запуска Slackbot
Теперь, когда ваш бот может подбрасывать монетку, создавать и отправлять сообщения, мы развернем Flask, который будет обрабатывать сообщения и выдавать какую-то реакцию на них, если их содержимое соответствует некоторым критериям.
Для начала настроим параметры браундмаузера, чтобы разрешить трафик через порт 3000:
sudo ufw allow 3000
Теперь удостоверимся о статусе ufw:
sudo ufw status
Вы должны будете увидеть примерно такой вывод:
Output
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
3000 ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
3000 (v6) ALLOW Anywhere (v6)
Затем мы создадим файл для нашего Flask-приложения.
Назовем данный файл app.py:
touch app.py
Затем, откроем этот файл с помощью любого из редакторов. Мы будем использовать nano:
nano app.py
Добавим в наш файл app.py следующее содержимое:
import os
import logging
from flask import Flask
from slack import WebClient
from slackeventsapi import SlackEventAdapter
from coinbot import CoinBot
# Initialize a Flask app to host the events adapter
app = Flask(__name__)
# Create an events adapter and register it to an endpoint in the slack app for event injestion.
slack_events_adapter = SlackEventAdapter(os.environ.get("SLACK_EVENTS_TOKEN"), "/slack/events", app)
# Initialize a Web API client
slack_web_client = WebClient(token=os.environ.get("SLACK_TOKEN"))
def flip_coin(channel):
"""Craft the CoinBot, flip the coin and send the message to the channel
"""
# Create a new CoinBot
coin_bot = CoinBot(channel)
# Get the onboarding message payload
message = coin_bot.get_message_payload()
# Post the onboarding message in Slack
slack_web_client.chat_postMessage(**message)
# When a 'message' event is detected by the events adapter, forward that payload
# to this function.
@slack_events_adapter.on("message")
def message(payload):
"""Parse the message event, and if the activation string is in the text,
simulate a coin flip and send the result.
"""
# Get the event data from the payload
event = payload.get("event", {})
# Get the text from the event that came through
text = event.get("text")
# Check and see if the activation phrase was in the text of the message.
# If so, execute the code to flip a coin.
if "hey sammy, flip a coin" in text.lower():
# Since the activation phrase was met, get the channel ID that the event
# was executed on
channel_id = event.get("channel")
# Execute the flip_coin function and send the results of
# flipping a coin to the channel
return flip_coin(channel_id)
if __name__ == "__main__":
# Create the logging object
logger = logging.getLogger()
# Set the log level to DEBUG. This will increase verbosity of logging messages
logger.setLevel(logging.DEBUG)
# Add the StreamHandler as a logging handler
logger.addHandler(logging.StreamHandler())
# Run our app on our externally facing IP address on port 3000 instead of
# running it on localhost, which is traditional for development.
app.run(host='0.0.0.0', port=3000)
Сохраните и закройте файл.
Пояснение: мы добавляем следующие операторы так как:
import os — мы будем использовать для доступа к переменным среды
import logging — мы будем использовать для регистрации событий приложения.
from flask import Flask — мы будем использовать для создания приложения Flask
from slack import WebClient — мы будем использовать для отправки сообщений через Slack
from slackeventsapi import SlackEventAdapter — мы будем использовать для получения событий из Slack и их обработки
from coinbot import CoinBot — мы будем использовать для создания экземпляра вашего CoinBot и генерации полезной нагрузки сообщения.
Запуск вашего Flask приложения
Теперь, когда наше приложение Flask готово работать с приложением, давайте его протестируем.
Сначала, добавим наше приложение для Slackbot.
На странице Slack API перейдите в раздел "Basik information" и опуститесь до подраздела "App Credentials":
Нажмите на "Show", как показано на скриншоте и затем скопируйте Signing secret.
Теперь экспортируем наш секрет подписи с помощью данной команды:
export SLACK_EVENTS_TOKEN="MY_SIGNING_SECRET_TOKEN"
Теперь мы можем протестировать наше приложение.
Запустим приложение Flask, чтобы сделать это выполните данную команду:
python3 app.py
Вывод должен быть примерно таким:
(slackbot) [19:37:05] danial: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)
Теперь закончим настройку нашего приложения в пользовательском интерфейсе Slack.
Для начала дадим нашему приложению право читать, обрабатывать сообщения и отвечать на них.
В меню пользовательского интерфейса выберем раздел "Event Subscriptions" и переключите тумблер "Enable Events" в положение "On", как показано на скриншоте:
Затем разверните меню "Subscribe to bot events" и выберите в нем message.channels:
После этого ваше приложение сможет обрабатывать сообщения.
Как только вы сохраните изменения, у вас появится контекстное меню желтого цвета в верхней части экрана, информирующий вас о том, что вам необходимо переустановить приложение, чтобы применить следующие изменения.
Нажмите на ссылку переустановить приложение в этом баннере, чтобы переустановить приложение:
Затем у вас откроется контекстное меню с новыми примененными разрешениями. Если вы согласны со всем, нажмите "Разрешить":
После этого ваше приложение будет готово к работе. Вернитесь в ваш канал, на который вы установили бота, и отправьте сообщение, содержащее фразу «Hey, Danny, flip a coin».
Ваш бот подбросит монетку и отправит вам результат. Поздравляю, мы создали Slackbot!