跳至主要内容

如何使用 Python 发送 Slack 消息

按照我们的分步指南,将 Slack 与 Python 集成,解锁自动发送 Slack 消息的能力,为洞见赋能!
· 7分钟 阅读

使用 AI 探索

每一份工作都有那些枯燥而重复的任务。无论您是需要汇报常见求助主题的客服人员、需要跟踪绩效指标的团队经理,还是需要检查关键业务流程以确保一切正常的软件工程师,这些事您都得一次次去做——每月、每周、每天,甚至每小时!

不过,在许多情况下,至少一部分重复性工作是可以自动化的。Python 在这方面就很给力:它是一门通用编程语言,既擅长处理(大量)数据,又便于编写自动化脚本。比如汇报绩效指标:没有自动化时,您可能得查看 4 个不同的仪表板,把需要的数字都凑齐,再整理成一条消息发给上级。有了自动化,一个 Python 脚本就能拉取所有所需数据,挑出关键汇总数字,整理好并自动发送消息,完全不需要您介入。它不仅方便,还能降低出错和遗忘的风险!

在本教程中,我们将以一个具体场景为例:运行 Python 代码汇报投资组合的状态,并将该组合的摘要发送到 Slack(一个广泛使用的团队沟通平台)。我们将涵盖配置 Slack 应用、编写利用该应用发送消息的 Python 程序,以及设置计划任务以便定期运行 Python 脚本的全部必要步骤。示例围绕投资组合跟踪展开,但您当然可以把这段“业务逻辑”替换成任何您需要的内容;向 Slack 发送消息的配置和代码完全不变。

本教程将使用 DataLab,因为它内置了以环境变量形式安全存储机密信息(我们会用来保存 Slack 应用凭据)以及几次点击就能为您的 Python 代码设置定时调度的功能。要跟着做,您只需要一个 Slack 账号(用于发消息)和一个 DataCamp 账号(用于使用 DataLab),两者都可以免费创建!

让我们开始吧!

1. 配置 Slack 应用

可以把 Slack 应用理解为为特定目的扩展 Slack 的插件或附加组件。Slack 有很多应用可以把 Google Docs、Jira、Dropbox、Zoom 等集成到 Slack 中,这样您不仅能在 Slack 内收到外部事件的通知,还能在 Slack 内对这些应用执行操作。对于我们的这个小项目,我们同样需要创建一个 Slack 应用,以便使用每个 Slack 应用自带的机器人用户向 Slack 发送消息。

首先,确保您有一个 Slack 账号,已加入一个您拥有管理员权限的 Slack 工作区,并且已用该账号登录。否则,请前往 slack.com 创建新账号和工作区。

接着,访问 https://api.slack.com/app,也就是您的 Slack 应用控制台。它看起来大致如下:

create app dashboard in slack

点击“Create an App”。

create an app dialogue

选择“From scratch”。在下一屏,为您的应用指定一个名称,例如“Python Messenger”,并指定您希望在其中开发此应用的工作区(您的工作区名称会不同)。

点击 Create app。现在您会进入刚创建的应用主页,可以在这里配置应用的所有设置,从基本信息到谁可以对应用进行更改,以及所有功能。别被这些选项吓到!我们只需要配置其中的几个。

前往“OAuth & Permissions”标签页,向下滚动到 Scopes 卡片,在 Bot Token Scopes 下点击“Add an OAuth Scope”,依次添加“chat:write”、“chat:write.customize”、“files:read”、“files:write”这几个 scope(您总共需要点击四次“Add an OAuth Scope”)。

Scopes dialogue

这些机器人令牌 scope 指定了您的应用的机器人用户在 Slack 工作区内可以执行的操作。遵循最小权限原则,我们不会授予该应用对所有内容的访问权和所有可能的权限,而是仅限于写入(自定义)聊天消息以及上传和下载文件(如果您希望在消息中包含附件,这会很有用)。

现在回到页面上方的“OAuth Tokens for Your Workspace”部分,点击“Install to Workspace”:

