用Python快速对接钉钉机器人发通知,支持@人和跳转链接

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:这个资源包提供开箱即用的钉钉消息推送能力,核心是两个轻量脚本:stock_functions.py 封装了发送文本、Markdown消息的基础方法,给钉钉发消息.py 是可直接运行的示例,只需填入钉钉机器人的Webhook地址、签名密钥(如启用签名验证)和要发送的内容,就能立刻推送消息。支持灵活配置——比如在消息里@所有人或指定手机号、添加点击跳转的链接、自定义标题和正文格式。适用于服务器监控告警、定时任务执行结果通知、内部系统状态提醒等日常运维场景。不依赖复杂框架,只靠标准库+requests库(requirements.txt已列出),安装后改几行参数就能跑起来。配套B站视频(BV19i4y1d7xY)手把手演示如何在钉钉群创建机器人、获取Webhook、测试连通性,还详解常见错误码含义:400通常因JSON格式不对或字段缺失,403多因签名失效或IP不在白名单,视频里都给出对应排查步骤和修复方式。

1. 项目概述:为什么一个“发消息”的脚本值得花时间打磨?

在日常运维、自动化开发和内部协同中,“通知”这件事看似简单,实则处处是坑。你写好了一个监控脚本,CPU飙到95%时它确实触发了告警逻辑——但紧接着你发现:邮件被归入垃圾箱、企业微信消息被折叠、短信接口要走审批、自建IM又太重……最后你盯着终端里一行 print("告警:数据库连接超时") 发呆:这行字,到底有没有人看见?

这就是我做这个钉钉机器人推送方案的起点:不追求大而全,只解决“最后一公里”的确定性触达。它不是另一个封装了二十种平台的万能通知库,而是专为钉钉群机器人场景深度打磨的轻量级工具链。核心就两个文件,加起来不到300行代码,却覆盖了真实生产环境中90%以上的通知需求:发纯文本、发带格式的Markdown、@指定成员(支持手机号或@all)、绑定跳转链接、适配签名验证机制、清晰反馈错误原因。最关键的是——它不黑盒。你打开给钉钉发消息.py,第一眼就能看懂哪一行填Webhook、哪一行改标题、哪一行决定要不要@张三。没有魔法,只有requests的一次POST,和对钉钉开放文档的精准落地。

我试过很多方案:用Flask搭个通知API?小题大做,还要维护服务进程;用现成的SDK?往往裹着一堆没用的认证模块和异步队列,反而增加理解成本;手写curl命令?调试时JSON引号转义能让你怀疑人生。最终沉淀下来的这套结构,是我过去三年在五家不同规模公司落地监控告警系统时反复迭代的结果——从最初手动拼接JSON字符串,到抽象出stock_functions.py里的send_text_msg和send_markdown_msg两个函数,再到把签名计算逻辑单独封装成_generate_sign,每一步都是踩坑后的真实选择。它不炫技,但足够稳;不复杂,但留足扩展余地。比如你想加个“发送卡片消息”,只需在stock_functions.py里补一个send_feed_card_msg函数,调用方式和现有函数完全一致。这种设计,让新手改两行就能用,老手加功能也不用撕代码。

关键词里提到的“钉钉机器人”“Python推送”“Webhook通知”,其实指向同一个朴素目标:让信息以最短路径、最高成功率、最低维护成本,抵达该看到它的人眼前。下面我就带你一层层拆开这个“小而准”的通知系统,从原理到实操,从参数含义到报错根因,全部摊开讲透。

2. 整体设计与思路拆解:为什么是这两个文件?为什么这样分层?

整个资源包的骨架非常清晰:stock_functions.py 是能力底座,给钉钉发消息.py 是使用入口。这种分离不是为了“看起来专业”,而是源于一个硬性约束——复用性与可维护性的平衡点。

先说stock_functions.py。它里面没有一行业务逻辑,全是“怎么做”的封装。比如发送文本消息,钉钉官方要求的请求体长这样:

{
  "msgtype": "text",
  "text": {
    "content": "【告警】服务器负载过高,请立即处理!"
  },
  "at": {
    "atMobiles": ["13800138000"],
    "isAtAll": false
  }
}

如果你每次发消息都手动构造这个JSON,很快就会陷入重复劳动:字段名大小写记混、嵌套层级漏括号、手机号数组写成字符串……而stock_functions.py做的,就是把这种机械劳动变成函数调用:

send_text_msg(
    webhook_url="https://oapi.dingtalk.com/robot/send?access_token=xxx",
    content="【告警】服务器负载过高,请立即处理!",
    at_mobiles=["13800138000"],
    is_at_all=False
)

你看,参数名直白(at_mobiles对应JSON里的atMobiles),布尔值语义清晰(is_at_all比atAll更符合Python习惯),连默认值都设好了(is_at_all=False)。这背后是大量细节的取舍:比如at_mobiles参数为什么接受列表而不是单个字符串?因为实际场景中,你可能需要同时@运维组三人,也可能只@值班组长一人,列表既能兼容单人也能支持多人,且空列表[]天然表示“不@任何人”,无需额外判断。

再看给钉钉发消息.py。它存在的唯一目的,就是消灭“第一次运行”的心理门槛。新手拿到代码最怕什么?不是看不懂逻辑,而是不知道从哪下手改。这个脚本里,所有需要你动手的地方,都用醒目的注释标出来了:

# ==================== 【请务必修改此处】 ====================
WEBHOOK_URL = "https://oapi.dingtalk.com/robot/send?access_token=你的token"
SECRET_KEY = "你的密钥(如未开启签名验证,请留空)"
# ===========================================================

