You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 13:45:24