Logo
Section 1 / 3

发送消息

学习如何使用 Slack API 调用发送消息。

导入

发送消息

学习如何使用 Slack API 调用发送消息。

我们可以通过 Slack 应用发送多种类型的消息,包括普通消息、“me”消息(一种用于表示动作的特殊消息类型)以及定时消息。

本节课我们将学习以下三个端点:

  1. chat.meMessage:此端点向频道发送斜体的动作文本消息。
  2. chat.postMessage:此端点向频道发送消息。
  3. chat.scheduleMessage:此端点将消息安排在未来某个时间发送到频道。
...

发送 "me" 消息

我们从最简单的端点开始——https://slack.com/api/chat.meMessage。该端点允许我们将斜体的“me”消息发送到指定频道。此端点相对简单,没有可选参数。

### 请求参数

chat.meMessage 端点的一些重要查询参数如下:

参数类型分类描述
tokentoken必需认证令牌携带了使用不同 Slack 应用和 API 所需的权限范围。通常通过 HTTP Authorization 头或 POST 参数传递。
channelstring必需指定消息将发布的频道。可以是公开频道、私有群组或 IM 频道(直接消息)。该参数的值可以是编码后的 ID 或频道名称。
textstring必需要发送的消息内容。

让我们调用 chat.meMessage 端点。点击“运行”按钮,使用此端点发送一条“Hello World!”消息。

1import fetch from "node-fetch"; 2 3const url = "https://slack.com/api/chat.meMessage"; 4 5const headerParameters = { 6 Authorization: "Bearer {{TOKEN}}", 7 "Content-Type": "application/json; charset=UTF-8", 8}; 9 10const bodyParameters = JSON.stringify({ 11 channel: "{{CHANNEL_ID}}", 12 text: "Hello World!", 13}); 14 15const options = { 16 method: "POST", 17 headers: headerParameters, 18 body: bodyParameters, 19}; 20 21async function sendMeMessage() { 22 try { 23 const response = await fetch(url, options); 24 printResponse(response); 25 } catch (error) { 26 printError(error); 27 } 28} 29 30sendMeMessage();

让我们看看代码窗口中高亮的部分:

  • 第 3 行:我们指定了 chat.meMessage 端点的 URL。
  • 第 5–8 行:我们指定了请求头。
  • 第 10–13 行:我们指定了将传递给请求的 channel 和 text 参数,使用 channel 来指定频道 ID。
  • 第 15–19 行:我们定义了 API 调用的选项,指定请求类型为 POST,并提供请求头和请求体。
  • 第 21–28 行:我们定义了一个名为 sendMeMessage 的函数来发起 API 调用并打印响应。
    • 第 23–24 行:我们向 API 发起请求并打印 JSON 响应。
    • 第 26 行:我们捕获可能发生的任何错误并将其打印到控制台。
  • 第 30 行:我们调用了 sendMeMessage 函数。

运行上述代码后,我们应该能在添加应用的频道中看到一条“Hello World!”消息。该文本将以斜体显示,表明这是一条“me”消息。

...
代码窗口下方的预期输出

### 响应字段 除了发送到频道的消息外,API 还会向我们的 POST 请求返回一个 JSON 响应。成功请求的响应对象包含以下字段:

属性类型描述
okboolean布尔值,表示请求是否成功。
channelstring“me”消息发送的频道。
tsstring分享的“me”消息的 Unix 时间戳。

如果请求失败,响应中将包含一个 error 字段,说明出错原因。

发送消息

要发送消息,我们访问 https://slack.com/api/chat.postMessage 端点。与 chat.meMessage 不同,它支持发送附件、区块(blocks)和纯文本。我们可以使用此端点向公开频道、私有频道或 IM(直接消息)频道发送消息。

我们可以使用该端点在 Slack 上发送以下类型的消息:

  1. 附件(旧版):基于 JSON 的结构化附件数组,例如 "[{"pretext": "pre-hello", "text": "text-world"}]"。
  2. 区块(Blocks):基于 JSON 的结构化区块数组(一种用于发送更结构化和交互式消息的方式),例如 "[{"type": "section", "text": {"type": "plain_text", "text": "Hello world"}}]"。
  3. 纯文本:简单的文本内容,例如 "你好,来自 Slack!"。

可通过 此链接 探索 Slack 提供的区块构建器。

...
Slack 中的区块消息(左侧)及其结构(右侧)

### 请求参数

chat.postMessage 端点的一些重要查询参数如下:

参数类型分类描述
tokentoken必需认证令牌携带了使用不同 Slack 应用和 API 所需的权限范围。通常通过 HTTP Authorization 头传递,也可作为 POST 参数发送。
channelstring必需指定消息将发布的频道。可以是公开频道、私有群组或 IM 频道(直接消息)。该参数的值可以是编码后的 ID 或频道名称。
blocks/attachments/textstring必需三者中任一参数必须提供作为消息内容。若包含 attachments 或 blocks,则 text 仅用于通知显示。
mrkdwnboolean可选默认为 true,可设为 false 以禁用 Slack 的标记语言解析。
thread_tsstring可选提供另一条消息的时间戳(ts 是已发送消息的时间戳),使当前消息成为回复。避免使用回复消息的时间戳(ts),应使用其父消息的时间戳。

在下面两个代码窗口中,我们将先发送一条区块消息,然后从响应中提取时间戳 ts,并在第二个代码窗口中使用它来发送回复。

...
下方两个代码窗口的预期输出