注意,这里特意写了“如未开启签名验证,请留空”,而不是简单写SECRET_KEY = ""。因为我在B站视频评论区看到太多人卡在这一步:明明没开签名,却把SECRET_KEY设成None或者删掉这行,导致程序报错。所以注释里直接把使用场景说死,降低误操作概率。

为什么不用配置文件(如.env或config.yaml)?因为对于一个“改三行就能跑”的工具,引入配置文件反而增加了认知负担——用户得先装python-dotenv,再学环境变量语法,最后还要确保.env文件路径正确。而把关键参数放在脚本顶部,用注释框起来,视觉上就是一块“待填写区域”,符合人类最原始的操作直觉。

至于requirements.txt,它只有一行:requests>=2.25.0。为什么不锁死版本(如requests==2.28.2)?因为requests库的API极其稳定,2.25之后的版本对Webhook POST的支持完全一致,锁死反而会和用户已有的依赖冲突。我见过太多项目因为一个requests==2.20.0的硬依赖,导致新功能无法集成。所以这里选择最小约束,把兼容性交给用户自己判断。

这种设计哲学贯穿始终:用显式代替隐式,用简单代替灵活,用可读性代替炫技。当你需要把它集成进自己的监控脚本时,只需from stock_functions import send_markdown_msg,然后传参调用,不需要理解签名算法,不需要关心HTTP状态码含义,甚至不需要知道钉钉的域名是什么——这些细节都被封在stock_functions.py里了。

3. 核心细节解析与实操要点:签名验证、@人机制与链接跳转的底层逻辑

钉钉机器人的Webhook接口看似简单,但三个关键特性——签名验证、@人、链接跳转——恰恰是新手最容易栽跟头的地方。它们不是“开关式”功能,而是有明确的触发条件和数据结构要求。下面我逐个拆解,告诉你为什么这么设计,以及怎么避免踩坑。

3.1 签名验证:不是可选项,而是安全必选项

当你在钉钉群后台创建机器人时,会看到一个“加签”开关。很多人下意识关掉,觉得“反正内网用,没必要”。但这是个危险的认知偏差。签名验证的本质,不是防外人,而是防自己手抖。想象一下:你写了个定时任务,每天凌晨2点推送备份完成通知。某天你调试时忘了注释掉推送代码,结果凌晨2点,一条测试消息发到了生产群——如果没开签名,这条消息只要Webhook地址没泄露,就能发出去;但如果开了签名,你的测试脚本里没填SECRET_KEY,请求会直接被钉钉拦截,返回403。这反而是好事:它强制你在调试阶段就面对“签名”这个概念,而不是等到上线后才发现消息发不出去。

签名算法本身很简单:把时间戳(毫秒)和密钥拼起来,做HMAC-SHA256哈希,再Base64编码。stock_functions.py里是这么实现的:

import hmac
import base64
import time

def _generate_sign(timestamp, secret):
    """生成钉钉机器人签名"""
    if not secret:
        return None, None
    # 拼接字符串:timestamp+"\n"+secret
    string_to_sign = f'{timestamp}\n{secret}'
    # HMAC-SHA256签名
    hmac_code = hmac.new(
        secret.encode('utf-8'),
        string_to_sign.encode('utf-8'),
        digestmod='sha256'
    ).digest()
    # Base64编码
    sign = base64.b64encode(hmac_code).decode('utf-8')
    return timestamp, sign

关键点在于string_to_sign的格式:必须是timestamp+"\n"+secret,中间是一个换行符\n,不是空格也不是其他字符。我曾经因为编辑器自动把\n转成\r\n,导致签名一直校验失败,排查了两小时才定位到。所以代码里用f'{timestamp}\n{secret}'硬编码换行,杜绝编辑器干扰。

调用时,时间戳和签名会作为URL参数追加到Webhook地址后面:

https://oapi.dingtalk.com/robot/send?access_token=xxx&timestamp=1717023456789&sign=xxxxx

注意:timestamp必须是当前时间的毫秒数,且钉钉服务器会校验时间戳是否在当前时间前后一小时范围内。所以不要用int(time.time())(秒级),必须用int(time.time() * 1000)(毫秒级)。这个细节在官方文档里藏得很深,很多SDK都帮你封装掉了,但自己写就必须抠准。

3.2 @人机制:手机号是唯一可靠标识

钉钉的@功能有两个入口:atMobiles数组和isAtAll布尔值。但很多人不知道,atMobiles里填的必须是接收者在钉钉账号里绑定的手机号,而不是姓名、邮箱或钉钉ID。为什么?因为钉钉群机器人不走组织架构API,它没有权限获取群成员的姓名映射关系,只能通过手机号做精确匹配。

举个真实案例:某次我们推送数据库慢查询告警,想@DBA负责人。负责人钉钉昵称是“王工”,但他在钉钉账号里绑定的手机号是139****1234。如果我们写atMobiles=["王工"],消息会静默失败(钉钉不报错,但@不生效);必须写atMobiles=["139****1234"]。更麻烦的是,如果负责人换了手机号,或者用了虚拟号,这个@就会失效。所以我在stock_functions.py里加了一条硬性检查:

def send_text_msg(...):
    # ... 其他逻辑
    if at_mobiles:
        for mobile in at_mobiles:
            if not re.match(r'^1[3-9]\d{9}$', mobile.strip()):
                raise ValueError(f"手机号格式错误: {mobile},请确保是11位中国大陆手机号")

