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

介绍

Slack是团队的沟通平台。Slack有许多附加组件,可以让团队扩展Slack,并将其与其他程序集成。slash命令是在消息输入框中执行操作的快捷方式。例如,键入/who列出当前频道中的所有用户。

您可以创建自己的slash命令,Slack工作区的成员可以找到它们。将命令安装到工作区并调用该命令时,可以指示Slack向您编写的程序发出请求。该程序从Slack接收信息并返回响应,该响应显示在Slack中。您可以通过阅读API文档了解有关slash命令的更多信息。

在本教程中,您将创建一个Slack命令/slash,该命令由在Ubuntu 16.04服务器上运行的Flask应用程序提供支持,并将此命令安装到Slack工作区。完成后,输入/slash消息输入框将向Flask应用程序发送信息,该应用程序将处理请求并向Slack返回一条短消息,告知您它是否有效。

您将使用uWSGI应用程序服务器为此Flask应用程序提供服务,并使用Nginx作为反向代理。

准备

要完成本教程,您需要:

  • 一个Ubuntu 16.04服务器,包括一个sudo非root用户和一个防火墙。
  • 使用Nginx和uWSGI的Flask应用程序
  • 具有安装应用程序权限的开发Slack工作区,如果没有请创建一个。

第1步 - 创建和安装Slack App

在编写代码之前,我们将首先创建一个Slack应用程序,它为Slack提供附加功能,并将其安装在开发Slack工作区中。然后我们将定义命令并指定命令在调用命令时应该请求的URL。

要创建Slack应用程序,请访问https://api.slack.com/apps并单击绿色的“创建新应用程序”按钮。在显示的表单中,输入以下详细信息:

  • 对于App Name,请输入Tencent Slack slash command。
  • 对于Development Slack Workspace,选择您的开发工作区。

然后单击绿色的“ 创建应用程序”按钮。创建应用程序后,单击“ Slash Commands”,然后单击“ Create New Command”按钮。您将看到以下页面:

Create New Command

在本教程中,您将创建一个名为的命令/slash,该命令将通过HTTP POST将数据发送到请求URL 。为此,请填写以下信息:http://server_domain_or_IP/slash

  • 使用/slash填写命令字段。
  • 对于请求URL,请输入http://your_server_ip_or_domain/slash
  • 如需简短描述,请输入Tencent Slack slash command。

然后在绿色的“ 保存”按钮上完成创建斜杠命令。

现在,通过单击Install App链接将应用程序安装到您的工作区。按绿色“将应用程序安装到工作区”按钮。然后按绿色授权按钮。

我们现在已经在开发Slack工作区中创建并安装了一个Slack应用程序。但是在我们创建一个处理slash命令的Web应用程序之前,该命令将无法运行。在我们构建应用程序之前,我们需要配置我们的Python环境。

第2步 - 配置Python环境

使用uWSGI和Nginx完成如何为Flask应用程序提供服务之后,您将找到一个Flask应用程序。该~/myproject/目录包含以下文件和目录:

  • myproject.ini
  • myproject.py
  • wsgi.py
  • myprojectenv/

我们将修改Flask应用程序myproject.py以对Slack slash命令发送的数据进行操作,并向Slack返回JSON响应。命令的API文档声明我们应该使用Slack提供的与commnd关联的验证令牌来验证slash命令。

此验证令牌应保密,因此我们将其保存在一个名为.envfile的新文件中,该文件不受版本控制。

我们将使用python-dotenv包将.env中的键值对导出为环境变量,我们将访问这些环境变量myproject.py

首先,运行以下命令激活Python虚拟环境:

$ source myprojectenv/bin/activate

要确认virtualenv已激活,您应该在Bash提示的左侧看到。诸如验证令牌之类不应存储在版本控制之下。为此,我们使用python-dotenv包将密钥导出为环境变量。使用pip安装python-dotenv

(myprojectenv) $ pip install python-dotenv

使用nano或您喜欢的文本编辑器,创建.env文件:

(myprojectenv) $ nano .env

访问https://api.slack.com/apps获取验证令牌。单击Tencent Slack slash 命令应用程序,然后单击基本信息。然后找到 验证令牌

The verification token

复制令牌的值并将其放在.env文件中,将值分配给名为的环境变量VERIFICATION_TOKEN

~/myproject/.env

VERIFICATION_TOKEN=your_verification_token

保存文件并退出编辑器。

在开发Flask应用程序时,您需要在对应用程序进行更改时自动重新加载uWSGI服务器。要执行此操作,请先myproject.ini在编辑器中打开:

(myprojectenv) $ nano myproject.ini

将此行添加到文件末尾,以确保在您修改Flask应用程序时自动重新加载uWSGImyproject.py