让我们调用 chat.postMessage 端点。点击“运行”按钮,向频道发送一条包含区块的消息。

1import fetch from "node-fetch"; 2 3const url = "https://slack.com/api/chat.postMessage"; 4 5const headerParameters = { 6 Authorization: "Bearer {{TOKEN}}", 7 "Content-Type": "application/json; charset=UTF-8", 8}; 9 10const bodyParameters = JSON.stringify({ 11 channel: "{{CHANNEL_ID}}", 12 blocks: [ 13 { 14 type: "section", 15 text: { 16 type: "mrkdwn", 17 text: "你有一个新请求:\n*<exampleEmployeeLink.com | 安迪·布朗 - 新设备申请>*", 18 }, 19 }, 20 { 21 type: "section", 22 fields: [ 23 { 24 type: "mrkdwn", 25 text: "*类型:*\n ...", 26 }, 27 { 28 type: "mrkdwn", 29 text: "*时间:*\n ...", 30 }, 31 { 32 type: "mrkdwn", 33 text: "*最后更新:*\n ...", 34 }, 35 { 36 type: "mrkdwn", 37 text: "*原因:*\n ... ", 38 }, 39 { 40 type: "mrkdwn", 41 text: "*规格:*\n ...", 42 }, 43 ], 44 }, 45 ], 46}); 47 48const options = { 49 method: "POST", 50 headers: headerParameters, 51 body: bodyParameters, 52}; 53 54async function sendMessage() { 55 try { 56 const response = await fetch(url, options); 57 printResponse(response); 58 } catch (error) { 59 printError(error); 60 } 61} 62 63sendMessage();

点击“运行”按钮,调用相同端点但使用不同的可选参数。这次我们使用上方代码窗口中发送消息的响应提取的时间戳 ts。

1import fetch from "node-fetch"; 2 3const url = "https://slack.com/api/chat.postMessage"; 4 5const headerParameters = { 6 Authorization: "Bearer {{TOKEN}}", 7 "Content-Type": "application/json; charset=UTF-8", 8}; 9 10const bodyParameters = JSON.stringify({ 11 thread_ts: "{{TS}}", 12 reply_broadcast: true, 13 channel: "{{CHANNEL_ID}}", 14 text: "回复上一条消息!!", 15}); 16 17const options = { 18 method: "POST", 19 headers: headerParameters, 20 body: bodyParameters, 21}; 22 23async function sendMessageReply() { 24 try { 25 const response = await fetch(url, options); 26 printResponse(response); 27 } catch (error) { 28 printError(error); 29 } 30} 31 32sendMessageReply();

### 响应字段 `chat.postMessage` 端点的工作方式与第一个代码窗口中的 `chat.meMessage` 类似,但响应可能有所不同。这些响应取决于请求中发送的可选参数。典型的成功响应与 `chat.meMessage` 的响应相同,额外包含一个 `message` 属性,其中包含消息内容。

注意:访问 此 课程查看 message 对象的详细信息。

在第二个代码窗口中,我们使用提取的时间戳 ts 和可选参数,通过 chat.postMessage 端点回复消息。

定时发送消息

要定时发送消息,我们访问 https://slack.com/api/chat.scheduleMessage 端点。该方法可将消息安排在未来指定时间发送至公开频道、私有频道和 IM 频道。

### 请求参数

chat.scheduleMessage 端点的一些重要查询参数如下:

参数类型分类描述
tokentoken必需认证令牌携带了使用不同 Slack 应用和 API 所需的权限范围。通常通过 HTTP Authorization 头或 POST 参数传递。
channelstring必需指定消息将发布的频道。可以是公开频道、私有群组或 IM 频道(直接消息)。该参数的值可以是编码后的 ID 或频道名称。
textstring必需要发送的消息内容。
post_atstring必需指定未来发送消息的 Unix EPOCH 时间戳。

让我们调用 chat.scheduleMessage 端点。点击“运行”按钮,将消息安排在一分钟后发送。

1import fetch from "node-fetch"; 2 3const url = "https://slack.com/api/chat.scheduleMessage"; 4 5const headerParameters = { 6 Authorization: "Bearer {{TOKEN}}", 7 "Content-Type": "application/json; charset=UTF-8", 8}; 9 10let epochTime = Math.floor(Date.now() / 1000); 11 12const bodyParameters = JSON.stringify({ 13 channel: "{{CHANNEL_ID}}", 14 text: "Hello World! - 一分钟后来到频道", 15 post_at: epochTime + 60, 16}); 17 18const options = { 19 method: "POST", 20 headers: headerParameters, 21 body: bodyParameters, 22}; 23 24async function scheduleMessage() { 25 try { 26 const response = await fetch(url, options); 27 printResponse(response); 28 } catch (error) { 29 printError(error); 30 } 31} 32 33scheduleMessage();

此端点调用与之前的调用类似,但在此情况下,我们还使用内置的 Date 类获取 Unix 时间戳。

  • 第 10 行:我们使用 Date.now() 方法获取当前的 Unix 时间戳(整数形式)。
  • 第 15 行:我们将当前 Unix 时间戳增加一分钟(60 秒)。

### 响应字段 `chat.scheduleMessage` 端点的成功响应包含以下属性:

属性类型描述
okboolean布尔值,表示请求是否成功。
channelstring消息发送的频道。
scheduled_message_idstring定时消息的唯一 ID。
post_atstring消息发送时间的 Unix 时间戳。
messagestring定时消息的详细信息。

简介

更新消息和列出计划消息