如何通过Slack modal自动触发交互为原消息添加用户选择的关键词
Slack 关键词自动标注功能实现方案
疑问解答
疑问1:仅通过消息监听触发modal是否可行
是的,该方案不可行。Slack 所有 modal 唤起操作必须携带有效期3秒、仅可使用一次的trigger_id参数,该参数仅会在用户主动交互场景(按钮点击、菜单选择、slash command调用等)的回调 payload 中返回。单纯监听用户消息的 Events API 事件不会返回trigger_id,属于平台安全限制,无法绕过。
疑问2:ephemeral message 流程中参数处理说明
先明确两个核心参数的作用:
trigger_id:仅用于唤起modal,仅用户主动交互的回调会返回,过期即失效response_url:有效期5分钟,可多次调用,支持发送/更新/删除ephemeral message、向频道发送公开消息,同样仅用户主动交互的回调会返回
你之前遇到的无法删除ephemeral message、无法写入频道内容的问题,本质是没有获取到合法的response_url,必须通过用户交互的回调获取该参数后才能执行对应操作。
推荐实现流程
你可以通过「自动推送带交互组件的ephemeral message + 用户触发后更新原消息」的路径实现需求,具体步骤如下:
- 开启Slack app的Events API能力,订阅对应场景的消息事件(公开频道订阅
message.channels、私有频道订阅message.groups),获取用户发送的所有消息内容 - 当监听到符合触发规则的用户消息(如携带URL、代码片段)时,调用
chat.postEphemeral接口,向消息发送者推送仅其可见的交互消息,可选两种交互形式:- 形式1:仅放一个「选择关键词」按钮,用户点击后唤起modal放多选关键词组件,适合关键词选项较多的场景
- 形式2:直接在ephemeral message中嵌入关键词多选组件,适合选项较少的场景
- 开启Slack app的「Interactivity & Shortcuts」能力,配置交互回调地址,接收用户点击按钮/提交多选组件的回调payload
- 接收交互回调后按场景处理:
- 若用按钮+modal方案:拿到回调中的
trigger_id,调用views.open接口唤起modal,同时把原消息的频道ID、消息唯一标识ts存入modal的private_metadata字段,方便后续定位原消息;用户提交modal后拿到选择的关键词,调用chat.update接口更新原消息即可 - 若用直接嵌入多选组件方案:拿到回调中用户选择的关键词,先通过回调返回的
response_url发送参数为{"delete_original": true}的POST请求删除已发送的ephemeral message,再调用chat.update接口更新原消息
- 若用按钮+modal方案:拿到回调中的
内容的提问来源于stack exchange,提问作者Julien.h
相关产品推荐
相关产品推荐