〜/ myproject的/ myproject.ini

...

touch-reload = myproject.py

保存文件并退出编辑器。

现在我们将创建Flask应用程序,该应用程序接收并处理slash命令发送的信息,并向Slack返回适当的响应。

第3步 - 创建Flask应用程序

当我们在Slack中调用/slash命令时,Slack将向我们的服务器发出请求。我们配置命令为指向url /slash,因此我们将创建的Flask应用程序以响应Slack。

myproject.py在编辑器中打开:

(myprojectenv) $ 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应用程序以通过发送“Tencent Slack slash命令成功!”的文本响应来响应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服务以确保正在运行最新版本的代码:

(myprojectenv) $  sudo systemctl restart myproject

现在让我们修改Nginx配置以支持我们的slash命令。

第4步 - 配置Nginx支持slash命令

因为我们的请求URL是http://server_domain_or_IP/slash,所以我们需要将Nginx服务器块中的位置值从/更改为/slash

在编辑器中打开/etc/nginx/sites-available/myproject文件 :

(myprojectenv) $ 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配置文件是否存在语法错误:

(myprojectenv) $ sudo nginx -t

如果Nginx配置文件没有语法错误,请重新启动Nginx服务:

(myprojectenv) $ sudo systemctl restart nginx

访问您的开发Slack工作区并输入/slash。您应该看到以下响应:

如果您收到一条消息,指出命令失败,请仔细检查代码myproject.py是否存在任何语法错误或问题。然后再试一次。

最后,在完成开发命令后,停用Python虚拟环境,以便将来的Python命令使用系统Python解释器:

(myprojectenv) $ deactivate

您现在已经成功创建了一个Flask应用程序,它从/slash slash命令接收信息并返回对Slack的响应。

为确保服务器与Slack之间的通信安全,请使用HTTPS为请求URL加密slash命令的连接。完成后,请务必修改Slack应用程序的URL并更改http://https://

结论

在本教程中,您通过设置由uWSGI应用程序服务器和Nginx反向代理服务器提供服务的Flask应用程序来实现Slack slash命令。了解了创建slash命令的基础知识后,可以实现团队所需的任何slash命令。可以创建从数据库检索数据,与其他API交互,甚至创建用于部署代码的命令。您也可以参考五款 Slack 开源替代品找到适合自己的工具。


参考文献:《How to Write a Slash Command with Flask and Python 3 on Ubuntu 16.04》

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏desperate633

设计模式之外观模式(Facade Pattern)外观模式的优缺点

外观模式外部访问内部复杂代码的一个接口,举个例子,我们知道打开一台电脑很简单,只要按开机键,但实际上在后台我们看不到的地方,计算机进行了很多复杂的工作,比如,c...

1003
来自专栏PhpZendo

Apache Kafka 在 Windows 系统上设置与运行教程

手把手教你在 Windows 系统安装运行 Apache Zookeeper 和 Apache Kafka 服务。

1612
来自专栏古时的风筝

Django集成百度富文本编辑器uEditor

UEditor是由百度web前端研发部开发所见即所得富文本web编辑器,具有轻量,可定制,注重用户体验等特点,开源基于MIT协议,允许自由使用和修改代码。 首先...

4589
来自专栏小白安全

小白博客 linux目录结构

初学Linux,首先需要弄清Linux 标准目录结构 root --- 启动 Linux 时使用的一些核心文件。如操作系统 内核 、引导程序 Grub 等...

3366
来自专栏SpringBoot 核心技术

第十八章:SpringBoot项目中使用SpringSecurity整合OAuth2设计项目API安全接口服务

4484
来自专栏FreeBuf

利用Volatility查找系统中的恶意DLL

昨天看到@白河·愁 发了《Linux下内存取证工具Volatility的使用》,今天恰好看到一篇Volatility利用的文章,文章不长,就翻译了过来。 原文地...

1988
来自专栏技术博文

php缓存技术

1、全页面静态化缓存 也就是将页面全部生成html静态页面,用户访问时直接访问的静态页面,而不会去走php服务器解析的流程。此种方式,在CMS系 统中比较常见,...

1.1K6
来自专栏進无尽的文章

Java工具篇| Mac上Eclipse和Tomcat的安装和使用

解压下载包后对原来的文件夹重命名为ApacheTomcat,放到/Users/计算机名/Library/目录下(Library也叫资源库)

2723
来自专栏Java学习之路

从初识Maven到使用Maven进行依赖管理和项目构建

前些天就安装了Maven,以备自己以后整合项目用,尤其是我们的ssh,ssm项目。想必好多人在开始的时候并不清楚Maven是什么,它能够帮助我们干什么。 所以...

3687
来自专栏进击的君君的前端之路

如何发布npm包

1182

扫码关注云+社区