背景
想研究下怎么通过 slack 发送指令给第三方应用程序, 以及接收第三方程序的反馈. 从 slash command 开始看, 结果到 events 和 RTM 转了一圈, 又回到 slash commands, 发现这个才是最实惠简单符合需求的.
所以就简单记录一下我认为的三者的区别
必备
进行交互前, 得先理解:
- Slack apps
- Using the Slack Web API
- Bots
简单两句话:
- slack app 是扩展了 slack 本身, 除了常规手动能做的操作外, 通过 api 强化了自动化操作.
- bots 也是一类 slack app, 只不过是"虚拟的"你可以与之对话的"人", 通过 bot user 来实现实时对话.
这些自动化操作, 除了 slack 本身提供的之外, 便是第三方应用程序可与之交互实现的.
简述
slack 与第三方应用程序交互, 目前看起来有三种交互方式:
Event Subscriptions
理念是 Don't call us, we'll call you
:
- 3rd server 订阅了 slack 的某个类型的 event, 比如 react_added 了表情之类
- 当用户在 slack 端触发了这个 event 时,
- slack 发送请求到 3rd server, 带着包含这个 event 信息的 json payload
- 3rd server 接受请求, 并针对这个 event 处理内部业务逻辑
这里的 3rd server 就静静的等着 slack 推送就好. 当然如果想主动去交互也 ok, 但这个不是设计应用重点.
Before you can use the Events API you must create a Slack App, and turn on Event Subscriptions.
如果想用 python 开发, 可以试试
slackapi/python-slack-events-api: Slack Events API adapter for Python
示例: python-slack-events-api/example
虽然这个 events 很好用,
Slack events are delivered to a secure webhook, and allows you to connect to slack without the RTM websocket connection.
但是实际环境中, 有些 3rd server 在防火墙后面, 可能不能主动收到 slack 的 events 请求. 这时候可以用 RTM client.
Real Time Messaging API
这个是可以实时监听 slack 的 events, 即 app server 得建立个连接, 放在那儿监听 slack 的信息. 不同于 events api 的那种 PUSH 模式 "slack 有了消息就 call 你", 而是 PULL 模式 "你去看看 slack 有消息了没".
slackapi/python-slackclient: Slack Python SDK https://slack.dev/python-slackclient/
支持异步通信. 不过新的 slack app 已不太用这种方式了
New Slack apps may not use any Real Time Messaging API method. Create a classic app and use the V1 Oauth flow to use RTM.
Slash Commands
Slash commands are special commands triggered by typing a "/" then a command.
这个交互最简单直接, 在 slack channel 对话框中输入 "/
实现上也很简单, 搭建个 flask api server, 处理一下 slack 请求就好. 不需要应对各种不同的 events (相对前面几类交互而言)
Reference
- Events API
- Serverless Slash Commands with Python - Renzo Lucioni
- slackapi/python-slackclient: Slack Python SDK https://slack.dev/python-slackclient/
- Botkit and Slack - Botkit Documentation
ChangeLog
- 2020-05-04 init