24.07.2023

Как создать Slackbot с помощью Python на Ubuntu 20.04.

Создание Slackbot с помощью Python на Ubuntu 20.04:

Вступление:

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!