如何在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.ini
myproject.py
wsgi.py
myprojectenv/
我们将修改 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 交互的命令,甚至可以创建用于部署代码的命令。