将元数据/自定义数据附加到通过API发送的备用消息上

时间:2018-12-27 23:08:06

标签: slack slack-api

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

一个具体示例:

假设我有一个应用程序“ FindUser”,当一个闲散的用户键入find me@example.com时,该应用程序能够为我提供用户个人资料,并且在线程中以用户个人资料的格式化视图进行回复

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

B应用程序需要检索A应用程序先前提到的用户ID。因此,我需要某种方式直接在松弛消息中传递该数据。在查看示例时,松弛似乎没有提供向邮件添加任意“元数据”的方法,我错了吗? 您有解决此问题的方法吗?我的意思是说我可以完全在页脚中发送用户ID,例如,所以我可以读取页脚,但是我打算将页脚用于其他内容...有没有办法通过隐藏的元数据传递属性到最终用户?

尽管这并不相关,但我正在使用node slack sdk(尤其是@slack/interactive-messages包)构建一个松散的nodeJS应用

1 个答案:

答案 0 :(得分:4)

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

方法

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

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

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

序列化

所有消息均通过HTTP传输,并且大多数都以JSON编码为UTF-8。因此,您要相应地对数据进行序列化/反序列化,尤其是在二进制数据的情况下。如果可能的话,我建议使用JSON。

长度

大多数字段的最大允许长度记录在官方的Slack API文档中。例如消息按钮的value字段中最多可以包含2.000 characters。请记住,您需要考虑序列化后的数据长度。例如如果将二进制数据转换为Base64以便可以通过HTTP进行传输,则最终结果约为1.33 characters for every byte

内容

通常,我建议您将数据容器保持尽可能小,不包含实际数据,而仅包含ID。这是两种常见方法:

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

实施

对话框

Dialogs提供了一个自定义数据的官方字段,称为state。最多3.000个字符。

消息按钮

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

消息菜单

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

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

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

普通邮件附件

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

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