如何删除临时消息

How to remove Ephemeral Messages

我正在尝试找出一种机制来 post 向用户发送一条临时消息,然后将其删除并替换为所有人都可以看到的消息。与 giphy 类似的行为,其中 Slash 命令显示交互式临时消息并在用户决定发送哪个 gif 后创建频道消息。我也很好奇更新临时消息。如果我们使用交互式临时消息,我认为这可以通过 response_url 完成。

我最初认为我只是使用 chat.postEphemeral 创建一个临时消息,然后在其上调用 chat.delete,但似乎 chat.delete 和 chat.update 不能在使用 chat.postEphemeral.

创建的消息上调用

Slack 消息指南似乎建议多步交互流程应始终以短暂的方式处理,以便其他渠道用户不会在结果之前看到所有中间消息,但我运气不好完成后如何摆脱短暂的。可能只是不擅长阅读,但感谢您的帮助。

编辑更多细节:

关于使用 response_url 和 post 短暂状态的文档

As you replace messages using chat.update or the replace_original option, you cannot change a message's type from ephemeral to in_channel. Once a message has been issued, it will retain its visibility quality for life.

消息指南建议:

If a user has initiated an action that has multiple steps, those steps should be shown as ephemeral messages visible only to that user until the entire action is complete to avoid cluttering the channel for everyone.

据推测,我应该能够创建一个交互,其中我首先发送一条 in_channel 交互消息。

一些临时消息可以 "soft" deleted/replaced 但只有当 post 作为具有按钮或菜单等交互功能的消息的一部分时。单击按钮或选择菜单时,您有机会指示 Slack 要么 "delete" 原始消息,要么用新消息替换它。 These docs 使用响应的详细信息和 response_url 来实现这一点。

使用 chat.postEphemeral 创建的消息本身没有交互功能,永远无法明确删除。交付后如幽灵一般,重启或刷新后即消失

按顺序回答带项目符号的问题:

  • 正确,您实际上是通过您 post 向该用户
  • 发送的新的短暂消息开始了一个新的交互链
  • 每条互动消息互动 都会有自己的回复URL。在最终用户按下按钮、选择菜单项等之前,您可以使用新的临时消息 response_url
  • response_url 最终会过期 ("using the response_url, your app can continue interacting with users up to 5 times within 30 minutes of the action invocation.") 如果原始消息不是临时消息,使用 chat.update 是更长时间线的更好策略。对于临时消息,它更像是一种 "do your best" 策略。它们最终会在刷新后为用户清理干净。
  • 我认为你对什么是最好的有很好的把握。就我个人而言,我认为通过使用 chat.postMessage 而不是直接从斜线命令或交互作为连锁效应来启动新的 "in_channel" 消息更容易。

我到处搜索如何执行此操作,终于找到了答案。

  1. 您的临时消息必须触发一个动作,即点击按钮。
  2. 您对操作的回复必须使用以下正文

    {
        'response_type': 'ephemeral',
        'text': '',
        'replace_original': true,
        'delete_original': true
    }
    

'delete_original': true 是这里的关键,据我所知,在任何 API 指南中都没有提到它,但是它存在于 API field guide 下的 Top-level message fields

如果您希望更改消息的 response_type 而不是删除它,您必须先删除临时消息,然后使用 'response_type': 'in_channel' 发布相同的消息。

在我的用例中,我想获取一条临时消息并使用与频道内消息完全相同的消息正文重新发布它。我还没有找到一种方法来检索您的临时消息的内容,所以我发现的最好方法是在按钮的 value 中传递任何必要的数据来生成您的临时消息,以便您的操作处理程序可以读取此数据并动态重新创建邮件正文。

在我的例子中,这是用于执行查询的用户输入。如果数据库中的数据在发布原始临时消息和发布频道内版本之间发生变化,它们将有所不同。 您可以直接通过此 value 字段发送 JSON 字符串,避免进行额外的数据库调用和 运行 发布到频道时消息发生变化的风险。 value 的字符数限制为 2000,因此 JSON 通过极其有限。

假设您在最初创建临时消息时以及在频道内重新创建它时使用相同的代码生成此正文,您应该会收到相同的正文并且基本上能够将临时消息更改为频道内消息.

如果您使用的是 Python 和 Flask,当您响应短暂消息中的按钮单击时,以下代码应该可以工作:

from flask import jsonify

response = jsonify({
    'response_type': 'ephemeral', 
    'text': '', 
    'replace_original': 'true',
    'delete_original':'true'
    })

return make_response(response, 200)

此解决方案的 Kotlin/Java 版本使用 Bolt API,如下所示


import com.slack.api.bolt.handler.builtin.BlockActionHandler
import com.slack.api.bolt.request.builtin.BlockActionRequest
import com.slack.api.app_backend.interactive_components.response.ActionResponse
import com.slack.api.bolt.response.Response
import com.slack.api.bolt.context.builtin.ActionContext

object Handler : BlockActionHandler {

   override fun apply(req: BlockActionRequest,
                      context: ActionContext): Response {
            val response = ActionResponse
                                 .builder()
                                 .deleteOriginal(true)
                                 .replaceOriginal(true)
                                 .responseType("ephemeral")
                                 .blocks(listOf())
                                 .text("")
                                 .build()
            context.respond(response)
            return context.ack()
   }
}