Logo
Section 1 / 3

发送消息

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

导入

发送消息

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

概述

我们可以使用 Slack 应用程序自动向频道发送每日消息,或向同事发送笑话。我们通过 Slack 的 Chat API 实现这一功能。

本课程将介绍以下三个端点:

  1. chat.meMessage:此端点向频道发送斜体的“me”类型动作消息。
  2. chat.postMessage:此端点向频道发送消息。
  3. chat.scheduleMessage:此端点用于在未来某个时间点向频道发送消息。

发送“me”消息

我们首先从最简单的端点开始——https://slack.com/api/chat.meMessage。该端点允许我们向指定频道发送斜体的“me”消息。“me”消息是一种用于表示动作的消息类型。

chat.meMessage 端点的关键查询参数如下:

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

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

...
下方代码组件的预期输出

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

1import requests 2import json 3 4url = "https://slack.com/api/chat.meMessage" 5data = { 6 'channel':'{{CHANNEL_ID}}', 7 'text':'Hello World!' 8} 9headers = { 10 'Authorization': 'Bearer {{TOKEN}}', 11 'Content-Type': 'application/x-www-form-urlencoded' 12} 13 14response = requests.post(url, headers=headers, params=data) 15print(json.dumps(response.json(), indent=4))
  • 第 1–2 行:导入 Python 的 requests 和 JSON 模块。
  • 第 4 行:指定目标端点的 URL。
  • 第 5–8 行:指定将传递给 post 函数的 channel 和 text 参数。使用 channel 指定频道 ID。
  • 第 9–12 行:指定 POST 请求的请求头。
  • 第 14 行:将所有已定义的参数打包并发送 POST 请求。
  • 第 15 行:使用 print 命令打印存储的 response 变量。由于响应为 JSON 格式,因此使用 .json() 和 json.dumps 进行格式化查看。

发送消息

要发送消息,请访问 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. 纯文本:简单文本内容,如 "Hey, from PageFlux!"。

可通过 此链接 探索 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,并在第二个组件中用它来发送回复。

...
下方两个代码组件的预期输出

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

1import requests 2import json 3 4url = "https://slack.com/api/chat.postMessage" 5data = { 6 'channel':'{{CHANNEL_ID}}', 7 "blocks": '''[ 8 { 9 "type": "section", 10 "text": { 11 "type": "mrkdwn", 12 "text": "You have a new request:\n*<exampleEmployeeLink.com | Andy Brown - New device request>*" 13 } 14 }, 15 { 16 "type": "section", 17 "fields": [ 18 { 19 "type": "mrkdwn", 20 "text": "*Type:*\n ..." 21 }, 22 { 23 "type": "mrkdwn", 24 "text": "*When:*\n ..." 25 }, 26 { 27 "type": "mrkdwn", 28 "text": "*Last Update:*\n ..." 29 }, 30 { 31 "type": "mrkdwn", 32 "text": "*Reason:*\n ... " 33 }, 34 { 35 "type": "mrkdwn", 36 "text": "*Specification:*\n ..." 37 } 38 ] 39 } 40 ]''' 41} 42headers = { 43 'Authorization': 'Bearer {{TOKEN}}', 44 'Content-Type': 'application/x-www-form-urlencoded', 45} 46 47response = requests.get(url, headers=headers, params=data) 48print(json.dumps(response.json(), indent=4))

点击“运行”按钮,调用相同端点并传入不同的可选参数。这次我们使用上方代码组件中提取的时间戳 ts。

1import requests 2import json 3 4url = "https://slack.com/api/chat.postMessage" 5data = { 6 'thread_ts':'{{ts}}', 7 'reply_broadcast':'true', 8 'channel':'{{CHANNEL_ID}}', 9 'text':'Replying to the previous message!!' 10} 11headers = { 12 'Authorization': 'Bearer {{TOKEN}}', 13 'Content-Type': 'application/x-www-form-urlencoded', 14} 15 16response = requests.get(url, headers=headers, params=data) 17print(json.dumps(response.json(), indent=4))

chat.postMessage 端点的工作方式与第一个代码组件中的 chat.meMessage 类似,但其响应可能因请求中携带的可选参数而有所不同。在第二个代码组件中,我们使用提取出的时间戳 ts,并通过可选参数实现对前一条消息的回复。

定时发送消息

要定时发送消息,请使用 https://slack.com/api/chat.scheduleMessage 端点。该方法可在未来指定时间向公开频道、私有频道或直接消息(IM)频道发送消息。

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

参数类型必填描述
tokentoken必填认证令牌携带了控制不同 Slack 应用和 API 使用权限的所需作用域。通常以 HTTP Authorization 头或 POST 参数形式传递。
channelstring必填指定消息要发布的频道。可以是公开频道、私有群组或直接消息(IM)频道。该参数值可以是编码后的 ID 或频道名称。
textstring必填要发送的消息文本。
post_atstring必填指定未来 Unix 时间戳(秒级),用于确定消息发送时间。

调用 chat.scheduleMessage 端点。点击“运行”按钮,将消息设置为一分钟之后发送。

1import requests 2import json 3import time 4 5epoch_time = int(time.time()) 6 7url = "https://slack.com/api/chat.scheduleMessage" 8headers = { 9 'Authorization': 'Bearer {{TOKEN}}', 10 'Content-Type': 'application/x-www-form-urlencoded', 11} 12data = { 13 'channel':'{{CHANNEL_ID}}', 14 'text':'Hello World! - sent to the channel after 1 minute', 15 'post_at':str(epoch_time+(60*1)) 16} 17 18response = requests.get(url, headers=headers, params=data) 19print("Response: ",json.dumps(response.json(), indent=4))

该端点调用方式与之前的请求类似,但此处我们还使用 time 模块指定了 Unix 时间戳。

  • 第 5 行:使用 time 模块的 time() 函数获取当前的 Unix 时间戳(整数形式)。
  • 第 15 行:在当前时间戳基础上增加一分钟(60 秒),并将结果转换为字符串。

简介

更新消息和列出计划消息