如何在Ubuntu16.04上使用Flask和Python3编写斜线命令
介绍
Slack 是团队的交流平台。 Slack 有许多附加组件,可让团队扩展 Slack,并将其与其他程序集成。 Slack 斜线命令 是在消息输入框中执行操作的一种快速简便的方法。 例如,键入 /who 会列出当前频道中的所有用户。 您可以在 https://get.slack.help/hc/en-us/articles/201259356-Slash-commands 找到内置斜杠命令的完整列表。
您可以创建自己的斜杠命令,您的 Slack 工作区的成员会觉得这些命令很有用。 当您将命令安装到工作区并调用命令时,您可以指示 Slack 向您编写的程序发出请求。 该程序从 Slack 接收信息并返回响应,该响应显示在 Slack 中。 您可以通过阅读 API 文档 了解有关 Slack 斜杠命令的更多信息。
在本教程中,您将创建一个名为 /slash 的 Slack 斜杠命令,该命令由在 Ubuntu 16.04 服务器上运行的 Flask 应用程序提供支持,并将此命令安装到您的 Slack 工作区。 完成后,在消息输入框中键入 /slash 会将信息发送到 Flask 应用程序,该应用程序将处理请求并向 Slack 返回一条短消息,让您知道它有效。
您将使用 uWSGI 应用服务器为这个 Flask 应用程序提供服务,并使用 Nginx 作为反向代理。
先决条件
要完成本教程,您需要:
- 按照 Ubuntu 16.04 初始服务器设置指南 设置一台 Ubuntu 16.04 服务器,包括 sudo 非 root 用户和防火墙。
- 一个现有的 Flask 应用程序,在 Nginx 后面运行 uWSGI。 完成教程 How To Serve Flask Applications with uWSGI and Nginx on Ubuntu 16.04 以在您的服务器上进行配置。
- 具有安装应用程序权限的开发 Slack 工作区,如果您没有,请在 https://slack.com/create 创建一个。
第 1 步 - 创建和安装 Slack 应用程序
在我们编写代码之前,我们将首先创建一个 Slack 应用程序,它为 Slack 提供附加功能,并将其安装在开发 Slack 工作区中。 然后我们将定义命令并指定在调用命令时该命令应请求的 URL。
要创建 Slack 应用程序,请访问 https://api.slack.com/apps 并单击绿色的 创建新应用程序 按钮。 在出现的表格中,输入以下详细信息:
- 对于 应用名称,输入
DigitalOcean Slack slash command。 - 对于 Development Slack Workspace,选择您的开发工作区。
然后点击绿色的Create App按钮。
创建应用程序后,单击 Slash Commands,然后单击 Create New Command 按钮。 您将看到以下页面:
在本教程中,您将创建一个名为 /slash 的命令,它将通过 HTTP POST 将数据发送到请求 URL,即 http://server_domain_or_IP/slash。 为此,请填写以下信息:
- 用
/slash填写 Command 字段。 - 对于 请求 URL,输入
http://your_server_ip_or_domain/slash。 - 对于 简短描述 ,输入
DigitalOcean Slack slash command。
然后在绿色的 Save 按钮上完成创建斜杠命令。
现在通过单击 Install App 链接将应用程序安装到您的工作区。 按绿色的 Install App to Workspace 按钮。 然后按下绿色的 Authorize 按钮。
我们现在已经在开发 Slack 工作区中创建并安装了一个 Slack 应用程序。但是在我们创建一个处理斜杠命令的 Web 应用程序之前,该命令将不起作用。 在我们构建应用程序之前,我们需要配置我们的 Python 环境。
第 2 步 — 配置 Python 环境
完成 如何在 Ubuntu 16.04 上使用 uWSGI 和 Nginx 服务 Flask 应用程序教程后,您在 ~/myproject/ 中拥有一个 Flask 应用程序。 该目录包含以下文件和目录:
myproject.inimyproject.pywsgi.pymyprojectenv/
我们将修改 myproject.py 中的 Flask 应用程序,以对 Slack 斜杠命令发送的数据进行操作,并向 Slack 返回 JSON 响应。
命令 的 API 文档指出,我们应该使用 Slack 提供的与命令关联的验证令牌来验证斜杠命令。
此验证令牌应保密,因此我们将其保存在一个名为 .env 的新文件中,该文件不受版本控制。 我们将使用 python-dotenv 包将 .env 中的键值对导出为环境变量,我们将在 myproject.py 中访问这些环境变量。
首先,通过运行以下命令激活 Python 虚拟环境:
source myprojectenv/bin/activate
要确认 virtualenv 已激活,您应该在 Bash 提示符的左侧看到 (myprojectenv)。 验证令牌等机密不应存储在版本控制之下。 为此,我们使用 python-dotenv 包将机密导出为环境变量。 使用 pip,我们安装 python-dotenv 包:
pip install python-dotenv
使用 nano 或您喜欢的文本编辑器,创建 .env 文件:
nano .env
访问 https://api.slack.com/apps 获取验证令牌。 单击 DigitalOcean Slack 斜杠命令 应用程序,然后单击 基本信息。 然后找到验证令牌。
复制令牌的值并将其放在 .env 文件中,将值分配给名为 VERIFICATION_TOKEN 的环境变量:
~/myproject/.env
VERIFICATION_TOKEN=your_verification_token
保存文件并退出编辑器。
当您开发 Flask 应用程序时,您会希望 uWSGI 服务器在您对应用程序进行更改时自动重新加载。 为此,首先在编辑器中打开 myproject.ini:
nano myproject.ini
将此行添加到文件末尾以确保当您 touch 或在 myproject.py 中修改 Flask 应用程序时 uWSGI 自动重新加载
~/myproject/myproject.ini
... touch-reload = myproject.py
保存文件并退出编辑器。
现在我们将创建 Flask 应用程序,它接收和处理斜杠命令发送的信息,并向 Slack 返回适当的响应。
第 3 步 - 创建 Flask 应用程序
当我们在 Slack 中调用 /slash 命令时,Slack 会向我们的服务器发出请求。 我们将命令配置为点击 url /slash,因此我们将更改我们创建的 Flask 应用程序以响应该端点。
在编辑器中打开 myproject.py:
nano myproject.py
删除文件的内容。 我们将从头开始创建一个新应用程序。
添加此代码,该代码导入 Flask 并加载用于处理 JSON 数据和发出 Web 请求的附加模块:
~/myproject/myproject.py
#!/usr/bin/env python from flask import Flask, jsonify, request
然后添加加载 dotenv 模块的代码。 读取您创建的 .env 文件的内容。 将其内容加载到环境变量中,然后从环境中获取验证令牌,并将其存储在变量 verification_token 中:
~/myproject/myproject.py
... 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 应用程序以响应 Slack 斜杠命令,方法是发送一条文本响应“DigitalOcean Slack 斜杠命令成功!”:
~/myproject/myproject.py
...
app = Flask(__name__)
@app.route('/slash', methods=['POST'])
def slash():
if request.form['token'] == verification_token:
payload = {'text': 'DigitalOcean Slack slash command is successful!'}
return jsonify(payload)
if __name__ == '__main__':
app.run()
保存文件并退出编辑器。
重新启动 myproject systemd 服务以确保最新版本的代码正在运行:
sudo systemctl restart myproject
现在让我们修改 Nginx 配置以支持我们的斜杠命令。
第 4 步 – 配置 Nginx 以服务于命令
因为我们的请求 URL 是 http://server_domain_or_IP/slash,我们需要将 Nginx 服务器块中的 location 值从 / 更改为 /slash。
在编辑器中打开文件 /etc/nginx/sites-available/myproject:
sudo nano /etc/nginx/sites-available/myproject
将 location 的值从 / 更改为 /slash :
/etc/nginx/sites-available/myproject
...
location /slash {
include uwsgi_params;
uwsgi_pass unix:/home/sammy/myproject/myproject.sock;
}
}
保存文件并退出编辑器。
然后检查 Nginx 配置文件是否有语法错误:
sudo nginx -t
如果 Nginx 配置文件没有语法错误,重启 Nginx 服务:
sudo systemctl restart nginx
访问您的开发 Slack 工作区并在任何频道中输入 /slash。 您应该看到以下响应:
如果您收到说明命令失败的消息,请仔细检查 myproject.py 中的代码是否有任何语法错误或问题。 然后再试一次。
最后,一旦您完成了命令的开发,请停用 Python 虚拟环境,以便将来的 Python 命令使用系统 Python 解释器:
deactivate
您现在已经成功创建了一个 Flask 应用程序,该应用程序从 /slash 斜杠命令接收信息并向 Slack 返回响应。
为确保您的服务器和 Slack 之间的通信安全,请使用 HTTPS 为请求 URL 加密斜杠命令的连接。 您可以通过 在 Nginx 服务器 上安装 Let's Encrypt 颁发的免费 SSL 证书来实现。 完成后,请务必修改 Slack 应用程序的 URL,并将 http:// 更改为 https://。
结论
在本教程中,您通过设置由 uWSGI 应用程序服务器和 Nginx 反向代理服务器提供服务的 Flask 应用程序来实现 Slack 斜杠命令。
现在您已经了解了创建斜线命令的基础知识,您可以实现团队需要的任何斜线命令。 您可以创建从数据库中检索数据、与其他 API 交互的命令,甚至可以创建用于部署代码的命令。