【发布时间】:2018-12-27 09:42:56
【问题描述】:
我正在使用 Web 服务 api 从松弛通道(事件订阅)接收消息,并使用相同的 Web 服务 api 向同一松弛通道上的用户发送消息(传入 webhook)。
但是当我发送一条消息时,这条消息会通过 slack 事件订阅发送回我的 api。这会创建一个无限循环。
我如何声明我发送到频道的消息,当我收到事件订阅返回时可以检查?
【问题讨论】:
我正在使用 Web 服务 api 从松弛通道(事件订阅)接收消息,并使用相同的 Web 服务 api 向同一松弛通道上的用户发送消息(传入 webhook)。
但是当我发送一条消息时,这条消息会通过 slack 事件订阅发送回我的 api。这会创建一个无限循环。
我如何声明我发送到频道的消息,当我收到事件订阅返回时可以检查?
【问题讨论】:
这是 Slack 的正常行为,不能通过任何配置更改。当您订阅消息事件时,您将收到 所有 消息的事件,包括来自您自己的应用程序的消息。
为了避免无限循环,因此您需要在继续处理之前检测并过滤掉来自您自己的机器人的消息。这可以很容易地完成,因为所有消息都包含发件人的姓名。例如您可以过滤掉所有具有 Slack 应用程序的 bot_id 的消息或来自机器人的所有消息(具有 subtype = bot_message)。
以下是一些示例消息的外观以及来自真实用户的消息与来自 Slack 应用程序的消息有何不同:
来自真实用户的示例消息:
{
"type": "message",
"user": "U12345467",
"text": "Good read for some of guys",
"ts": "1531745292.000021"
}
来自 Slack 应用或机器人的示例消息
{
"text": "Hey guys",
"bot_id": "B12345678",
"type": "message",
"subtype": "bot_message",
"ts": "1531700187.000049"
}
另见this answer。
【讨论】:
bot_id ?我正在构建公共机器人,因此它将安装到多个工作区。 bot_id 将取决于每个工作区,但 oauth response 不包含该信息。