Slack机器人如何检测直接消息与频道中的消息?

时间:2016-12-12 23:11:25

标签: slack-api

TL; DR:通过Slack API,我如何区分频道中的消息与直接消息?

我有一个使用RTM API的工作Slack机器人,我们称之为Edi。只要所有命令都以" @ edi&#34 ;;开头,它就会很好用。例如" @edi help"。它目前响应它所属的任何频道和直接消息。但是,我想更新机器人,以便当它成为直接消息时,不需要用" @ edi&#34 ;;例如" @edi help"在一个频道,但"帮助"直接的消息。我没有看到任何具体的区别,但我尝试使用channel.info端点并计算"成员&#34 ;;但是,此方法仅适用于公共频道。对于专用信道和直接消息,端点返回" channel_not_found"错误。

提前致谢。

4 个答案:

答案 0 :(得分:34)

我和Slack的James谈过,他给了我一个简单的方法来判断一条消息是否是DM;如果频道ID以:

开头
  • C,它是一个公共频道
  • D,它是用户的DM
  • G,它是私人频道或多人DM

但是,这些值并非一成不变,可能会在某个时刻发生变化,或者被添加到。

因此,如果该语法消失,另一种检测DM以使用channels.info和groups.info的方法。如果他们都为“ok”字段返回“false”,那么你知道它是DM。

注意:

  • channels.info仅适用于公共频道
  • groups.info仅适用于私人频道和多人DM

奖金信息: 一旦检测到消息是DM,请使用用户ID或通道ID,并在im.list的结果中搜索它;如果你找到它,那么你就会知道它是机器人的DM。

    来自im.list的
  • “id”是频道ID
  • 来自im.list的
  • “user”是来自使用bot的人员的用户ID
  • 您没有传递机器人的用户ID,因为它是从令牌中提取的

答案 1 :(得分:2)

2017年7月的FYI," message.im"事件(通过您的应用程序的事件订阅),事件有效负载似乎现在返回其他字段以检测消息是否来自您自己的机器人(从我的日志粘贴到此处):

    INFO[0012] got Slack message: (bot.SlackMessage) {
    SlackEvent: (bot.SlackEvent) {
        Type: (string) (len=7) "message",
        EventTs: (string) (len=17) "1501076832.063834",
        User: (string) ""
    },
    SubType: (string) (len=11) "bot_message",
    Channel: (string) (len=9) "D6CJWD132",
    Text: (string) (len=20) "this is my bot reply",
    Username: (string) (len=15) "Myapp Local",
    BotID: (string) (len=9) "B6DAZKTGG",
    Ts: (string) (len=17) "1501076832.063834"
}

答案 2 :(得分:1)

Slack在一段时间前添加了Conversations API。您应该使用它来区分PM /通道,而不要依赖前缀。

来自Conversations API文档:

  

每个频道都有一个唯一的团队ID,以一个字母开头(C,G或D)开头。在团队之间共享频道时(请参阅开发共享频道),频道ID可能会更改,例如ID为G0987654321的私人频道可能会变为ID C0987654321。

     

这是您应该使用对话方法而不是以前的API方法的原因之一!您不能依靠私有共享通道的唯一ID在其整个生存期内保持不变。

使用conversations.info方法获取对话信息并选中is_im标志。 is_im == true意味着对话是两个杰出人士或用户与漫游器之间的直接消息。

答案 3 :(得分:0)

使用Slack API方法groups.info,私有频道也可以使用info功能。这也适用于具有多个参与者的直接消息通道,因为它们是一种特殊形式的专用通道。

您可以使用groups.list获取所有私有频道的ID。直接与多个参与者建立消息渠道。

请注意,groups.list只会返回私人频道,即访问令牌所属的用户或机器人已被邀请。