跳至主要内容

如何使用 Python 发送 Microsoft Teams 消息

按照我们的分步指南,将 Microsoft Teams 与 Python 集成,解锁自动发送 Teams 消息的能力,为整个公司带来洞见!
· 7分钟 阅读

使用 AI 探索

每份工作都有重复性任务。无论是支持人员分析常见的求助请求、团队负责人监控绩效指标,还是软件工程师检查业务流程,这些任务往往会反复出现——每天、每周,甚至每小时。

好在,您可以用 Python 将其中很大一部分自动化。它是一门多功能语言,既擅长处理数据,又适合编写自动化脚本。想象一下收集绩效指标:手动操作时,您可能需要翻看多个仪表板。有了 Python 脚本,您可以自动拉取这些数据,突出关键点,并把整理好的报告发送给您的上司。这不仅节省时间,还能降低出错风险。

在本教程中,我们将以一个具体案例来演示:运行 Python 代码获取某地的天气预报,并将该预报的摘要发送到 Microsoft 的团队沟通平台 Microsoft Teams。我们将涵盖配置 Teams webhook 的所有必要步骤、利用该 webhook 发送消息的 Python 程序,以及设置计划任务以便定期运行 Python 脚本。这个例子以天气预报为主题,但您当然可以将这部分“业务逻辑”替换成任何您需要的内容;向 Teams 发送消息的配置和代码将完全相同。

本教程将使用 DataLab,因为它内置了将机密信息安全存储为环境变量的功能(我们会用它来存储 Teams webhook),并且只需几次点击就能为您的 Python 代码设置计划任务。要跟着学习,您只需要一个 Microsoft 帐户(用于发消息)和一个 DataCamp 帐户(用于使用 DataLab),二者都可以免费创建!

您也可以查看我们关于如何使用 Python 发送 Slack 消息的独立指南。

下面开始吧!

1. 配置 Microsoft Teams Webhook

在 Microsoft Teams 中,有“团队”,团队下面有“频道”。可以在这些频道中添加所谓的“应用”。您可以把 Teams 应用理解为针对特定用途的 MS Teams 扩展或插件。市面上有将 Jira、Zendesk、Salesforce 等无数服务集成到 Teams 的应用,既可以在 Teams 内收到外部事件通知,也可以直接在 Teams 中对这些应用执行操作。对于我们的这个小项目,我们需要安装其中一款应用,更具体地说,是由 Microsoft 自己维护的“Incoming Webhook(传入 Webhook)”。

首先,确保您有一个可以访问 Teams 的 Microsoft 帐户。确保您是某个团队的成员,并且有权限在该团队的频道中添加应用。如果没有,请联系您的 IT 部门,并将此链接发给他们。

接下来,前往您希望发布消息的团队频道。在我们的示例中,这是“Data Analytics Heroes”团队中的“General(常规)”频道:

image14.png

点击频道名称旁的 + 号;您会看到可添加到该频道的应用概览:

image4.png

点击“Get more apps(获取更多应用)”。您将进入一个可向 MS Teams 添加应用的完整市场:

image15.png

在搜索框中输入“Incoming Webhook”。第一个显示的应用就是我们需要的:

image10.png

点击 Add,然后选择“Add to a team(添加到团队)”。系统会提示您指定要将消息发送到哪个团队或频道:

image13.png

本教程的示例是“Data Analytics Heroes”团队中的“General”频道,但您的设置可能不同。接着,点击“Set up a connector(设置连接器)”。接下来会出现另一个页面,要求您配置更多 webhook 设置。

image3.png

为传入 webhook 指定一个名称;您的消息将以此名称发送,因此请选择一个合适的名称,例如“Python Messenger(Python 信使)”。您也可以上传自定义图片,但这是可选项。最后点击“Create(创建)”。一个 webhook URL 就出现了!

image8.png