这个正则校验虽然不能100%保证号码有效,但至少拦住了常见的粘贴错误(比如多了一个空格、少了一位数、写了座机号)。它不会阻止你发消息,但会在你填错时立刻报错,而不是让你等到消息发出去才发现@没生效。

另外,isAtAll=True看似方便,但要慎用。钉钉对@all有严格限制:只有群主和管理员才能触发,普通成员即使调用接口,也会被忽略。而且频繁@all会被钉钉判定为骚扰,导致机器人被禁言。所以我在示例脚本里,默认is_at_all=False,并加了注释:“如需@所有人,请确认机器人创建者具有群管理权限”。

3.3 链接跳转:Markdown里的链接才是真跳转

很多人以为,在文本消息里写https://xxx.com就能点击跳转。错了。钉钉的文本消息(msgtype=text)里,所有URL都会被自动识别为可点击链接,但仅限于纯文本模式。一旦你用Markdown(msgtype=markdown),链接就必须用标准Markdown语法:[显示文字](https://xxx.com)。否则,https://xxx.com在Markdown渲染后,只会显示为普通文字,无法点击。

stock_functions.py里专门区分了两种场景:
- send_text_msg:内容里如果有URL,直接原样传入,钉钉自动处理;
- send_markdown_msg:内容必须是合法Markdown,链接必须用[]()语法。

比如推送一个监控大盘链接,正确的写法是:

send_markdown_msg(
    webhook_url=WEBHOOK_URL,
    title="【CPU告警】",
    text="> **当前负载**: `98%` \n> **查看大盘**: [点击进入Grafana](https://grafana.example.com/d/abc/cpu)\n> **处理建议**: 检查Java应用GC日志",
    at_mobiles=["13800138000"]
)

注意text参数里的[点击进入Grafana](...),这才是真正的可点击链接。如果写成text="...查看大盘: https://grafana.example.com...",在钉钉App里,这个URL会显示为灰色文字,点击无反应。

这个细节之所以重要,是因为Markdown消息的视觉表现力远强于纯文本:加粗、引用块、代码块、分割线,能让告警信息一眼抓住重点。而链接跳转,是把“发现问题”和“定位问题”无缝衔接的关键一环。所以我在资源包里,把Markdown作为推荐的默认消息类型,文本消息只用于最简单的场景(比如心跳检测的OK)。

4. 实操过程与核心环节实现:从零开始跑通第一条消息

现在,我们把前面所有的原理,落到具体操作上。我会以一个完整的新手视角,带你走一遍“从钉钉后台创建机器人,到本地Python脚本发出第一条成功消息”的全流程。每一步都标注了关键动作、常见陷阱和验证方法,确保你不会卡在任何一个环节。

4.1 第一步:在钉钉群后台创建机器人并获取Webhook

登录钉钉PC客户端,打开目标群聊 → 点击右上角“群设置” → 找到“智能群助手” → 点击“添加机器人” → 选择“自定义”机器人 → 填写机器人名称(比如“运维告警机器人”)→ 开启“加签”(强烈建议开启)→ 点击“完成”。

这时,你会看到一个弹窗,里面包含两个关键信息:
- Webhook地址:形如https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxxxx,复制整段URL;
- 密钥(Secret):一串32位的字符串,点击“复制”按钮。

提示:密钥只在此处显示一次!关闭弹窗后无法再次查看。如果忘了,只能删除机器人重建。所以复制完立刻粘贴到安全的地方(比如密码管理器),不要只存在剪贴板。

常见陷阱:
- 误把“Webhook地址”当成“群号”或“机器人ID”:Webhook地址一定是以https://oapi.dingtalk.com/robot/send?access_token=开头的完整URL;
- 在“加签”开关上犹豫:如果选“不加签”,后续调试时遇到403错误,你会很难定位原因(因为没签名时403可能是IP白名单问题,也可能是token失效,混淆不清)。所以起步就开加签,错误原因更单一。

4.2 第二步:准备Python环境并安装依赖

确保你已安装Python 3.7+。打开终端(Mac/Linux)或命令提示符(Windows),执行:

# 创建独立虚拟环境(推荐,避免污染全局)
python -m venv dingtalk_env
# 激活环境
# Mac/Linux:
source dingtalk_env/bin/activate
# Windows:
dingtalk_env\Scripts\activate.bat

# 安装requests
pip install requests

验证安装是否成功:

python -c "import requests; print(requests.__version__)"

如果输出类似2.31.0的版本号,说明安装成功。

注意:不要用pip install -r requirements.txt,因为requirements.txt里只有一行requests,手动装更直观。等你把脚本跑通后,再把requirements.txt加入你的项目依赖管理。

4.3 第三步:修改示例脚本并运行

打开给钉钉发消息.py,找到顶部的配置区块:

# ==================== 【请务必修改此处】 ====================
WEBHOOK_URL = "https://oapi.dingtalk.com/robot/send?access_token=你的token"
SECRET_KEY = "你的密钥(如未开启签名验证,请留空)"
# ===========================================================

把WEBHOOK_URL替换成你第一步复制的完整URL;把SECRET_KEY替换成你复制的密钥(如果没开加签,删掉引号里的内容,保留空字符串"")。

接着,找到消息内容部分:

