首页 > 解决方案 > 将元数据/自定义数据附加到通过 API 发送的松弛消息

问题描述

我正在为我的工作区开发一系列 Slack 应用程序,其中一些旨在与其他应用程序传递的内容(消息)进行交互:提取其他消息可能引用的内容 ID

一个具体的例子:

假设我有一个应用程序“FindUser”,它能够在松弛用户类型时为我提供用户配置文件find me@example.com,并且它在线程中回复用户配置文件的格式化视图

我正在开发一个应用程序 B“EditTags”,它基本上为我提供了一个带有“编辑标签”的右键单击选项(请参阅 Slack 的交互式组件/操作),其想法是用户可以首先要求应用程序 A 查找用户,然后右键单击应用 A 的回复,然后单击其他应用给出的“编辑标签”操作。这个应用程序 B 的作用实际上是为来自应用程序 A 的上一条消息中提到的用户检索标签,并且在对线程的另一个回复中,它提供了一些控件来删除现有标签或显示带有自动完成功能的选择以添加新标签.

B 应用需要检索 A 应用之前提到的用户 ID。所以我需要一些方法来直接在松弛消息中传递这些数据。查看示例时,slack 似乎没有提供向消息添加任意“元数据”的方法,我错了吗?你有解决方法吗?我的意思是我可以完全在页脚中发送用户 ID,这样我就可以阅读页脚,但我打算将页脚用于其他用途......有没有办法通过隐藏的属性传递元数据给最终用户?

虽然这感觉不相关,但我正在使用node slack sdk(尤其是@slack/interactive-messages包)构建一个 slack nodeJS 应用程序

标签: slackslack-api

解决方案


在大多数情况下,Slack API 不提供任何官方方法将自定义数据/元数据附加到消息。但是通过一些简单的“黑客”,它仍然是可能的。方法如下:

方法

基本方法是使用消息的现有字段作为数据的容器。显然,您想选择一个不直接链接到 Slack 功能的字段。

某些字段并不总是需要,因此您可以将该字段用作数据容器。或者,如果需要,您可以将该字段的功能值与您的自定义数据一起包含在数据容器中。

例如,对于消息按钮,您可以使用按钮的value字段并以您在其原始功能中不需要它的方式构造您的代码。通常它足以知道用户客户端(通过name字段)是哪个按钮,因此该value字段可以免费用于您的自定义数据。或者,您可以在该字段的数据容器(例如 JSON 字符串)中包含按钮的功能值以及自定义数据。

序列化

所有消息都通过 HTTP 传输,并且大部分以 JSON 格式编码为 UTF-8。所以你想相应地序列化/反序列化你的数据,尤其是二进制数据。如果可能的话,我会推荐使用 JSON。

长度

大多数字段的最大允许长度记录在官方 Slack API 文档中。例如,value消息按钮字段最多可包含2.000 个字符。请记住,您需要考虑序列化后数据的长度。例如,如果您将二进制数据转换为 Base64 以便可以使用 HTTP 进行传输,那么您最终会得到每个字节大约 1.33 个字符

内容

一般来说,我建议您的数据容器尽可能小,不包括实际数据,而只包括 ID。以下是两种常见的方法:

  • 包括数据对象的 ID,并在稍后处理请求时从数据存储中加载实际对象。
  • 包括服务器会话的 ID,在处理请求时,您可以恢复包含所有数据对象的相应服务器会话。此外,您可能需要包含功能值,以便您使用的字段的功能仍然有效(例如,菜单选项的值,见下文)

执行

对话框

对话框为自定义数据提供了一个官方字段,称为state. 最多 3.000 个字符。

消息按钮

对于消息按钮,您可以使用消息操作字段 / value。最多 2.000 个字符。它也可以使用该name字段,但我建议不要这样做,因为该字段的最大允许长度没有记录。

消息菜单

对于消息菜单,您可以使用value选项name字段或菜单操作字段。

通常该value字段是更好的方法,因为您记录的最大长度为 2.000,它为您提供了更大的灵活性。但是,您需要将自定义数据与每个选项的实际功能值结合起来。此外,这不适用于您无法控制值字段的动态选择元素(如用户)。

使用name字段注释时,请记住name没有记录最大允许长度,因此您希望数据尽可能短。此外,如果您想在每个附件中使用多个菜单,则需要将菜单的实际名称包含在数据容器中。

普通邮件附件

普通消息附件不包含任何合适的字段用作自定义数据的容器,因为所有字段都链接到 Slack 功能。

从技术上讲,您可以使用该fallback字段,但前提是您 100% 确定您的应用程序从未在无法显示附件的客户端上使用。否则,您的数据将显示给用户。


推荐阅读