Python脚本实现飞书消息推送的完整指南(附代码)
目录导读
- 飞书消息推送的核心原理
- 前置准备:获取Webhook与机器人配置
- Python脚本实战:三种推送模式详解
- 1 文本消息推送
- 2 富文本(Markdown)消息推送
- 3 卡片消息推送
- 错误排查与常见问题Q&A
- 进阶技巧:定时任务与多机器人管理
飞书消息推送的核心原理
飞书开放平台提供了「自定义机器人」功能,用户只需获取一个Webhook地址,即可通过HTTP POST请求向指定群聊发送消息,Python作为最流行的脚本语言之一,可以轻松通过requests库实现消息推送。

关键流程:
Python脚本 → 构造JSON数据 → POST请求至Webhook URL → 飞书服务器解析 → 群聊显示消息
为什么选择飞书机器人?
无需复杂认证,零门槛接入;支持文本、富文本、卡片等丰富消息类型;配合Python的schedule或APScheduler可实现自动化监控、告警、数据推送。
前置准备:获取Webhook与机器人配置
1 创建飞书机器人
- 打开飞书客户端,进入目标群聊 → 点击「设置」→「群机器人」→「添加机器人」→ 选择「自定义机器人」。
- 设置机器人名称、头像(可选),点击「完成」。
- 系统生成一个以
https://open.feishu.cn/open-apis/bot/v2/hook/开头的Webhook地址,务必复制保存。
2 安全配置(重要)
- IP白名单:在机器人配置页面,建议添加你服务器或本机的公网IP,防止地址泄露后被滥用。
- 签名校验(可选):开启后,请求头需携带时间戳与签名,增强安全性。
3 确认Python环境
确保已安装Python 3.6+,以及requests库(pip install requests)。
Python脚本实战:三种推送模式详解
1 文本消息推送(最基础)
import requests
import json
def send_text(webhook_url, content):
data = {
"msg_type": "text",
"content": {
"text": content
}
}
headers = {"Content-Type": "application/json"}
response = requests.post(webhook_url, json=data, headers=headers)
return response.json()
# 使用示例
webhook = "your_webhook_url_here"
result = send_text(webhook, "Python脚本推送测试:Hello 飞书!")
print(result) # 正常返回 {"code":0,"msg":"success"}
注意:文本消息默认支持@某人,语法为<at user_id="all">所有人</at>(all表示@所有人)。
2 富文本(Markdown)消息推送
飞书机器人支持部分Markdown语法(如标题、加粗、列表、链接等)。
def send_markdown(webhook_url, title, content):
data = {
"msg_type": "interactive",
"card": {
"header": {
"title": {
"tag": "plain_text",
"content": title
}
},
"elements": [
{
"tag": "markdown",
"content": content
}
]
}
}
# 发送逻辑同上
**系统监控告警** - CPU使用率:**85%** (阈值>75%) - 内存使用:已用3.2GB/4GB - [查看详情](http://example.com/monitor)
3 卡片消息推送(高颜值+交互)
卡片消息支持按钮、分割线、多列布局,适合复杂场景。
def send_card(webhook_url, title, body_list, button_url=None):
elements = []
for item in body_list:
elements.append({
"tag": "div",
"text": {
"tag": "lark_md",
"content": f"**{item['label']}**:{item['value']}"
}
})
if button_url:
elements.append({
"tag": "action",
"actions": [{
"tag": "button",
"text": {"tag": "plain_text", "content": "查看详情"},
"url": button_url,
"type": "default"
}]
})
# 构建完整card结构(含header)
错误排查与常见问题Q&A
Q1:推送后飞书群没有任何消息?
A:首先检查Webhook地址是否完整正确,然后看Python返回结果:
code: 0表示成功。code: 19021表示消息内容含敏感词(如“测试”、“admin”)。code: 19024表示签名验证失败(若已开启签名校验)。
解决办法:
- 打印
response.text查看详细错误。 - 若提示IP未在白名单,登录飞书机器人后台添加IP。
Q2:如何@指定成员或所有人?
A:在文本消息的content.text中嵌入<at user_id="ou_xxx">张三</at>(需通过飞书开放API获取user_id)。@所有人直接写<at user_id="all">所有人</at>。
Q3:推送内容包含中文乱码?
A:Python默认UTF-8编码,通常不会乱码,若出现,可在请求头添加"charset": "utf-8",或确保文本不包含非法Unicode字符。
Q4:能否推送图片或文件?
A:飞书自定义机器人不支持直接发送图片或文件,但可通过卡片消息的img标签展示图片URL,或先上传文件到服务端再发送链接。
进阶技巧:定时任务与多机器人管理
1 使用schedule库实现定时推送
import schedule
import time
def daily_report():
webhook = "https://open.feishu.cn/open-apis/bot/v2/hook/xxx"
send_markdown(webhook, "日报推送", "今日数据摘要...")
# 每天9:30推送
schedule.every().day.at("09:30").do(daily_report)
while True:
schedule.run_pending()
time.sleep(1)
2 多机器人统一管理
将Webhook地址存入配置文件(如config.json):
{
"dev_team": "https://...hook1",
"ops_monitor": "https://...hook2",
"all_staff": "https://...hook3"
}
通过函数参数动态选择目标群聊。
3 安全加固:签名校验实现
开启签名后,需在请求头加入时间戳和签名:
import hmac
import hashlib
import base64
import time
timestamp = str(int(time.time()))
secret = "your_secret_key"
string_to_sign = f"{timestamp}\n{secret}"
sign = base64.b64encode(hmac.new(secret.encode(), string_to_sign.encode(), hashlib.sha256).digest())
headers["X-Lark-Signature"] = sign
通过Python脚本推送飞书消息,核心在于理解Webhook的JSON格式与请求方式,从简单文本到复杂卡片,再到定时任务与多机器人协作,这套方案适用于运维告警、数据报表、钉钉/企业微信互转等多种场景,建议先在测试群调试,再迁移至生产环境。