如何通过Slack API删除频道中触发slash command的原消息?
如何让Slack Slash Command替换用户的原始触发消息
我帮你搞定这个问题!你想要实现类似/giphy的效果——用户发完命令后,原始消息消失,只留下你的响应内容。Slack的slash command本身没有直接的参数支持这个功能,但通过几个API调用就能实现,步骤如下:
1. 先给你的App加对权限
首先得确保你的Slack App有足够的操作权限,去App管理后台的OAuth & Permissions页面,添加这些Bot Token Scopes:
chat:write:允许bot发送、删除消息chat:write.public(可选):如果要在公开频道生效,私有频道只需要上面的chat:writeconversations.history:允许获取频道的消息历史,用来定位用户发的那条命令消息
加完权限记得重新把App安装到工作区,拿到最新的Bot Token。
2. 找到用户原始命令消息的时间戳(TS)
当用户触发你的slash command时,Slack会给你的服务发一个POST请求,里面带着channel_id(频道ID)和user_id(用户ID)。你需要用这两个参数调用conversations.history API,获取该用户在这个频道里的最新一条消息——也就是那条slash command的消息,拿到它的ts(时间戳)。
举个Python的例子:
import requests import time SLACK_BOT_TOKEN = "xoxb-你的BotToken" # 从Slack发送的slash command请求里取到下面两个值 CHANNEL_ID = request.form.get("channel_id") USER_ID = request.form.get("user_id") # 稍微等一下,确保Slack已经记录了这条消息 time.sleep(0.5) # 调用API获取最新消息 history_response = requests.get( "https://slack.com/api/conversations.history", headers={"Authorization": f"Bearer {SLACK_BOT_TOKEN}"}, params={"channel": CHANNEL_ID, "user": USER_ID, "limit": 1} ) history_data = history_response.json() original_ts = history_data["messages"][0]["ts"]
3. 删除原始的命令消息
拿到original_ts后,调用chat.delete API把那条命令消息删掉:
delete_response = requests.post( "https://slack.com/api/chat.delete", headers={"Authorization": f"Bearer {SLACK_BOT_TOKEN}"}, json={"channel": CHANNEL_ID, "ts": original_ts} )
4. 发送你的响应内容
最后,用chat.postMessage API把你的查询结果发送到频道里就好了:
response_message = "这是你要的查询结果!" post_response = requests.post( "https://slack.com/api/chat.postMessage", headers={"Authorization": f"Bearer {SLACK_BOT_TOKEN}"}, json={"channel": CHANNEL_ID, "text": response_message} )
一些小提醒
- 加个短暂的等待(比如0.5秒)很重要,不然可能Slack还没把用户的命令消息存入历史,你就去查,会找不到。
- 也可以先发送响应再删原始消息,用户体验上差别不大,最后都会只看到你的响应。
- 要是遇到API报错,先检查Bot Token的权限有没有加对,或者频道是不是公开/私有对应的权限没配全。
这样操作后,频道里就只会留下你的响应,原始的slash command消息会被彻底删掉,完美实现你想要的效果!
内容的提问来源于stack exchange,提问作者Steve Mason
相关产品推荐
相关产品推荐

