Создание slash команд с помощью Flask и Python 3 в Ubuntu 16.04

Slack – это информационная платформа для команд. Slack имеет множество аддонов, которые позволяют командам расширять платформу и интегрировать ее с другими программами. Slash команды Slack – это быстрый и простой способ выполнить то или иное действие в поле ввода сообщения. Например, команда /who перечисляет всех пользователей в текущем канале. Полный список встроенных slash команд можно найти на этой странице.

Вы можете разработать собственные slash команды, необходимые в вашем рабочем пространстве. Устанавливая команду в рабочее пространство и вызывая ее, вы можете заставить Slack сделать запрос к написанной вами программе. Эта программа получает информацию от Slack и возвращает ответ. Вы можете узнать больше о slash командах Slack, прочитав документацию API.

В этом мануале вы узнаете, как создать slash команду Slack /slash с помощью приложения Flask и добавить эту команду в рабочую область Slack на сервере Ubuntu 16.04. После этого вы сможете ввести /slash в поле ввода сообщения. Это отправит информацию в приложение Flask, которое обработает запрос и вернет короткое сообщение в Slack.

Это приложение Flask будет обслуживаться с помощью сервера приложений uWSGI и обратного прокси-сервера Nginx.

Требования

1: Создание и установка приложения Slack

Прежде чем приступить к написанию кода, нужно создать приложение Slack, расширяющее функции платформы Slack, и установить его в рабочую область Slack. После этого можно будет определить команду и указать URL, который она должна будет запрашивать при вызове.

Чтобы создать приложение Slack, откройте эту страницу и кликните зеленую кнопку Create New App. На экране появится форма, заполните ее:

  • App Name: введите Slack slash command
  • Development Slack Workspace: выберите рабочую область вашей разработки.

Нажмите кнопку Create App.

