如何在 Ubuntu 16.04 上使用 Flask 和 Python 3 编写斜线命令

介绍

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作为反向代理。

前提条件

要完成本教程,您将需要:

步骤 1 – 创建和安装 Slack 应用程序

在我们编写代码之前,我们首先将创建一个 Slack app,它为 Slack 提供了额外的功能,并在开发 Slack 工作区中安装它。

要创建 Slack 应用程序,请访问 https://api.slack.com/apps,然后点击绿色 创建新应用程序按钮。

  • 对于 应用名称,请输入 DigitalOcean Slack slash 命令.
  • 对于 Development Slack Workspace,请选择您的开发工作区

然后点击绿色 ** 创建应用程序 ** 按钮。

创建应用后,单击 Slash Commands,然后单击 Create New Command按钮。

Page for creating 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 命令应用程序,然后点击 基本信息,然后找到 验证令牌

The verification token

复制代币的值,并将其放入 .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。

Slack slash command is successful!

如果您收到消息称该命令失败,请在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 交互的命令,甚至创建部署代码的命令。

Published At
Categories with 技术
comments powered by Disqus