您需要在 Python 程序中使用这个 webhook URL,所以请务必将其复制到剪贴板并保存到某处(例如在备忘应用中)以备后用。最后点击“Done(完成)”。接下来出现的页面会显示您所选频道中所有连接器的概览。

image12.png

您可以直接关闭此页面。在刚刚为其配置了传入 webhook 的频道里,您应该会看到一条确认设置完成的相应消息:

image2.png

就这样!现在,您的 Microsoft Teams 频道已经准备好通过该 webhook 接收消息了。

2. 用 Python 编写业务逻辑

到目前为止,您做得很棒!配置好 Teams 的 Incoming Webhook 后,就到了好玩的部分:写 Python。我们将先编写一些用于解决当前任务的“业务逻辑”Python 代码。

如果您需要复习如何编写 Python 代码,我们的Python 入门课程是不二之选。

您可以从零创建一个空白工作簿,如果您已经清楚希望自动化并与 Microsoft Teams 集成的 Python 程序,这会很有用。

如果您是来学习相关概念,可以从一个示例工作簿开始,它会为您指定的城市汇总天气预报。每天都会有新数据,因此这是进行每日报告的绝佳候选!点击下方“Run Code(运行代码)”按钮即可创建这个工作簿。

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

运行代码

无论哪种方式,您最终都应该得到一个已完成业务逻辑编码的 DataLab 工作簿:

image16.png

3. 发送消息到 Teams

因此,Teams webhook:已就绪。业务逻辑:已就绪。要将 Python 笔记本与 Microsoft Teams 集成,我们需要做两件事:在 DataLab 工作簿中存储 webhook URL,并编写一些 Python 代码向 Teams 频道发送消息。

存储 webhook URL

我们的 Python 笔记本需要 webhook URL 才能将消息发送到正确的 Teams 频道。您可以直接把这个 URL 复制粘贴到笔记本的代码单元中。不过,这种做法并不安全,也不推荐。webhook URL 算是某种机密。如果您与他人共享笔记本,他们就能看到这个 webhook URL,并可能向您的 Teams 频道发送垃圾信息!

这种做法还意味着您在每个想要发送 Teams 消息的工作簿中都要重复复制粘贴。如果因为某些原因需要更新 webhook URL,您就得逐个编辑每个工作簿。

更安全且可扩展的做法是将 webhook URL 令牌存储在所谓的环境变量中。当您连接此环境变量后,它将在您的 Python 会话中可用。在您的工作簿中:

  • 点击左侧的“Environment(环境)”标签
  • 点击“Environment Variables(环境变量)”旁的加号图标
  • 在“Add Environment Variables(添加环境变量)”对话框中:
    • 将“Name(名称)”设置为 MS_TEAMS_WEBHOOK_URL
    • 在“Value(值)”字段中,粘贴之前保存的 Webhook URL。
    • 将“Environment Variables Set Name(环境变量集名称)”设置为“Microsoft Teams”(实际上可以是任意名称)

image5.png

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

import os
webhook_url = os.environ["MS_TEAMS_WEBHOOK_URL"]
print(webhook_url)

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

用于发送 Microsoft Teams 消息的 Python 代码

在准备好 MS_TEAMS_WEBHOOK_URL 之后,我们现在可以编写 Python 代码向 Teams 发送消息了!为此,我们将使用开源的 pymsteams 包,它为相当复杂的 Teams 发送消息 API 提供了一个便捷的封装。让我们先安装并导入它,同时导入 os 包以读取环境变量:

!pip install pymsteams
import pymsteams
import os

接下来,我们可以创建一个所谓的“connector card”(连接器卡片)——也就是 Teams 中的富文本消息——,为其添加一些文本,并发送出去:

card = pymsteams.connectorcard(os.environ["MS_TEAMS_WEBHOOK_URL"])
card.text("Hello Teams!")
assert card.send()

运行这段代码!您应该会在频道里看到这条消息:

image6.png