В этом мануале вы научитесь создавать команду /slash, которая будет отправлять данные по HTTP POST на запрашиваемый URL (http://server_domain_or_IP/slash).

Кликните Slash Commands и Create New Command. Вы увидите форму, которую нужно заполнить так:

Command: /slash
Request URL: http://server_domain_or_IP/slash
Short Description: Slack slash command
Usage Hint: опционально укажите параметры команды.

Нажмите кнопку Save.

Теперь установите приложение в рабочую область, нажав Install App. Кликните Install App to Workspace, а затем Authorize.

Вы создали и установили приложение в рабочую область Slack. Но команда не будет работать без веб-приложения, которое сможет ее обработать. Прежде чем собрать приложение, нужно настроить среду Python.

2: Настройка среды Python

Согласно мануалу Обслуживание приложений Flask с помощью uWSGI и Nginx в Ubuntu 16.04, приложение Flask находится в ~/myproject/. Этот каталог состоит из следующих файлов и каталогов:

  • myproject.ini
  • myproject.py
  • wsgi.py
  • myprojectenv/

Сейчас нужно отредактировать приложение Flask в myproject.py, чтобы оно могло обрабатывать данные, отправленные Slack, и возвращать ответ в формате JSON.

Документация API по командам говорит, что slash команду нужно подтвердить с помощью токена валидации, предоставляемого Slack.

Этот токен нужно хранить в секрете, сохраните его в новом файле .env, который не включен в контроль версий. Используйте пакет python-dotenv, чтобы экспортировать пары «ключ-значение» в файл .env в качестве переменных среды и получить к ним доступ в myproject.py.

Для начала включите виртуальную среду Python:

source myprojectenv/bin/activate

Чтобы убедиться, что виртуальная среда активна, обратите внимание на командную строку – теперь она должна начинаться с (myprojectenv). Как говорилось ранее, конфиденциальные данные типа токенов нужно хранить вне контроля версий. Пакет python-dotenv позволяет экспортировать секретные данные в качестве переменных среды. Менеджер пакетов pip поможет вам установить python-dotenv.

pip install python-dotenv

В текстовом редакторе откройте файл .env.

nano .env

Получите токен по ссылке https://api.slack.com/apps. Кликните Slack slash command → Basic Information → Verification Token.

В появившемся окне App Credentials скопируйте Verification Token и поместите его в файл .env в переменную VERIFICATION_TOKEN:

VERIFICATION_TOKEN=your_verification_token

Сохраните и закройте файл.

При разработке приложений Flask сервер uWSGI должен перезапускаться автоматически, если в приложении появились обновления. Для этого откройте файл myproject.ini:

nano myproject.ini

Добавьте в конец файла следующую строку, чтобы сервер uWSGI мог перезапуститься после запуска команды touch или обновления приложения Flask в myproject.py.

...
touch-reload = myproject.py

Сохраните и закройте файл.

Теперь нужно создать приложение Flask, которое будет обрабатывать информацию, отправленную slash командой, и возвращать соответствующий результат в Slack.

3: Создание приложения Flask

При вызове команды /slash в Slack платформа отправит запрос серверу.

Команда отвечает url-адресу /slash, потому нужно отредактировать конечную точку существующего приложения Flask.

Откройте myproject.py:

nano myproject.py

Удалите содержимое файла.

Добавьте следующий код, который импортирует Flask и загружает дополнительные модули для обработки JSON и поддержки веб-запросов.

#!/usr/bin/env python
from flask import Flask, jsonify, request

Затем добавьте этот код, который загружает модуль dotenv. Он читает содержимое созданного вами файла .env, загружает его в переменные среды, а затем извлекает токен, сохраняя его в переменной verification_token:

...
import os
import dotenv
dotenv_path = os.path.join(os.path.dirname(__file__), '.env')
dotenv.load_dotenv(dotenv_path)
verification_token = os.environ['VERIFICATION_TOKEN']

Затем добавьте этот код, чтобы приложение Flask отвечало на slash команду Slack текстом «Slack slash command is successful!»:

...
app = Flask(__name__)
@app.route('/slash', methods=['POST'])
def slash():
if request.form['token'] == verification_token:
payload = {'text': 'Slack slash command is successful!'}
return jsonify(payload)
if __name__ == '__main__':
app.run()

Сохраните и закройте файл.

Перезапустите сервис systemd myproject, чтобы запустить последнюю версию кода:

sudo systemctl restart myproject

4: Настройка Nginx для обслуживания команды

Поскольку команда использует URL http://server_domain_or_IP/slash, нужно изменить значение location в настройках Nginx с / на /slash.

Откройте файл /etc/nginx/sites-available/myproject:

sudo nano /etc/nginx/sites-available/myproject

Измените значение location с / на /slash :

...
location /slash {
include uwsgi_params;
uwsgi_pass unix:/home/8host/myproject/myproject.sock;
}
}

Сохраните и закройте файл.

Проверьте синтаксис конфигурации Nginx:

sudo nginx -t

Если ошибок нет, можете перезапустить Nginx:

sudo systemctl restart nginx

Затем перейдите в рабочую область Slack и введите /slash в любом из каналов. Вы увидите:

Slack slash command is successful!
Only visible to you

Если же вы получили сообщение об ошибке, проверьте файл myproject.py и перезапустите команду.

Закончив работу, можете отключить виртуальную среду Python, чтобы остальные команды Python использовали общесистемный интерпретатор.

deactivate

Вы создали приложение Flask, которое получает информацию slash команды /slash и возвращает ответ платформе Slack.

Чтобы обеспечить безопасную связь между вашим сервером и Slack, зашифруйте соединение с помощью HTTPS для URL-адреса команды. Вы можете сделать это, установив на Nginx бесплатный SSL-сертификат от Let’s Encrypt. После этого обязательно измените URL-адрес своего приложения Slack с http:// на https://.

Заключение

В этом мануале вы создали slash-команду Slack с помощью приложения Flask и серверов uWSGI и Nginx.

Теперь, когда вы знаете основы создания slash команд, вы можете самостоятельно создать любую slash команду. Вы можете создавать команды, которые извлекают данные из БД, взаимодействуют с другими API-интерфейсами или даже создают команды для развертывания кода.

Tags: , , , , ,