介绍
Slack是团队的通讯平台。Slack有许多插件,允许团队扩展Slack,并与其他程序集成。Slack slash commands是执行消息输入框中的行动的快速和简单的方法。例如,键入 /who
列出当前渠道中的所有用户。您可以在 https://get.slack.help/hc/en-us/articles/201259356-Slash-commands 找到内置的完整列表。
您可以创建自己的 slash 命令,使 Slack 工作区的成员觉得有用。当您将命令安装到工作区并调用命令时,您可以指示 Slack 向您编写的程序提出请求。
在本教程中,您将创建一个名为 /slash
的 Slack slash 命令,由运行在 Ubuntu 16.04 服务器上的 Flask 应用程序驱动,并将此命令安装到您的 Slack 工作区。
您将使用 uWSGI应用程序服务器服务此 Flask 应用程序,并使用 Nginx作为反向代理。
前提条件
要完成本教程,您将需要:
- 一个 Ubuntu 16.04 服务器通过遵循 Ubuntu 16.04 初始服务器安装指南,包括一个 sudo 非根用户和防火墙
- 一个现有的 Flask 应用程序与 uWSGI 运行在 Nginx 后面。
步骤 1 – 创建和安装 Slack 应用程序
在我们编写代码之前,我们首先将创建一个 Slack app,它为 Slack 提供了额外的功能,并在开发 Slack 工作区中安装它。
要创建 Slack 应用程序,请访问 https://api.slack.com/apps,然后点击绿色 创建新应用程序按钮。
- 对于 应用名称,请输入
DigitalOcean Slack slash 命令
. - 对于 Development Slack Workspace,请选择您的开发工作区
然后点击绿色 ** 创建应用程序 ** 按钮。
创建应用后,单击 Slash Commands,然后单击 Create New Command按钮。
对于本教程,您将创建一个命令,名为/slash
,该命令将通过HTTP POST将数据发送到一个请求URL,即http://server_domain_or_IP/slash
。
- 请填写 命令字段以
/slash
- 对于 请求URL,请输入
http://your_server_ip_or_domain/slash
- 对于 简要描述,请输入
DigitalOcean Slack slash 命令
然后点击绿色 ** 保存 ** 按钮来完成创建 slash 命令。
现在,点击安装应用程序
链接来将应用程序安装到您的工作区,按一下绿色安装应用程序到工作区
按钮,然后按绿色允许
按钮。
我们现在已经在开发 Slack 工作区中创建并安装了 Slack 应用程序,但直到我们创建一个处理 slash 命令的 Web 应用程序,命令才会起作用。
第2步:配置Python环境
在完成了 Ubuntu 16.04 上如何使用 uWSGI 和 Nginx 服务 Flask 应用程序(https://andsky.com/tech/tutorials/how-to-serve-flask-applications-with-uwsgi-and-nginx-on-ubuntu-16-04)教程后,您有位于 ~/myproject/
中的 Flask 应用程序。
myproject.ini
myproject.py
wsgi.py
myprojectenv/
我们将在 myproject.py 中修改 Flask 应用程序以对 Slack slash 命令发送的数据进行操作,并返回 JSON 响应给 Slack。
命令的API文档(https://api.slack.com/slash-commands)指出,我们应该使用Slack提供的command相关的验证代码验证Slash命令。
这个验证代币应该保密,所以我们会将其保存到一个名为.env
的文件中,而不是在版本控制下保留的文件中。
首先,启用 Python 虚拟环境,运行:
1source myprojectenv/bin/activate
要确认 virtualenv 已被激活,你应该在 Bash 提示的左侧看到 (myprojectenv)。 验证代码等秘密不应该在版本控制下存储。 为了实现这一目标,我们使用了
python-dotenv包,将秘密导出为环境变量。 使用
pip,我们安装了
python-dotenv` 包:
1pip install python-dotenv
使用 nano 或您最喜欢的文本编辑器,创建 .env
文件:
1nano .env
通过访问 https://api.slack.com/apps 获取验证令牌,点击 DigitalOcean Slack slash 命令应用程序,然后点击 基本信息,然后找到 验证令牌。
复制代币的值,并将其放入 .env
文件中,将该值分配给一个名为 `VERIFICATION_TOKEN’ 的环境变量:
1[label ~/myproject/.env]
2VERIFICATION_TOKEN=your_verification_token
保存文件并离开编辑器。
當您開發 Flask 應用程式時,您將希望 uWSGI 伺服器在變更應用程式時自動重新加載。
1nano myproject.ini
将此行添加到文件的末尾,以确保在myproject.py
中触摸
或修改Flask
应用时,uWSGI 会自动重新加载。
1[label ~/myproject/myproject.ini]
2...
3
4touch-reload = myproject.py
保存文件并离开编辑器。
现在我们将创建Flask应用程序,该应用程序会接收和处理Slash命令发送的信息,并返回适当的响应给Slack。
步骤3 – 创建Flask应用程序
当我们在Slack中调用/slash
命令时,Slack将向我们的服务器发出请求,我们将命令配置为打击URL/slash
,因此我们将更改我们创建的Flask应用程序以响应该端点。
在您的编辑器中打开myproject.py
:
1nano myproject.py
删除文件的内容. 我们将从头开始创建一个新的应用程序。
添加此代码来导入 Flask 并加载用于处理 JSON 数据和创建 Web 请求的额外模块:
1[label ~/myproject/myproject.py]
2#!/usr/bin/env python
3
4from flask import Flask, jsonify, request
然后添加这个代码,加载dotenv
模块,读取您创建的.env
文件的内容,将其内容加载到环境变量中,然后从环境中获取验证令牌,将其存储在变量verification_token
:
1[label ~/myproject/myproject.py]
2...
3import os
4import dotenv
5
6dotenv_path = os.path.join(os.path.dirname(__file__), '.env')
7dotenv.load_dotenv(dotenv_path)
8verification_token = os.environ['VERIFICATION_TOKEN']
现在添加此代码来配置 Flask 应用程序以响应 Slack slash 命令,通过发送文本响应表示DigitalOcean Slack slash 命令成功!
:
1[label ~/myproject/myproject.py]
2...
3
4app = Flask(__name__)
5
6@app.route('/slash', methods=['POST'])
7def slash():
8 if request.form['token'] == verification_token:
9 payload = {'text': 'DigitalOcean Slack slash command is successful!'}
10 return jsonify(payload)
11
12if __name__ == '__main__':
13 app.run()
保存文件并离开编辑器。
重新启动myproject
systemd 服务,以确保您的代码的最新版本正在运行:
1sudo systemctl restart myproject
现在让我们修改 Nginx 配置以支持我们的 slash 命令。
步骤 4 – 配置 Nginx 以服务命令
由于我们的请求URL是http://server_domain_or_IP/slash
,我们需要在我们的 Nginx 服务器块中的位置
值从/
更改到/slash
。
在您的编辑器中打开文件 /etc/nginx/sites-available/myproject
:
1sudo nano /etc/nginx/sites-available/myproject
将位置
的值从/
更改为/slash
:
1[label /etc/nginx/sites-available/myproject]
2...
3
4 location /slash {
5 include uwsgi_params;
6 uwsgi_pass unix:/home/sammy/myproject/myproject.sock;
7 }
8}
保存文件并离开编辑器。
然后检查 Nginx 配置文件,查找语法错误:
1sudo nginx -t
如果 Nginx 配置文件没有语法错误,请重新启动 Nginx 服务:
1sudo systemctl restart nginx
访问您的开发 Slack 工作区,在任何渠道中键入 `/slash。
如果您收到消息称该命令失败,请在myproject.py
中对代码进行双重检查,查找任何语法错误或问题,然后再试一次。
最后,一旦你完成了开发你的命令,停用Python虚拟环境,以便未来的Python命令使用系统Python解释器:
1deactivate
您现在已经成功创建了一个 Flask 应用程序,该应用程序从 `/slash’ slash 命令中接收信息,并返回 Slack 响应。
<$>[注] 为了确保您的服务器和Slack之间的通信是安全的,使用HTTPS来加密请求URL的Slash命令的连接,您可以通过 安装由Let's Encrypt在Nginx服务器上发布的免费SSL证书来完成此操作。完成后,请确保对Slack应用程序的URL进行修改,并将http://改为https://` <$>
结论
在本教程中,您通过设置由 uWSGI 应用程序服务器和 Nginx 反向代理服务器提供的 Flask 应用程序来实现 Slack slash 命令。
现在你知道创建 slash 命令的基本知识,你可以执行你的团队需要的任何 slash 命令. 你可以创建从数据库中获取数据、与其他 API 交互的命令,甚至创建部署代码的命令。