将元数据/自定义数据附加到通过 API 发送的松弛消息

Attach meta data / custom data to slack messages sent through the API

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

一个具体的例子:

假设我有一个应用程序 A "FindUser",它能够在闲散用户键入 find me@example.com 时为我提供用户配置文件,并在线程中回复用户配置文件的格式化视图

我正在开发一个应用程序 B "EditTags",它基本上为我提供了一个带有 "edit tags" 的右键单击选项(参见 Slack 的交互 Components/Actions),其想法是用户可以首先让app A找一个用户,然后在app A的回复上右击,点击对方app给出的"edit tags"动作。这个应用程序 B 做了什么,它实际上检索了来自应用程序 A 的先前消息中提到的用户的标签,并且在对该线程的另一个回复中,它提供了一些控件来删除现有标签或者它显示 select 自动完成添加新标签。

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

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

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

方法

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

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

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

序列化

所有消息都通过 HTTP 传输,并且大部分在 JSON 中编码为 UTF-8。所以你想相应地序列化/反序列化你的数据,特别是如果它是二进制数据。如果可能的话,我建议使用 JSON.

长度

大多数字段的最大允许长度记录在官方 Slack API 文档中。例如消息按钮的 value 字段最多可以包含 2.000 characters. Keep in mind that you need to consider the length of your data after serialization. e.g. if you convert binary data into Base64 so it can be transported with HTTP you will end up with about 1.33 characters for every byte.

内容

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

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

实施

对话框

Dialogs provide an official field for custom data called state。最多 3.000 个字符。

消息按钮

Message buttons you can use the message action fields / value。最多 2.000 个字符。也可以使用 name 字段,但我建议不要这样做,因为没有记录该字段的最大允许长度。

消息菜单

对于菜单操作的 Message menus you can use the value field of an option or the name 字段。

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

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

普通邮件附件

正常 message attachments 不包含任何适合用作自定义数据容器的字段,因为所有字段都链接到 Slack 功能。

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