介绍
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应用程序发送信息,Flask应用程序将处理该请求,并向Slack返回一条短消息,让您知道它的工作。
您将使用uWSGI应用程序服务器来提供此Flask应用程序,并使用Nginx作为反向代理。
先决条件
要完成本教程,您将需要:
- 遵循Ubuntu 16.04初始服务器设置指南设置的一台Ubuntu 16.04服务器,包括sudo非root用户和防火墙。
- 一个现有的Flask应用程序,在uginx后面运行uWSGI。 完成教程如何在Ubuntu 16.04上使用uWSGI和Nginx来配置Flask应用程序,以便在您的服务器上进行配置。
- 具有安装应用程序权限的开发Slack工作区,如果您没有,请在https://slack.com/create上创建一个。
第1步 - 创建和安装Slack App
在我们编写代码之前,我们将首先创建一个Slack应用程序 ,它为Slack提供额外的功能,并将其安装在开发Slack工作区中。 然后,我们将定义该命令并指定在调用该命令时该命令应该请求的URL。
要创建一个Slack应用程序,请访问https://api.slack.com/apps并点击绿色的创建新应用程序按钮。 在出现的表单中,输入以下详细信息:
- 对于App Name ,输入
DigitalOcean Slack slash command
。 - 对于开发松弛工作区 ,请选择您的开发工作区。
然后点击绿色的创建应用程序按钮。
创建应用程序后,单击“ 削减命令” ,然后单击“ 创建新命令”按钮。 你会看到以下页面:
在本教程中,您将创建一个名为/slash
的命令,该命令将通过HTTP POST将数据发送到http:// server_domain_or_IP /slash
的请求URL。 为此,请填写以下信息:
- 用
/slash
填写命令字段。 - 对于请求URL ,输入
http:// your_server_ip_or_domain /slash
。 - 对于简短描述 ,输入
DigitalOcean Slack slash command
。
然后在绿色的保存按钮上完成创建斜杠命令。
现在通过点击安装应用程序链接将应用程序安装到您的工作区。 按绿色的安装应用程序工作区按钮。 然后按绿色的授权按钮。
我们现在已经在开发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斜线命令发送的数据,并将JSON响应返回给Slack。
命令的API文档指出,我们应该使用由Slack提供的与commnd相关的验证令牌来验证slash命令。
这个验证令牌应该保密,所以我们将它保存在一个名为.env
文件的新文件中, .env
文件不受版本控制。 我们将使用python-dotenv
软件包将python-dotenv
的键值对.env
为环境变量,我们将在myproject .py
访问这些环境变量。
首先,运行以下命令激活Python虚拟环境:
source myprojectenv/bin/activate
要确认virtualenv已激活,您应该在Bash提示符的左侧看到( myprojectenv )
。 验证令牌等秘密不应该存储在版本控制下。 为了达到这个目的,我们使用导出秘密的python-dotenv
包作为环境变量。 使用pip
,我们安装python-dotenv
包:
pip install python-dotenv
使用纳米或您最喜爱的文本编辑器,创建.env
文件:
nano .env
通过访问https://api.slack.com/apps获取验证令牌。 点击DigitalOcean Slack斜杠命令应用程序,然后点击基本信息 。 然后找到验证令牌 。
复制该令牌的值并将其放在.env
文件中,将该值分配给名为VERIFICATION_TOKEN
的环境变量:
VERIFICATION_TOKEN=your_verification_token
保存该文件并退出编辑器。
当您开发Flask应用程序时,您需要在更改应用程序时自动重新加载uWSGI服务器。 要做到这一点,首先在你的编辑器中打开myproject .ini
:
nano myproject.ini
将此行添加到文件末尾,以确保当您touch
或修改myproject .py
的Flask应用程序时,uWSGI会自动重新加载
...
touch-reload = myproject.py
保存该文件并退出编辑器。
现在我们将创建Flask应用程序,它接收和处理由slash命令发送的信息,并将相应的响应返回给Slack。
第3步 - 创建Flask应用程序
当我们调用Slack中的/slash
命令时,Slack会向我们的服务器发出请求。 我们将命令配置为命中url /slash
,所以我们将改变我们创建的Flask应用来响应该端点。
在您的编辑器中打开myproject .py
:
nano myproject.py
删除文件的内容。 我们将从头开始创建一个新的应用程序。
添加这个代码,它导入Flask并加载额外的模块来处理JSON数据和发出Web请求:
#!/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应用程序,通过发送一个文本响应“DigitalOcean Slack斜线命令成功!”来响应Slack斜线命令:
...
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
:
...
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进行交互的命令,甚至可以创建用于部署代码的命令。