如何创建包含上传图像的 Slack 消息?

T-R*_*gex 10 php slack-api slack

我想通过 PHP 脚本在我的 Slackspace 的 #general 频道中创建一条消息。该消息应包含文本和本地即时创建的图像。

我已经创建了一个应用程序,生成了一个不记名令牌,并设法创建了一条纯文本消息也作为图像上传。

但我不知道如何在一条消息中创建两者,因为上面的过程创建了两条消息,一条带有文本,另一条带有图像。

Eri*_*ken 11

关于如何发布带有图像的 Slack 消息,有两种不同的方法。

A. 直接用留言上传图片

您可以将图像直接上传到 Slack 并在频道中共享。在该请求中,您还可以添加将作为消息显示在图像上方的评论。这是最简单的方法,但是您的评论仅限于一个字符串。

API 方法:files.upload使用这些参数:

  • channels:图像出现的一个或多个通道的ID
  • initial_comment: 您的留言

B. 发布带有图像块/附件的消息

或者,您可以将图像作为图像块或辅助附件添加到普通邮件中。这仅适用于您的图像文件的公共 URL,因此您首先需要将图像上传到图像托管商(可以是您的 Slack 工作区)以获取公共 URL。

在我们的示例中,我们将使用 Slack 作为图像托管,但您可以使用任何图像托管(例如Imgur)甚至您自己的网络服务器,只要您获得图像文件的公共 URL。

第 1 步 - 将图像上传到 Slack

API 方法:files.upload没有特殊参数,但确保从响应中获取文件 ID。不要包含channels参数,否则图像将在这些频道中可见。

第 2 步 - 创建公共 URL

接下来,您必须将上传的文件标记为公开。只有这样才能通过其 public_url 属性访问它

API方法:files.sharedPublicURL以文件ID为参数。

接下来,您需要构建从链接到permalink_public文件的网站/属性的直接图像链接。

您从中获得的网站链接permalink_public具有以下格式:

https://slack-files.com/{team_id}-{file_id}-{pub_secret}
Run Code Online (Sandbox Code Playgroud)

图像的直接链接格式为:

https://files.slack.com/files-pri/{team_id}-{file_id}/{filename}?pub_secret={pub_secret}
Run Code Online (Sandbox Code Playgroud)

因此,您只需要提取pub_secretfrompermalink_public并且您应该能够构建到图像的直接链接。您可以从文件对象中获取的其他参数。

第 3 步 - 发送消息

最后使用图像 URL 作为图像块辅助附件撰写您的消息,并使用您选择的方法提交。

API 方法:chat.PostMessage或任何其他发送消息的方法,包括。传入的网络钩子。

对 OP 的回答

如果您需要坚持使用从您的评论中显示出来的 webhooks 并且无法访问 Slack API,我建议您将图像上传到图像托管商(例如 Imgur),然后使用方法 B。

也可以看看


小智 5

经过多次修改,我发现虽然我无法使用 API 同时创建消息和上传图像,但我可以先上传图像,然后在返回时间戳的情况下,使用更新消息将文本添加到带有图像的原始消息中上传。

这是流程:

1-使用files_upload方法将图像上传到我的频道(使用频道名称)

            response = client.files_upload(
            channels=my_channel_name,
            file=image_path,
            initial_comment='My initial comment'
            )
Run Code Online (Sandbox Code Playgroud)

2- 从 files_upload 获取响应并提取消息的通道 ID 和时间戳。

channel_id = response['file']['groups'][0]
ts = response['file']['shares']['private'][channel_id][0]['ts']
Run Code Online (Sandbox Code Playgroud)

3- 使用聊天更新将文本或丰富内容添加到带有上传图像的消息中:

       response = client.chat_update(
            channel=channel_id,
            text="My Message",
            ts=ts,
            blocks=blocks_list
        )
Run Code Online (Sandbox Code Playgroud)