首页 文章

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

提问于
浏览
21

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

我有一个使用RTM API的工作Slack机器人,我们称之为Edi . 只要所有命令都以“@edi”开头,它就能很好地工作;例如“@edi帮助” . 它目前响应它所属的任何 Channels 和直接消息 . 但是,我想更新僵尸程序,以便当它是直接消息时,不需要用“@edi”启动命令;例如一个 Channels 中的“@edi help”,但直接消息中的“帮助” . 我没有看到任何区别于两者的具体内容,但我确实尝试使用channel.info endpoints 并计算“成员”中的人数;但是,此方法仅适用于公共 Channels . 对于专用通道和直接消息, endpoints 返回“channel_not_found”错误 .

提前致谢 .

3 回答

  • 2

    我和斯拉克的詹姆斯谈过,他给了我一个简单的方法来确定一条消息是否是DM;如果 Channels ID以以下内容开头:

    • C,这是一个公共 Channels

    • D,它是用户的DM

    • G,它可以是私人 Channels ,也可以是多人DM

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

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

    注意:

    • channels.info仅适用于公共 Channels

    • groups.info仅适用于私人 Channels 和多人DM

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

    来自im.list的

    • “id”是 Channels ID
      来自im.list的

    • “user”是来自机器人DM'的用户ID

    • 您没有传递机器人的用户ID,因为它是从令牌中提取的

  • 31

    截至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"
    }
    
  • 0

    使用Slack API方法groups.info,info函数也可用于专用通道 . 这也适用于具有多个参与者的直接消息通道,因为它们是特殊形式的专用通道 .

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

    请注意,groups.list将仅返回私有通道,已邀请访问令牌所属的用户或机器人 .

相关问题