Slack 事件 API:针对自己的机器人用户的响应发布(多次)事件
Slack Events API: Events are posted (multiple times) for responses of own bot user
我似乎在通过 Slack 事件响应传入消息时遇到问题 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。除了过滤掉我自己的 Bot 用户 ID 并在后端忽略这些请求之外,我可以避免这种行为吗?
事件的标准行为 API 您的机器人将接收所有消息事件,包括来自它自己的帖子。通过对它们做出反应,你已经创建了无限循环。
要解决此问题,您需要停止对机器人自己的消息做出反应,方法是按照您在 #2 中的建议将其过滤掉。这是标准方法。
最简单的方法是过滤掉所有机器人消息,如果您不需要收听其他机器人的话。然后您可以忽略所有具有 subtype
属性 的消息。或者,您当然可以从您自己的机器人中过滤我们的消息。
我遇到了同样的问题。但是当我打印请求时,我找不到 subtype
所以上面的解决方案对我不起作用。
log detail showing what is in the request I receive. There was no subtype
相反,我注意到来自机器人的消息有 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
正如@Phoebe 所说 - 在使用
检索事件时
slack_message.get('event')
我没有找到密钥 bot_id
。我认为这是 Slack Events api.
的一个问题
我似乎在通过 Slack 事件响应传入消息时遇到问题 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。除了过滤掉我自己的 Bot 用户 ID 并在后端忽略这些请求之外,我可以避免这种行为吗?
事件的标准行为 API 您的机器人将接收所有消息事件,包括来自它自己的帖子。通过对它们做出反应,你已经创建了无限循环。
要解决此问题,您需要停止对机器人自己的消息做出反应,方法是按照您在 #2 中的建议将其过滤掉。这是标准方法。
最简单的方法是过滤掉所有机器人消息,如果您不需要收听其他机器人的话。然后您可以忽略所有具有 subtype
属性 的消息。或者,您当然可以从您自己的机器人中过滤我们的消息。
我遇到了同样的问题。但是当我打印请求时,我找不到 subtype
所以上面的解决方案对我不起作用。
log detail showing what is in the request I receive. There was no subtype
相反,我注意到来自机器人的消息有 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
正如@Phoebe 所说 - 在使用
检索事件时slack_message.get('event')
我没有找到密钥 bot_id
。我认为这是 Slack Events api.