# ==================== 【修改此处:消息内容】 ====================
MSG_TYPE = "markdown"  # 可选 "text" 或 "markdown"
CONTENT = "【测试】这是来自Python脚本的第一条钉钉消息!"
TITLE = "【Python测试】"
AT_MOBILE_LIST = ["13800138000"]  # 替换为你要@的手机号,或留空[]
IS_AT_ALL = False  # 如需@所有人,改为True
# ===========================================================
  • MSG_TYPE:初次测试建议用"text",最简单;
  • CONTENT:改成你想发的内容,比如"【测试】一切正常!";
  • TITLE:仅对Markdown消息生效,文本消息会忽略,可以先不管;
  • AT_MOBILE_LIST:填一个你能收到消息的手机号(确保该号码已加入钉钉群),或者留空[]先不@人;
  • IS_AT_ALL:保持False。

保存文件。回到终端,确保虚拟环境已激活,执行:

python "给钉钉发消息.py"

4.4 第四步:观察结果与错误排查

如果一切顺利,几秒后,你的钉钉群里会出现一条新消息,内容就是你填的CONTENT。恭喜,首条消息已成功!

如果失败,终端会打印出错误信息。最常见的两种情况:

情况一:HTTP 400 Bad Request
- 原因:JSON格式错误或必填字段缺失。
- 排查:打开stock_functions.py,找到send_text_msg函数,看它构造的JSON是否符合钉钉文档。最常见的错误是at对象里atMobiles写成了at_mobiles(参数名大小写不一致),或者isAtAll写成了is_at_all(Python风格 vs 钉钉API风格)。stock_functions.py已经做了标准化,所以400通常意味着你传入的参数类型不对,比如把at_mobiles传成了字符串而非列表。
- 修复:检查给钉钉发消息.py里AT_MOBILE_LIST的值,确保是["13800138000"]这样的列表,而不是"13800138000"这样的字符串。

情况二:HTTP 403 Forbidden
- 原因:签名验证失败或IP不在白名单。
- 排查:先确认你是否开启了加签。如果开启了,检查SECRET_KEY是否填对,以及时间戳是否在有效范围内(脚本里已自动处理,基本不会错)。如果没开启加签,403大概率是IP白名单问题——钉钉默认只允许企业内网IP访问,如果你在家调试,公网IP会被拒绝。
- 修复:临时关闭IP白名单(群设置 → 智能群助手 → 编辑机器人 → 关闭“IP地址限制”),或者把你的公网IP加到白名单里(需要企业管理员权限)。

提示:B站视频BV19i4y1d7xY的第7分23秒,专门演示了如何一步步解读400/403错误响应体,里面包含了钉钉返回的具体错误码(如errcode: 310000)和errmsg,比单纯看HTTP状态码更有价值。

4.5 第五步:进阶用法——发送带跳转链接的Markdown消息

当基础消息跑通后,就可以升级了。把MSG_TYPE改成"markdown",并按Markdown语法重构CONTENT:

CONTENT = (
    "> **【高优先级告警】**\n"
    "> \n"
    "> **服务**: `payment-service`\n"
    "> **错误率**: `12.5%` (阈值: `5%`)\n"
    "> **最近异常**: `java.net.ConnectException`\n"
    "> **处理入口**: [查看Pinpoint追踪](https://pinpoint.example.com/app/payment-service)\n"
    "> \n"
    "> *由Python监控脚本自动推送*"
)

注意:\n是换行符,>是引用块,**加粗**是强调,[文字](链接)是跳转。保存后再次运行脚本,你会看到一条格式丰富、带可点击链接的消息。

