【问题标题】:How to remove Ephemeral Messages如何删除临时消息
【发布时间】:2017-11-26 13:38:36
【问题描述】:

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

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

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

编辑更多细节:

关于使用 response_url 和 postEphemeral 状态的文档

当您使用 chat.update 或 replace_original 替换消息时 选项,您不能将消息的类型从短暂更改为 in_channel。消息发出后,将保留其 生活的可见性质量。

消息指南建议:

如果用户启动了包含多个步骤的操作,则这些步骤 应显示为仅对该用户可见的临时消息,直到 整个动作完成,以避免混乱的通道 大家。

大概,我应该能够创建一个交互,在该交互中我首先发送一条 in_channel 交互消息。

  • 当用户启动操作时,我应该能够使用response_url 并传递response_type: 'ephemeral'replace_original: false 向他们发送一系列临时消息?
  • 以这种方式创建的新的临时交互消息将有自己的response_url 用于进行编辑,对吧?
  • 通过临时消息完成交互流程后,我可以使用其原始 response_url 修改原始交互消息吗?
  • 最后,我如何摆脱最后的临时编辑?还是我只是将其更改为“工作流程已完成”之类的内容并希望获得最好的结果?我之所以问,是因为 Slash 命令显然似乎有一种方法可以从本质上将临时消息替换为 in_channel 消息,而我正在尝试弄清楚这种工作流程。

【问题讨论】:

    标签: slack-api


    【解决方案1】:

    我到处搜索如何做到这一点,终于找到了答案。

    1. 您的短暂消息必须触发一个动作,即按钮点击。
    2. 您对操作的响应必须使用以下正文

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

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

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

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

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

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

    【讨论】:

    • 这对我来说是关键。谢谢!
    • 删除临时消息后,您是如何在频道中发布新消息的?
    【解决方案2】:

    一些短暂的消息可以“软”删除/替换,但只有在作为带有按钮或菜单等交互功能的消息的一部分发布时。当单击按钮或进行菜单选择时,您有机会指示 Slack 要么“删除”原始消息,要么将其替换为新消息。 These docs 详细说明使用响应和 response_url 来完成此操作。

    使用chat.postEphemeral 创建且本身没有交互功能的消息永远不能被显式删除。一旦交付,它就像一个幽灵,会在重启或刷新后消失。

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

    • 正确,您实质上是使用您发布给该用户的全新临时消息启动了一个新的交互链
    • 每条交互消息交互都有自己的响应 URL。在最终用户按下按钮、选择菜单项等之前,新的临时消息不会包含您可以使用的 response_url
    • response_url 最终会过期(“使用response_url,您的应用程序可以在操作调用的 30 分钟内继续与用户交互最多 5 次。”)如果原始消息是非短暂的,则使用 chat.update 是更长的时间线更好的策略。对于短暂的消息,它更像是一种“尽力而为”的策略。它们最终会在刷新后为用户清理。
    • 我认为你对什么是最好的有很好的把握。就个人而言,我认为通过使用chat.postMessage 而不是直接从斜杠命令或交互中直接作为连锁效应来启动新的“in_channel”消息更容易。

    【讨论】:

    • 谢谢。 “软”删除是我被捆绑的地方。我在文档中看到了这个花絮:“当您使用 chat.update 或 replace_original 选项替换消息时,您无法将消息的类型从 ephemeral 更改为 in_channel。一旦发出消息,它将终生保持其可见性质量。”并且消息指南说“如果用户启动了一个包含多个步骤的操作,则这些步骤应显示为仅对该用户可见的短暂消息,直到整个操作完成,以避免混乱每个人的频道。”
    • 如果我对文档的解释是正确的 ^,它表示我可能有一条对整个频道可见的交互式消息。当用户与消息交互时,我会通过临时消息发送更多步骤。 (1) 我使用 response_url 根据您引用的文档发送这些消息,将 response_type 设置为 ephemeral 并将 replace_original 设置为 false。与新的临时消息的任何交互都将返回其自己的 response_url,对吗? (2)一旦交互完成,我想修改原始消息。将使用第一个 response_url 这个。我最后的短暂消息仍然存在,对吧?
    • 在我的 q 中进行了一系列编辑以捕获这些内容。谢谢!
    • 希望能回答问题!你在这一切上都走在了正确的轨道上。
    • 这里最后一步是怎么实现的?如果你有一个交互式的短暂消息,比如一个按钮,我们如何将它换成频道中的帖子?
    【解决方案3】:

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

    
    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()
       }
    }
    

    【讨论】:

      【解决方案4】:

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

      from flask import jsonify
      
      response = jsonify({
          'response_type': 'ephemeral', 
          'text': '', 
          'replace_original': 'true',
          'delete_original':'true'
          })
      
      return make_response(response, 200)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-07-26
        • 2011-03-11
        • 1970-01-01
        • 2018-11-13
        • 1970-01-01
        • 2021-05-28
        • 1970-01-01
        相关资源
        最近更新 更多