Slack Bolt for Python如何监听message_deleted消息删除事件
问题根因
你在Bot Events、Workspace Events的可选事件列表里找不到message_deleted是正常现象:Slack并没有将消息删除作为独立事件开放订阅,所有消息类变更(包括删除、编辑、线程回复等)都归属于message主事件类型,通过事件payload里的subtype字段区分具体行为。
你之前写的@app.event("message_deleted")监听器完全不触发,本质是Slack从来不会推送事件类型为message_deleted的请求,装饰器自然匹配不到任何推送。
正确实现步骤
- 进入Slack应用的Event Subscriptions配置页,在Bot Events分类下订阅对应范围的消息事件:
- 公开频道消息:订阅
message.channels - 私有频道消息:额外订阅
message.groups - 私信消息:额外订阅
message.im
保存配置后,必须重新将应用安装到工作区,新增的事件权限才会生效。
- 公开频道消息:订阅
- 将事件监听器改为监听
message主事件,在内部逻辑中过滤出subtype为message_deleted的事件即可,参考代码:
@app.event("message") async def handle_message_events(body, logger): event_data = body.get("event", {}) # 过滤消息删除事件 if event_data.get("subtype") == "message_deleted": deleted_channel = event_data.get("channel") deleted_message_ts = event_data.get("deleted_ts") logger.info(f"检测到频道 {deleted_channel} 内的消息 {deleted_message_ts} 被删除") # 若要判断是否为应用自身发送的消息,可提前将应用发信成功返回的ts、channelID存在本地缓存/数据库,在这里做比对即可
注意: 使用Bolt for Python时不需要在事件处理函数里手动调用ack(),框架会自动在Slack要求的3秒窗口期内返回接收确认,手动调用ack()反而可能触发重复响应报错。
自发布消息删除检测的补充说明
如果仅需要检测应用自身发布的消息被删除的场景,不需要申请额外权限:只要你订阅了对应频道范围的message事件,应用自己发出的消息被删除时,你一定会收到带message_deleted子类型的事件推送。你只需要在应用发送消息成功时,把返回的消息唯一标识ts和对应频道ID做持久化存储,收到删除事件时比对deleted_ts和频道ID,就能精准命中目标场景。
内容的提问来源于stack exchange,提问作者soapergem
相关产品推荐
相关产品推荐

