【问题标题】:How can a Slack bot detect a direct message vs a message in a channel?Slack 机器人如何检测直接消息与频道中的消息?
【发布时间】:2017-04-27 22:21:06
【问题描述】:

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

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

提前致谢。

【问题讨论】:

    标签: slack-api


    【解决方案1】:

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

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

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

    【讨论】:

    • 我在 DM 上尝试了 groups.info,它返回了“channel_not_found”错误。但是您的信息帮助我找到了解决方案。如果 groups.info 和 channels.info 都返回错误,那么它是一个 DM。我做了一个初步测试,它似乎工作。谢谢。
    【解决方案2】:

    我在 Slack 与 James 进行了交谈,他给了我一个简单的方法来确定一条消息是否是 DM;如果频道 ID 以:

    • C,这是一个公共频道
    • D,这是用户的 DM
    • G,私信或者多人私信

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

    因此,如果该语法消失,另一种检测 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”是与机器人 DM 的人的用户 ID
    • 您不要传入机器人的用户 ID,因为它是从令牌中提取的

    【讨论】:

    • 处理同样的问题,发现一个以“W”开头的私人频道。
    • 他们应该已经添加了对这个 hacky 和秘密有用功能的官方支持......
    【解决方案3】:

    仅供参考,截至 2017 年 7 月,对于“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"
    }
    

    【讨论】:

      【解决方案4】:

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

      来自对话 API 文档:

      每个频道都有一个团队独有的 ID,该 ID 以单个字母前缀开头,C、G 或 D。当团队之间共享频道时(请参阅为共享频道开发),该频道的前缀频道 ID 可能会更改,例如ID 为 G0987654321 的专用频道可能会变为 ID C0987654321。

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

      使用conversations.info 方法获取对话信息并检查is_im 标志。 is_im == true 表示对话是两个杰出个人或用户和机器人之间的直接消息。

      【讨论】:

        猜你喜欢
        • 2016-08-21
        • 2017-01-17
        • 2017-09-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多