Slack view_submission事件无法在斜杠命令触发的当前窗口发送消息
问题根源
你当前的实现问题是Modal提交事件的默认payload不会携带斜杠命令触发窗口的频道ID,直接传入用户ID发消息默认会打开机器人和用户的单独DM窗口,不会回到斜杠命令发起的原会话。
解决步骤
- 利用Modal的
private_metadata字段透传原窗口信息
你在触发Modal时预留的private_metadata字段就是用来存储自定义上下文的,直接把斜杠命令触发时的channel_id存在这个字段里即可。 - Modal提交后读取透传的频道ID发消息
在view_submission回调中读取private_metadata里存的频道ID,作为chat_postMessage的channel参数传入。
修改后的代码示例
调整handle_command中Modal触发逻辑
@app.command("/jarvis") def handle_command(body, ack, client, logger): logger.info(body) ack(text="Accepted!", blocks=[ { "type": "section", "block_id": "b", "text": { "type": "mrkdwn", "text": ":white_check_mark: Accepting New Request!", }, } ], ) modal_block = open("modal.json", "r").read() res = client.views_open( trigger_id=body["trigger_id"], view={ "type": "modal", "callback_id": "settings-modal", "title": {"type": "plain_text", "text": "Settings Form"}, "submit": {"type": "plain_text", "text": "Submit"}, "close": {"type": "plain_text", "text": "Cancel"}, "blocks": modal_block, # 把原斜杠命令的频道ID存入private_metadata "private_metadata": body["channel_id"] }, ) logger.info(res)
调整view_submission回调逻辑
@app.view("settings-modal") def view_submission(ack, body, client, logger): ack() logger.info(body["view"]["state"]["values"]) # 读取透传的原窗口频道ID target_channel = body["view"]["private_metadata"] client.chat_postMessage(channel=target_channel, text="submitted, wait please!!!")
额外注意事项
- 如果斜杠命令是在消息线程中触发的,你还可以把
body["thread_ts"]也一起存入private_metadata,发消息时传入thread_ts参数就可以把响应发送到对应线程中。 - 确保你的机器人拥有目标频道的发消息权限,如果是私有频道需要先把机器人邀请进频道才能正常发消息。
内容的提问来源于stack exchange,提问作者3e4r5t
相关产品推荐
相关产品推荐

