如何使用 Python 脚本定时调用钉钉机器人发送日报消息?

文章导读
最稳妥的方案是用 Python 的 requests 库构造 HTTP 请求,配合操作系统的定时任务(如 Linux cron 或 Windows 任务计划)来触发,适合需要每天固定时间推送统计数据的场景。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 参考来源
A A

最稳妥的方案是用 Python 的 requests 库构造 HTTP 请求,配合操作系统的定时任务(如 Linux cron 或 Windows 任务计划)来触发,适合需要每天固定时间推送统计数据的场景。

先说结论:这是典型的 Webhook 调用场景,重点在于安全签名配置和定时任务的稳定性。

  • 适合:运维监控、每日构建结果、业务数据简报等固定格式通知。
  • 先看:钉钉群机器人安全设置(自定义关键词或签名),否则请求会被拦截。
  • 建议:优先用系统级定时任务,避免 Python 脚本长期驻留占用资源。

命令速用版

import requests
import json
import time
import hmac
import hashlib
import base64
import urllib.parse

# 替换为你的 Webhook 地址和密钥
webhook = 'https://oapi.dingtalk.com/robot/send?access_token=YOUR_TOKEN'
secret = 'YOUR_SECRET'

def calculate_sign(secret):
timestamp = str(round(time.time() * 1000))
secret_enc = secret.encode('utf-8')
string_to_sign = '{}\n{}'.format(timestamp, secret)
string_to_sign_enc = string_to_sign.encode('utf-8')
hmac_code = hmac.new(secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest()
sign = urllib.parse.quote_plus(base64.b64encode(hmac_code))
return timestamp, sign

def send_message():
    timestamp, sign = calculate_sign(secret)
    url = f"{webhook}×tamp={timestamp}&sign={sign}"
    data = {
        "msgtype": "text",
        "text": {
            "content": "这是每日日报测试消息"
        }
    }
    res = requests.post(url, data=json.dumps(data), headers={'Content-Type': 'application/json'})
    print(res.json())

if __name__ == "__main__":
    send_message()

为什么会这样

钉钉机器人本质是一个接收 HTTP POST 请求的 Webhook 接口。Python 脚本负责组装数据并发送请求,而定时任务负责在特定时间点唤醒脚本。之所以推荐系统级定时任务(如 cron),是因为它比 Python 内部的 while 循环睡眠更可靠,不会因为脚本崩溃而导致后续任务全部丢失,且不会长期占用服务器内存。

如何使用 Python 脚本定时调用钉钉机器人发送日报消息?

分步处理

  1. 创建机器人:在钉钉群设置中找到“智能群助手”,添加自定义机器人,复制 Webhook 地址。如果开启了“加签”安全设置,务必保存好 Secret。
  2. 编写脚本:将上述代码保存为 daily_report.py。注意替换 webhook 和 secret 变量。如果机器人只设置了关键词,代码中发送的内容必须包含该关键词。
  3. 配置定时:
    • Linux:执行 crontab -e,添加一行如 0 18 * * * /usr/bin/python3 /path/to/daily_report.py 表示每天 18 点执行。
    • Windows:使用“任务计划程序”,创建基本任务,触发器设为每天,操作设为启动程序 python.exe,参数填脚本路径。
  4. 权限检查:确保运行定时任务的用户有权限执行 Python 脚本,且服务器能访问外网(钉钉 API 地址)。

怎么验证是否生效

手动执行一次 python daily_report.py,观察终端输出的 JSON 响应。如果 errcode 为 0,表示发送成功。随后检查钉钉群内是否收到消息。配置定时任务后,等待到达设定时间,查看系统日志(Linux 可查看 /var/log/cron 或 journalctl)确认任务是否按时触发。

常见坑

  • 签名失效:如果开启了加签,timestamp 必须使用当前时间,且服务器时间需与网络时间同步,误差过大会被拒绝。
  • 关键词不匹配:若安全设置选了“自定义关键词”,消息内容里必须完整包含该词,否则接口会返回拦截提示。
  • 编码问题:发送中文内容时,确保脚本文件保存为 UTF-8 格式,并在代码中指定 json.dumps 确保非 ASCII 字符正常显示。
  • 网络超时:生产环境建议给 requests.post 设置 timeout 参数,避免网络波动导致脚本卡死,影响定时任务下一次执行。

参考来源

  • 钉钉开放平台 - 群机器人消息发送接口文档
  • 钉钉开放平台 - 自定义机器人安全设置说明