太棒了!这是一条没有实际意义的示例消息,但您也可以像我们在示例工作簿中那样,基于业务逻辑的运行结果来创建消息:

card = pymsteams.connectorcard(os.environ["MS_TEAMS_WEBHOOK_URL"])
card.title("Weather Forecast")
card.text("\n".join([
    f"Weather for {CITY} in the next three days:",
    f"- Min temperature: {weather_df['temperature_2m'].min()} {unit_temperature}",
    f"- Max temperature: {weather_df['temperature_2m'].max()} {unit_temperature}", 
    f"- Total precipitation: {weather_df['precipitation'].sum():.2f} {unit_prec}"
]))
assert card.send()

效果如下:

image7.png

最后,您还可以利用 DL_WORKBOOK_ID 环境变量添加一个按钮,链接到您的工作簿,方便有需要的人从 Teams 一键跳转至生成该消息的 DataLab 工作簿:

card = pymsteams.connectorcard(os.environ["MS_TEAMS_WEBHOOK_URL"])
card.title("Weather Forecast")
card.text("\n".join([
    f"Weather for {CITY} in the next three days:",
    f"- Min temperature: {weather_df['temperature_2m'].min()} {unit_temperature}",
    f"- Max temperature: {weather_df['temperature_2m'].max()} {unit_temperature}", 
    f"- Total precipitation: {weather_df['precipitation'].sum():.2f} {unit_prec}"
]))
card.addLinkButton("View detailed forecast", f"https://www.datacamp.com/datalab/w/{os.environ.get('DL_WORKBOOK_ID', 'invalid')}/edit")
assert card.send()

效果如下:

image1.png

很酷,对吧?!

4. 自动化!

您已经编写了一个 Python 脚本来完成有用的分析,并将分析摘要发送到 Teams,其中还包含跳转到完整笔记本的链接,方便有兴趣了解更多细节的人查看。太棒了!现在,想象一下,如果能让这个笔记本每日或每周自动执行,持续为您送上最新结果,会有多方便。好消息是,完全可以!DataLab 提供了计划运行功能来实现这一点。

  • 在顶部菜单栏中,点击 Run > Schedule Run(计划运行)
  • 根据需要配置计划:
    • 设置笔记本每天或每周自动运行。对于每周计划,选择具体的日期和时间。
    • 添加您希望在笔记本每次完成(无论成功或失败)时收到通知的 DataCamp 用户。对失败场景启用通知很有帮助,这样一旦出现问题,您就能立即介入修复。

image9.png

如果像上方截图那样配置,笔记本现在将每天在本地时间上午 9:30 运行,这意味着指定的 Teams 频道会在每天早晨收到一条消息。

是否该自动化

并非每个任务都适合自动化。这取决于您执行它的频率、手动完成所需的时间,以及编写自动化 Python 脚本所需的时间。例如,考虑一份每年一次、手动整理需 20 分钟的报告。如果写脚本要花去您半天时间,那么在节省回这部分时间之前,恐怕得很多年!

下面是一个表格形式的总结:

image11.png

来源:XKCD

因此,如果一个您每天都要做的任务之前需要 5 分钟,那么您最多可以花 6 天时间来尝试将其自动化。如果您花的时间少于这个阈值(以五年为期计算),就等于赚回了时间。

结语

首次设置 DataLab 以向 Microsoft Teams 发送消息需要在多个页面之间来回操作。但一旦在 DataLab 中配置好 webhook URL,发送消息只需添加几行 Python 代码——真的很简单!更棒的是,您几乎可以自动化任何 Python 脚本,并将通知直接发送给利益相关方,就在他们所在之处:Teams。

告别为重复而枯燥的任务设置提醒的时代。欢迎进入高效的自动化工作流时代,您无需在工具之间来回切换。所需的一切,就是拥抱 DataLab。

请记住,如果您需要复习如何编写 Python 代码,我们的Python 入门课程是不二之选。

Filip Schouwenaars

作者

Filip Schouwenaars

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

主题