【问题标题】:Slack Events API: Events are posted (multiple times) for responses of own bot userSlack Events API:为自己的机器人用户的响应发布(多次)事件
【发布时间】:2020-04-16 18:48:59
【问题描述】:

我在通过 Slack Events API (im.message event) 响应传入消息时似乎遇到了问题。

  • 当用户(在本例中为 UQ364CBPF)向我的 App Home 发送消息时,事件 API 会正确地将事件发布到我的后端(=下面日志中的第一行)。

  • 我使用 HTTP 200 OK 响应事件,并且在我的代码(见下文)中,我触发了我的机器人用户的响应。

  • 此响应在 Slack 中正确发送。

但是:在此之后,事件 API 不断发布我自己的机器人用户在此频道中发布消息的事件...

此外,这些事件通常只发布 3 次,而这些事件只会不停地发布。即使机器人用户在 Slack 中只发送了一条响应消息。

User UQ364CBPF has posted message: I'm typing a message to my Slack bot. in DQ5FF35N2 of channel type: im
[26/Dec/2019 15:16:30] "POST /slack/events/ HTTP/1.1" 200 0
User UQ5529KTR has posted message: Thank you for your message! We will get back to you soon! in DQ5FF35N2 of channel type: im
[26/Dec/2019 15:16:32] "POST /slack/events/ HTTP/1.1" 200 0
User UQ5529KTR has posted message: Thank you for your message! We will get back to you soon! in DQ3KX0NPJ of channel type: im
[26/Dec/2019 15:16:33] "POST /slack/events/ HTTP/1.1" 200 0
User UQ5529KTR has posted message: Thank you for your message! We will get back to you soon! in DQ3KX0NPJ of channel type: im
[26/Dec/2019 15:16:35] "POST /slack/events/ HTTP/1.1" 200 0
User UQ5529KTR has posted message: Thank you for your message! We will get back to you soon! in DQ3KX0NPJ of channel type: im
[26/Dec/2019 15:16:37] "POST /slack/events/ HTTP/1.1" 200 0
User UQ5529KTR has posted message: Thank you for your message! We will get back to you soon! in DQ3KX0NPJ of channel type: im
[26/Dec/2019 15:16:39] "POST /slack/events/ HTTP/1.1" 200 0
User UQ5529KTR has posted message: Thank you for your message! We will get back to you soon! in DQ3KX0NPJ of channel type: im
[26/Dec/2019 15:16:40] "POST /slack/events/ HTTP/1.1" 200 0
User UQ5529KTR has posted message: Thank you for your message! We will get back to you soon! in DQ3KX0NPJ of channel type: im
[26/Dec/2019 15:16:42] "POST /slack/events/ HTTP/1.1" 200 0
User UQ5529KTR has posted message: Thank you for your message! We will get back to you soon! in DQ3KX0NPJ of channel type: im
[26/Dec/2019 15:16:43] "POST /slack/events/ HTTP/1.1" 200 0
User UQ5529KTR has posted message: Thank you for your message! We will get back to you soon! in DQ3KX0NPJ of channel type: im

在我的代码中,这是处理 Slack 事件的更大函数的一部分,相关部分:

@csrf_exempt
def slack_events(request):
    if request.method == 'POST':
        json_data = json.loads(request.body)
        event_callback_type = json_data['event']['type']
        if event_callback_type == 'message':
                user_id = json_data['event']['user']
                text = json_data['event']['text']
                channel_id = json_data['event']['channel']
                channel_type = json_data['event']['channel_type']
                timestamp = json_data['event']['ts']
                print ('User ' + user_id + ' has posted message: ' + text + ' in ' + channel_id + ' of channel type: ' + channel_type)
                slack_message_received(user_id, channel_id, channel_type, team_id, timestamp, text)
                return HttpResponse(status=200)

这里(或函数slack_message_received)没有任何东西可以触发这个循环流。

所以

1. Slack 用所有这些东西轰炸我是不是很奇怪? 来自我自己的机器人用户的 POST 请求?

2。除了过滤掉我自己的机器人用户 ID 并在后端忽略这些请求之外,我是否可以避免这种行为?

【问题讨论】:

    标签: django events bots slack slack-api


    【解决方案1】:

    事件 API 的标准行为是您的机器人将接收所有消息事件,包括来自它自己的帖子。通过对它们做出反应,您已经创建了无限循环。

    要解决此问题,您需要按照 #2 中的建议将其过滤掉,从而停止对机器人自己的消息做出反应。这是标准方法。

    如果您不需要收听其他机器人,最简单的方法是过滤掉所有机器人消息。然后,您可以忽略所有具有 subtype 属性的消息。或者,您当然可以从您自己的机器人中过滤我们的消息。

    【讨论】:

    • 感谢您的回答!确实我忘了这会触发无限循环的响应 - 响应 - ...
    • @GillesVanermen 你能否分享一下你是如何做到这一点的代码或链接,我在编写代码以查找 BotID 时遇到问题。
    【解决方案2】:

    我有同样的问题。但是当我打印请求时,我找不到subtype 所以上面的解决方案对我不起作用。 log detail showing what is in the request I receive. There was no subtype

    相反,我注意到来自 bot 的消息有 bot_id 而来自用户的消息没有。 因此,我的解决方案是这样的:

        @slack_events_adapter.on("message")
        def say_hello(event_data):
           print('EVENT_DATA')
           print(event_data)
           message = event_data['event']
    
           # if the incoming message contains "hello" NOT CASE SENSITIVE, then respond with a designed message
           # "subtype" doesnt help to filter bot's message event and user's message event
           if message.get('bot_id') is None and 'hello' in ((message.get('text')).lower()):
               channel_id = message['channel']
               user = message['user']
               message = "Hello <@%s>! :tada:" % user
               slack_web_client.chat_postMessage(channel=channel_id, text=message)
           else:
               return
    

    【讨论】:

      【解决方案3】:

      正如@Phoebe 所说 - 在使用检索事件时

      slack_message.get('event') 
      

      我没有找到bot_id 的密钥。我认为这是 Slack Events api 的问题。

      【讨论】:

      猜你喜欢
      • 2016-11-20
      • 1970-01-01
      • 2017-06-11
      • 1970-01-01
      • 2018-11-15
      • 2020-02-04
      • 2021-02-03
      • 2019-06-25
      • 2017-10-02
      相关资源
      最近更新 更多