Oauth and permissions dialogue

在接下来显示您刚才指定的 scope 的页面中,点击 Allow。

您会看到已经为您创建了一个“Bot User OAuth Token”:

OAuth Token dialogue

稍后您会用到这个 Bot User OAuth Token,请不要关闭浏览器窗口。

打开 Slack,您会注意到侧边栏中出现了一个名为“Python Messenger”(或您自己命名的)的新应用:

最后一步是配置您希望用于接收自动化消息的 Slack 频道。创建一个名为 #bot-updates 的新频道。在频道中输入 /app,并选择“Add apps to this channel”:

Adding app to slack

在“Python messenger”旁边点击“Add”。您会看到“Python Messenger”应用已加入该频道。

就这样!现在,您的 Slack 频道已准备好通过“Python Messenger”应用接收使用生成的 Bot User OAuth Token 发送的消息。请注意,虽然步骤不少,但每个 Slack 工作区只需设置一次。如果您希望有多个 Python 程序向同一个 Slack 工作区发送消息,就不必重复上述流程。

2. 用 Python 编写业务逻辑

做得很好!Slack 应用配置好了,接下来进入有趣的部分:写 Python。我们先为手头的任务编写一些“业务逻辑”的 Python 代码。

如果您需要回顾如何编写 Python 代码,我们的Python 入门课程是理想起点。

您可以从零创建一个空白工作簿,如果您已经清楚想要自动化并与 Slack 集成的 Python 程序,这会很合适。

如果您是来学习这些概念的,可以从我们提供的示例工作簿开始,它会跟踪一个虚拟科技股组合的价值。除周末外,每天都会有新数据,因此非常适合做每日汇报。

在线运行和编辑此教程中的代码

运行代码

无论哪种方式,您最终都会得到一个包含完整业务逻辑代码的 DataLab 工作簿:

Slack messages workspace

3. 发送 Slack 消息

Slack 应用:已完成。业务逻辑:已完成。要将 Python 笔记本与 Slack 集成,我们需要做两件事:在工作簿中存储 Slack OAuth 令牌,以及编写一些 Python 代码来发送 Slack 消息。

存储 Slack OAuth 令牌

我们的 Python 笔记本需要 OAuth 令牌来证明它有权向您的 Slack 工作区发送消息。您可以直接把这个 OAuth 令牌复制粘贴到笔记本的代码单元中。不过,这种做法不安全,不推荐。如果您与他人分享笔记本,对方就能看到该 OAuth 令牌。

这种方式还意味着每个需要向 Slack 发消息的工作簿,您都得重复复制粘贴。如果要更新这个 OAuth 令牌,又得挨个编辑每个工作簿。

一种更安全、可扩展的方法是把 Slack OAuth 令牌存储在所谓的环境变量中。连接该环境变量后,它就会在您的 Python 会话中可用。在您的工作簿里:

  • 点击左侧的“Environment”标签
  • 在“Environment Variables”旁点击加号图标
  • 在“Add Environment Variables”弹窗中:
    • 将“Name”设为SLACK_TOKEN
    • 在“Value”字段中,粘贴您在本指南第 1 步获取的 OAuth 令牌。
    • 将“Environment Variables Set Name”设为“Slack”(其实也可以是任意名字)

Environment variables dialogue

填写完成后,点击“Create”、“Next”,最后点击“Connect”。您的 DataLab 会话会重启,SLACK_TOKEN 将作为环境变量在您的工作簿中可用。您可以通过创建一个包含以下代码的 Python 单元并运行来验证:

import os
slack_token = os.environ["SLACK_TOKEN"]
print(slack_token)

如果您想在另一个工作簿中复用同一组服务账号凭据,无需再次设置环境变量:可以在其他工作簿中直接复用该环境变量。

用于发送 Slack 消息的 Python 代码

在准备好 SLACK_TOKEN 后,在笔记本底部加入一小段代码,向您的 Slack 工作区中的 #bot-updates 频道发送一条示例消息:

import os
from slack_sdk import WebClient

message = "This is my first Slack message from Python!"

# Set up a WebClient with the Slack OAuth token
client = WebClient(token=os.environ["SLACK_TOKEN"])

# Send a message
client.chat_postMessage(
    channel="bot-updates", 
    text=message, 
    username="Bot User"
)

此代码使用了Slack 官方 Python SDK。运行它!您应该会在 Slack 工作区中看到这条消息:

image5.png

这是一条没有实际意义的示例消息,您也可以基于业务逻辑的结果来生成消息,就像我们在示例工作簿中所做的那样:

message = f"Total value of my portfolio on {portfolio_df.index[-1]:%B %d, %Y} is ${latest_total:,.2f}."

效果如下:

Sample message

最后,您还可以利用 DL_WORKBOOK_ID 环境变量在消息中加入指向您工作簿的链接,方便从 Slack 直接跳转到生成该消息的 DataLab 工作簿:

message = f"""
Total value of my portfolio on {portfolio_df.index[-1]:%B %d, %Y} is ${latest_total:,.2f}.
For the full analysis, check <https://www.datacamp.com/workbook/w/{os.environ.get('DL_WORKBOOK_ID', 'invalid')}/edit|this workbook> (updates daily)
"""

效果如下:

Another sample message

4. 自动化!

您已经写好了一个 Python 脚本,既能做有价值的分析,又能把该分析的摘要发送到 Slack,并附上回链到完整笔记本,方便有需要的人深入查看。太棒了!但如果能把这个笔记本配置为每周或每天自动运行,让您自动获取最新结果的更新,岂不更好?好消息是:完全可以!DataLab 支持计划运行,正是为此而设。

  • 在顶部菜单栏中,点击 Run > Schedule Run
  • 按需配置调度:
    • 将笔记本设置为按日或按周运行,并可指定时间与星期几(若选择每周)
    • 添加需要在笔记本成功完成、出错或两种情况下收到通知的 DataCamp 用户。一个不错的做法是设置失败时通知您,以便需要时及时排查。

Schedule run dialogue

如果像上图这样配置,笔记本将每天在本地时间上午 9:30 运行,这意味着每个早晨都会在 Slack 的 #bot-updates 频道发布一条消息。

该不该自动化

是否值得自动化,取决于您执行该任务的频率、手动完成所需时间,以及编写自动化该任务的 Python 脚本所需时间。举个例子就很清楚:假设您每年需要汇总一份报告,手动整理只需 20 分钟。如果写一个 Python 脚本要花半天时间,那恐怕很多年之后您才能把自动化所花的时间“赚”回来!

下表对此有精准的概括:

Is it worth the time to automate?  Source: https://xkcd.com/1205/

是否值得花时间做自动化?来源

因此,如果一个您需要每天完成的任务以往要花 5 分钟,那么您最多可以花 6 天时间来尝试把它自动化。如果实际用时少于这个上限(按 5 年计算),您就节省了时间。

结论

在您能从 DataLab 向 Slack 发送消息之前,最初的设置可能会花点时间。不过,一旦一切都配置妥当,并把 Slack 令牌保存在 DataLab 中,发送消息只需要加上两行 Python 代码:就这么简单!更重要的是:您现在几乎可以自动化任何 Python 脚本,并在您的利益相关方所在之处通知他们——在 Slack 里。

告别一遍遍设置提醒去做同样无聊的事,迎接无需在工具间来回切换的强大自动化流程。您所需要的只有爱 DataLab。

通过 DataCamp 的Python 进阶课程,将您的 Python 技能更进一步。拓展您在数据可视化和高级 Python 特性的知识。立即继续您的学习之旅!

Filip Schouwenaars

作者

Filip Schouwenaars

Filip 是多门最受欢迎的 DataCamp Python、SQL 和 R 课程背后的热忱开发者。目前,Filip 负责领导 DataCamp 的 AI 赋能数据笔记本 DataLab 的开发。Filip 拥有电气工程和人工智能学位。

主题