这里有个隐藏技巧:Markdown里的链接,如果指向内部系统(如Grafana、Kibana),建议用短链接或带UTM参数的链接,方便后续统计点击量。比如[查看日志](https://kibana.example.com/app/discover#/?_a=(query:(match:(message:(query:'payment timeout',type:phrase)))),这样运维同事点进去,直接定位到相关日志。

5. 常见问题与排查技巧实录:那些文档里不会写的实战经验

在上百次帮同事和学员调试钉钉机器人后,我整理了一份“高频问题速查表”。这些问题,90%以上都源于对钉钉API细节的误解,而不是代码写错了。我把它们按发生频率排序,并附上我的独家排查口诀。

问题现象可能原因排查步骤我的实战口诀
消息发出去了,但没人收到@提醒atMobiles里手机号格式错误,或该号码未加入群聊1. 用正则^1[3-9]\d{9}$校验手机号;2. 登录钉钉网页版,搜索该手机号,确认其已加入目标群“@人靠手机号,不是靠名字;没进群,@破天也没用”
Markdown消息里链接点不动链接没用[文字](url)语法,而是直接写了http://xxx检查CONTENT变量,确认所有URL都包裹在[]()内;用在线Markdown预览工具(如dillinger.io)实时渲染验证“文本消息URL自动活,Markdown链接必须‘穿马甲’”
脚本运行报ModuleNotFoundError: No module named 'requests'Python环境没激活,或在错误的环境中安装了requests1. 运行which python(Mac/Linux)或where python(Windows),确认路径指向虚拟环境;2. 运行pip list,看requests是否在列表中“装requests前,先喊一声‘activate’,不然它不认识你”
403错误,但确定密钥和时间戳都对IP白名单限制,且当前网络IP不在白名单内1. 查看钉钉群设置里的IP白名单列表;2. 在浏览器访问https://api.ipify.org,获取当前公网IP;3. 将该IP添加到白名单“403不是密码错,是门禁卡没刷上;查IP,加白名单,两步到位”
消息内容中文乱码(显示为uXXXX)Python文件保存编码不是UTF-8用VS Code打开脚本 → 右下角点击编码(如“GBK”)→ 选择“Save with Encoding” → 选“UTF-8”“中文乱码不用慌,文件编码UTF-8是良方”

除了表格里的问题,还有几个“玄学”但真实存在的经验:

经验一:Webhook地址里的access_token别手抖复制漏字符
我亲眼见过三次,同事复制Webhook URL时,因为地址太长,鼠标拖动没拉到底,最后几位token被截断。结果脚本一直报403,查了两小时签名逻辑,最后发现是token少了一位。解决方案:复制后,把URL粘贴到文本编辑器里,用Ctrl+A全选,看光标是否移到了末尾。或者,用len()函数在Python里打印长度——标准token是32位,少于32位肯定错了。

经验二:atMobiles列表里不要有空格或换行
有时候从Excel里复制手机号,会带上不可见的空格或换行符。stock_functions.py里的正则校验能拦住大部分,但更保险的做法是在赋值时主动strip():

at_mobiles = [mobile.strip() for mobile in AT_MOBILE_LIST]

我已经把这个逻辑加到了最新版的stock_functions.py里,但如果你用的是旧版,记得手动加上。

经验三:测试时别用“测试”“test”当消息内容
钉钉有敏感词过滤机制,连续发送含“测试”“test”“demo”的消息,超过5次,机器人可能被临时限流。所以初次调试,内容尽量写成【首次运行】时间:2024-05-30 14:22,带时间戳,既明确又避开敏感词。

最后分享一个我压箱底的技巧:把Webhook地址和密钥做成环境变量,而不是硬编码在脚本里。虽然资源包里是硬编码(为了新手友好),但当你把它集成进生产系统时,应该改成:

import os
WEBHOOK_URL = os.getenv("DINGTALK_WEBHOOK_URL")
SECRET_KEY = os.getenv("DINGTALK_SECRET_KEY")

然后在运行前执行:

export DINGTALK_WEBHOOK_URL="https://..."
export DINGTALK_SECRET_KEY="xxx"
python 给钉钉发消息.py

这样做,一是安全(密钥不随代码入库),二是灵活(同一份代码,换环境变量就能切不同群)。这个技巧,我在给金融客户做告警系统时,是强制要求的合规项。

6. 实际部署与扩展建议:从脚本到生产级通知系统的跨越

当你已经能熟练发送测试消息,下一步就是思考:如何让这个轻量工具,真正扛起生产环境的通知重担? 这里没有银弹,只有基于真实场景的渐进式加固策略。我结合过去服务客户的案例,给出三条可立即落地的建议。

6.1 建立“消息分级”机制,避免告警疲劳

很多团队的告警系统,最大的问题是“所有消息一个待遇”。数据库慢查询、磁盘剩余10%、服务重启成功,全发到同一个群,还都@all。结果大家对告警麻木了,真正紧急的故障来了,反而没人理。

我的做法是,在stock_functions.py里新增一个send_alert_msg函数,它根据告警级别,自动选择不同的推送策略:

def send_alert_msg(level, title, content, at_mobiles=None, is_at_all=False):
    """
    发送分级告警消息
    level: "critical", "warning", "info"
    """
    if level == "critical":
        # 严重告警:@值班人 + 发送短信(需对接短信网关)
        send_markdown_msg(
            webhook_url=WEBHOOK_URL,
            title=f"🚨 {title}",
            text=content,
            at_mobiles=at_mobiles or get_oncall_mobile(),  # 从值班表获取
            is_at_all=False
        )
        # 同时调用短信API(此处省略)
    elif level == "warning":
        # 警告:只发群消息,不@人
        send_text_msg(
            webhook_url=WEBHOOK_URL,
            content=f"⚠️ {title}\n{content}",
            at_mobiles=[],
            is_at_all=False
        )
    else:  # info
        # 信息类:发到“系统日志”子群,不打扰主群
        send_text_msg(
            webhook_url=INFO_WEBHOOK_URL,  # 另一个Webhook
            content=f"ℹ️ {title}\n{content}"
        )

这个函数的核心思想是:把“发什么”和“怎么发”解耦。业务代码里只需要调用send_alert_msg("critical", "DB连接池耗尽", "..."),后续的@人逻辑、渠道选择、降级策略,全部封装在函数内部。这样,当值班规则变更时,你只需改get_oncall_mobile()函数,而不用去翻几十个业务脚本。

6.2 加入重试与降级,应对网络抖动

Webhook本质是HTTP请求,网络不稳定时,一次POST失败很正常。但很多脚本写成“发一次,成不成就算了”,导致关键告警丢失。我在生产环境的标准做法是:最多重试3次,每次间隔指数退避(1s, 2s, 4s),3次都失败则降级到备用通道(如邮件)。

stock_functions.py里可以这样增强_post_to_webhook函数:

import time
import random

def _post_to_webhook(url, payload):
    for attempt in range(3):
        try:
            response = requests.post(url, json=payload, timeout=10)
            response.raise_for_status()
            return response
        except requests.exceptions.RequestException as e:
            if attempt == 2:  # 最后一次尝试
                raise e
            # 指数退避:1s, 2s, 4s
            wait_time = 2 ** attempt + random.uniform(0, 0.5)
            time.sleep(wait_time)
    return None  # 不会执行到这里,raise已抛出

注意,这里加了timeout=10,防止请求卡死。而random.uniform(0, 0.5)是为了避免多个实例在同一时刻重试,造成雪崩。这个细节,是我在一个电商大促期间,为保障订单告警不丢,和SRE团队一起压测出来的最佳实践。

6.3 构建“通知效果”反馈闭环

发消息不是终点,确认消息被看到才是。钉钉本身不提供“已读回执”,但我们可以通过间接方式构建反馈:
- 链接追踪:所有Markdown里的跳转链接,都加上UTM参数,接入Google Analytics或自建埋点系统,统计点击量;
- 心跳探测:写一个独立脚本,每5分钟向机器人发送一条[HEARTBEAT]消息,如果连续3次失败,自动触发“通知通道故障”告警;
- 人工确认钩子:在严重告警消息末尾,加上一句“请回复【收到】确认”,然后用钉钉机器人监听群消息,匹配到“收到”就标记为已确认。

我在给一家物流客户做系统时,就实现了第三种。他们要求所有一级告警必须在15分钟内有人响应,否则自动升级给CTO。这个“回复确认”机制,成了他们SLA考核的关键指标。

这些建议,都不是资源包里现成的功能,而是当你开始用它解决真实问题时,自然生长出来的扩展方向。它的魅力正在于此:起点极低,但延展性极强;不绑架你的架构,只默默做好“把消息送到”的本分。

我个人在实际使用中发现,最有效的推广方式,不是写一份厚厚的文档,而是把给钉钉发消息.py直接发给开发同事,说:“把这个文件扔进你的项目目录,改三行,你的脚本就能发钉钉了。” 然后,当他们第一次看到告警消息出现在群里时,那种“原来这么简单”的惊喜感,就是最好的认可。技术的价值,从来不在多炫酷,而在多实在。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:这个资源包提供开箱即用的钉钉消息推送能力,核心是两个轻量脚本:stock_functions.py 封装了发送文本、Markdown消息的基础方法,给钉钉发消息.py 是可直接运行的示例,只需填入钉钉机器人的Webhook地址、签名密钥(如启用签名验证)和要发送的内容,就能立刻推送消息。支持灵活配置——比如在消息里@所有人或指定手机号、添加点击跳转的链接、自定义标题和正文格式。适用于服务器监控告警、定时任务执行结果通知、内部系统状态提醒等日常运维场景。不依赖复杂框架,只靠标准库+requests库(requirements.txt已列出),安装后改几行参数就能跑起来。配套B站视频(BV19i4y1d7xY)手把手演示如何在钉钉群创建机器人、获取Webhook、测试连通性,还详解常见错误码含义:400通常因JSON格式不对或字段缺失,403多因签名失效或IP不在白名单,视频里都给出对应排查步骤和修复方式。


本文还有配套的精品资源,点击获取
menu-r.4af5f7ec.gif

Python发送钉钉群消息通知教程 Python钉钉消息自动化教程:通过requests库与钉钉群机器人集成,支持文本、Markdown、链接等多样化消息类型发送,提供创建机器人及Webhook配置详解,助力企业实现通知、提醒等高效办公场景,提升团队沟通效率。 阅读详情

相关推荐

差分运放实战:如何快速计算带直流偏置的电路(附详细推导步骤)

本文详细解析了差分运放电路在带直流偏置设计中的核心计算方法和实战技巧。通过可视化参数关系和分步拆解,帮助工程师快速掌握电路设计精髓,包括虚短虚断原理、偏置电压计算及非理想因素处理,提升信号调理和传感器接口设计的效率与精度。

o4p5q6r7s的博客 408

分布式框架Celery五(Django发送邮件-短信-钉钉通知)

【代码】分布式框架Celery五(Django发送邮件-短信-钉钉通知)

yjjpp2301的专栏 1149

从音频录制到智能手表:Sigma-Delta ADC是如何在低功耗场景下‘欺骗’噪声的?

本文深入解析Sigma-Delta ADC在智能穿戴设备中的低功耗高精度实现原理,重点介绍其通过过采样和噪声整形技术‘欺骗’噪声的独特方法。以TWS耳机和医疗级健康监测为例,展示该技术如何在有限功耗预算下实现专业级信号采集,为消费电子设计提供关键解决方案。

weixin_30825581的博客 388

Python + 钉钉 实现消息通知

机器人配置主要看两部分,一个是访问地址及 Token 的获取,另一个是 安全设置,前者保证你能将消息准确发送到刚才新建的群里面,后者保证只有在满足你设定的拦截条件后消息才能发送到群里面。我们这里选择用第二种方式——加签,需要将上图中的 Webhook 地址 和 加签 的内容进行复制,等下第三步要用到。接下来,我们在 Python 环境中执行代代码,钉钉群里便可收到消息。上述代码中,除了汉字备注的部分,其余可视为固定写法。钉钉通过三种方式保证消息的安全发送,即下图所示的。

weixin_45720992的博客 1518

keil自动分配SDRAM空间设置使用

1.修改.sct文件。

qizhi321123的博客 1404

DeepSeek Harness 工程实践与高级特性:从测试到安全的完整指南

AI Agent 能执行命令、读写文件、自主决策,能力越强风险越大——删文件、泄密钥、死循环、竞态条件随时可能发生。本文是 DeepSeek Harness 系列第三篇,深入剖析其工程实践与高级特性:从单元测试到真实 API 冒烟测试的分层策略,拒绝 Mock 依赖、坚持"验证世界而非自我报告";从正交结果、规范化契约到 Dispose 静止的防御式编程铁律;以及跨平台多层进程沙箱、文件系统版本守卫、fail-closed 审批机制、模型编写的工作流引擎与上下文压缩等高级能力。

program哲学 206

【python办公自动化】钉钉机器人通知(指定人/所有人)

经常领导让你统计xx模块下的所有数据出来,以及艾特相关项目组人员每日通知、推送代码、执行自动化测试通知等等场景。python办公自动化,主要涉及 Office 自动化:通过 Python 操作 Office办公中常用的Word、Excel和 PPT,实现数据写入读取等操作,文件合并,模板批量生成,批量处理表格。 邮件自动化:通过 Python 的 smtplib 模块和zmail 模块发送指定格式的邮件: 文件自动化: 通过Python自带的 os 模块实现对文件和文件夹进行创建、读取、删除等操作,实现压缩

weixin_42665577的博客 1803

Android功耗系列专题理论之一:功耗优化分析思路简介

本文系统介绍了电子系统功耗分析方法,涵盖静态与动态功耗原理、电流波形分析技术和模块化拆解策略。重点阐述了PMIC与CPU协同管理机制、DVFS动态调节技术,以及通过示波器捕获波形特征定位异常的方法。针对亮屏等典型场景,提出三阶段对比分析法,并详细说明硬件/软件拆解方案及混合验证策略。文章还总结了常见问题模块(CPU、多媒体、外设)的排查流程,强调需结合日志分析、温度控制及重复测试确保数据可靠性,为功耗优化提供系统化解决方案。

1457

通过python实现发送钉钉个人工作通知

通过python实现发送钉钉个人工作通知

weixin_43587784的博客 3132

把 ABAP 接到外部世界的几条路, 从 Web Service 到 RFC、BAPI 与 IDoc 的完整理解

摘要: ABAP 的连接能力是其长期成为企业核心的关键,不仅支持通用协议(HTTP、SOAP、XML),还保留了 SAP 特有的技术(RFC、BAPI、IDoc)。Web Service 是跨系统通信的主轴,依赖 SOAP/WSDL 实现契约化协作,而 Enterprise Service 更强调业务语义的复用与治理。经典技术如 RFC 和 BAPI 因高效稳定仍广泛使用,尤其适合紧耦合场景。ABAP 通过分层工具箱(如代理生成、服务注册)实现灵活集成,平衡新旧技术,满足多样化的企业连接需求。 (字数:15

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 138

6、深入解析Microsoft 365核心服务对比与迁移策略

本文深入解析了Microsoft 365的核心服务,包括身份和设备管理、现代设备配置体验、Exchange和SharePoint的迁移策略以及Microsoft Teams的协作功能。同时探讨了迁移过程中需要考虑的安全控制措施,为组织规划和实施云迁移项目提供了全面的指导和建议。

k8s6orchestrator的博客 104

钉钉机器人Python实战指南:5种智能通知场景快速上手

想要快速构建企业级智能通知系统吗?钉钉自定义机器人结合Python的DingtalkChatbot库,让你在几分钟内实现专业的消息推送服务。这个强大的Python封装库支持文本、链接、Markdown、ActionCard和FeedCard五种消息类型,是自动化运维、项目监控和团队协作的终极利器。🚀 钉钉机器人是钉钉群的高级扩展功能,通过简单的Webhook接入就能将第三方服务信息聚合到钉钉群

gitblog_00956的博客 975

CKA-CN考试之路----2

部分知道就可以了,考试不用输入,后面不再复述.这里我们需要将两端内容凭借成1个yaml。执行题目中给的的命令进行测试。

Q先生 241

如何用Python快速开发钉钉群自定义机器人?超实用教程让办公效率飙升

DingtalkChatbot是一个功能强大的Python库,专为钉钉群自定义机器人消息开发而设计。通过这个工具,你可以轻松实现各种类型的消息推送,极大提升团队协作效率。无论是简单的文本通知,还是复杂的图文消息,都能通过简洁的代码快速实现。 ## 快速安装与初始化 要开始使用DingtalkChatbot,首先需要通过pip安装库。打开终端,执行以下命令: ```bash pip insta

gitblog_00280的博客 959

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

钉钉机器人Python封装库DingtalkChatbot:5种消息类型解决企业通知难题

在数字化转型浪潮中,企业如何高效地将系统通知、监控报警、自动化报告等信息推送到钉钉工作群?传统的手动复制粘贴不仅效率低下,还容易遗漏重要信息。DingtalkChatbot作为一款专业的钉钉群自定义机器人Python封装库,提供了5种强大的消息类型,帮助开发者轻松实现各类通知场景的自动化推送,让团队沟通更加高效智能。 ## 企业通知场景痛点与DingtalkChatbot解决方案 现代企业面临

gitblog_00093的博客 706

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Python钉钉机器人消息推送终极指南:5分钟实现企业级自动化通知

想要快速实现企业级自动化消息通知系统?Python钉钉机器人正是你需要的终极解决方案!这个强大的Python库让钉钉群消息推送变得异常简单,只需几行代码就能实现各种复杂的消息格式和交互功能。 ## 🚀 为什么选择钉钉机器人? 钉钉机器人是企业内部沟通和系统通知的完美桥梁。通过Python封装库,你可以: - **零门槛接入**:5分钟完成配置和部署 - **多样化消息**:支持文本、链接、

gitblog_01030的博客 599

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

终极指南:10分钟快速上手Python钉钉机器人消息推送

钉钉机器人是钉钉群的高级扩展功能,通过简单的Python封装,让你能够轻松实现各种自动化消息推送。无论是运维报警、项目通知、还是日常提醒,钉钉机器人都能帮你快速将信息同步到团队群聊中。🚀 钉钉机器人消息推送支持多种消息格式,包括文本、链接、Markdown、图片、操作卡片等,满足不同场景下的消息展示需求。 ## 快速安装钉钉机器人Python库 只需一行命令,即可安装钉钉机器人Python

gitblog_00451的博客 741

钉钉机器人Python开发终极指南:5分钟快速部署完整教程

钉钉机器人Python开发是自动化办公和团队协作的重要工具,通过DingtalkChatbot库可以快速实现钉钉群消息的自动发送功能。本教程将带你从零开始,快速掌握钉钉机器人Python开发的完整流程。 ## 🚀 快速入门:5分钟搞定钉钉机器人 ### 1. 一键安装步骤 首先安装钉钉机器人Python库,支持Python2和Python3: ```bash pip install Di

gitblog_00612的博客 1350

Python开发者如何用DingtalkChatbot高效集成钉钉机器人通知?

如果你正在寻找一种简单高效的方式将Python应用与钉钉机器人集成,DingtalkChatbot正是你需要的解决方案。这个Python库封装了钉钉群自定义机器人的所有消息类型,让你能够通过几行代码就实现从简单文本通知到复杂交互卡片的各种消息推送。无论是系统监控报警、自动化测试报告、项目进度同步还是日常提醒,DingtalkChatbot都能帮你快速构建稳定可靠的钉钉消息通知系统。 ## 为什么

gitblog_00446的博客 453

DingtalkChatbot:让Python轻松对接钉钉机器人,10分钟实现消息自动化推送

DingtalkChatbot是一款专为Python开发者设计的钉钉群自定义机器人消息封装工具,它能够帮助开发者快速实现钉钉消息的自动化推送功能。无论是企业通知、系统告警还是日常办公提醒,都能通过这个强大的工具轻松搞定。 ## 为什么选择DingtalkChatbot? 在日常工作中,我们经常需要将系统信息、业务数据或告警通知及时推送到钉钉群中。手动发送不仅效率低下,还容易遗漏重要信息。Din

gitblog_00877的博客 1002

Python钉钉机器人终极指南:5分钟实现智能消息推送

钉钉群机器人是提升团队协作效率的利器,通过Python封装库可以快速实现各种智能消息推送功能。无论你是需要发送系统监控告警、项目进度通知,还是日常运营消息,这个工具都能帮你轻松搞定。 ## 🔥 为什么选择钉钉机器人? 钉钉机器人提供了丰富的消息类型,让你的通知更加生动有趣: - **文本消息**:简单的文字推送,支持@特定成员 - **链接消息**:带标题、图片和跳转链接的卡片 - **M

gitblog_00683的博客 1091

终极指南:如何用DingtalkChatbot快速实现钉钉群自定义机器人消息推送

DingtalkChatbot是一个功能强大的Python封装库,专为简化钉钉自定义机器人消息发送而设计。它支持多种消息类型,包括Text、Link、Image、Markdown和ActionCard等,并且兼容钉钉官方的频率限制,确保消息稳定推送。无论是自动化告警、任务通知还是工作流集成,DingtalkChatbot都能帮助开发者轻松实现高效的钉钉消息交互。 ## ???? 快速安装Dingta...

gitblog_00734的博客 1558

如何高效使用Python钉钉机器人:5大实战技巧解析

想要让团队沟通更高效?钉钉自定义机器人是你的不二选择!DingtalkChatbot是一个强大的钉钉群自定义机器人消息Python封装库,它能让你轻松实现自动化消息推送、系统监控告警、团队协作提醒等功能。无论你是开发人员、运维工程师还是团队管理者,这个工具都能帮助你快速构建智能化的消息通知系统。 ## 一、为什么选择DingtalkChatbot? 在当今快节奏的工作环境中,及时的信息传递至关

gitblog_00413的博客 797

深度探索Python钉钉机器人:构建高效企业消息推送系统

DingtalkChatbot是一个强大的钉钉群自定义机器人Python封装库,能够帮助开发者轻松实现多种类型消息的自动化推送。这个Python钉钉机器人封装工具支持文本、Markdown、ActionCard、FeedCard等多种消息格式,是企业自动化通知和系统集成的理想选择。通过简洁的API设计,开发者可以快速集成钉钉机器人到现有工作流中,实现实时消息推送和团队协作自动化。 ## 🚀 快

gitblog_00818的博客 1171

轻松上手DingtalkChatbot:3个实用场景带你玩转钉钉机器人

DingtalkChatbot是一款功能强大的钉钉群自定义机器人消息Python封装工具,能帮助开发者轻松实现钉钉群消息的自动化发送与管理。无论是日常通知、数据监控还是团队协作,它都能提供高效便捷的解决方案。 ## 一、快速安装与初始化:5分钟搭建钉钉机器人 要开始使用DingtalkChatbot,首先需要通过以下命令克隆项目到本地: ```bash git clone https://g

gitblog_00081的博客 834

5分钟掌握钉钉机器人:Python自动化消息推送终极指南

DingtalkChatbot是一个专为钉钉群自定义机器人设计的Python封装库,让开发者能够轻松实现钉钉机器人消息推送功能。通过这个强大的工具,你可以快速构建自动化通知系统,将重要信息实时推送到钉钉群聊中。 ## 🚀 快速入门:3步开启消息推送之旅 想要快速上手钉钉机器人?只需要三个简单步骤: **第一步:安装库** ```python pip install DingtalkChat

gitblog_00671的博客 880
上一篇: MATLAB雷达回波处理包:含MTI滤波、多普勒分析与自适应CFAR检测全流程
下一篇: 锂电池SOC实时估算Simulink模型包(EKF算法+一阶RC等效电路,兼容MATLAB 2014a/2016a/2018b)
tech5
博客等级 码龄17年 52粉丝 1363原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值