Slack app.view()处理工单提交时获取用户ID遇KeyError问题
解决Slack模态框提交后获取用户ID并发送通知的问题
问题原因
你遇到的KeyError: 'user'是因为当前view_submission事件的body payload中确实没有顶层的user字段,这通常是因为模态框打开时没有将用户ID传递到提交事件的上下文里,或者在特定团队/企业网格环境下字段结构有差异。
解决方案
最可靠的方式是在打开模态框时将用户ID存入private_metadata字段,提交时再从该字段取出:
步骤1:修改模态框打开逻辑
不管你是通过斜杠命令、按钮还是其他方式打开模态框,都要把触发用户的ID存入private_metadata:
# 示例:通过斜杠命令打开模态框 @app.command("/create-ticket") def open_ticket_modal(ack, body, client): ack() # 获取触发命令的用户ID user_id = body["user_id"] # 打开模态框时将用户ID存入private_metadata client.views_open( trigger_id=body["trigger_id"], view={ "type": "modal", "callback_id": "ticket_submission", "private_metadata": user_id, # 存储用户ID "title": {"type": "plain_text", "text": "Create Ticket"}, "submit": {"type": "plain_text", "text": "Submit"}, "close": {"type": "plain_text", "text": "Cancel"}, # 你的模态框其他区块(类型、优先级、描述等)... } )
步骤2:在提交处理函数中获取用户ID并发送通知
修改handle_submission函数,从view的private_metadata中取出用户ID,然后调用Slack API发送通知:
@app.view("ticket_submission") def handle_submission(ack, body, client, view, logger): ack() # 必须先确认提交 # 从private_metadata取出用户ID user_id = view["private_metadata"] # 向用户发送工单发布通知 try: client.chat_postMessage( channel=user_id, text="✅ 你的工单已成功发布到Trello!" ) except Exception as e: logger.error(f"发送通知失败: {e}")
额外说明
如果你的模态框是通过按钮等交互式组件打开的,逻辑类似:在按钮点击的处理函数中获取body["user"]["id"],存入private_metadata后打开模态框即可。
内容的提问来源于stack exchange,提问作者tdug
相关产品推荐
相关产品推荐

