GitHub Commits 自动推送钉钉机器人:10分钟搭建自动化通知

还在手动盯着 GitHub 仓库等同事合并代码?想不想每次 push 自动收到钉钉通知?

今天手把手教你在 10 分钟内搭好这套自动化流程。

原理简述

GitHub Webhook → 你的服务器 → 钉钉群机器人 → 群里收到消息

整个链路无付费依赖,零成本。

准备材料

  • 一个 GitHub 仓库(public/private 都行)
  • 一个钉钉群 + 群机器人(群设置 → 智能群助手 → 添加机器人 → 自定义)
  • 一台能跑 Python 的服务器(Linux/VPS/树莓派都行)

第一步:获取钉钉机器人 Webhook

在钉钉群机器人设置页面,复制 Webhook 地址,长这样:

https://oapi.dingtalk.com/robot/send?access_token=xxxxx

注意:这个 token 相当于密码,别公开分享!

第二步:写 Python 接收脚本

# dingtalk_github_bot.py
import requests
import json
import hmac
import hashlib
import time
import base64
import urllib.parse
from flask import Flask, request, jsonify

app = Flask(__name__)

DINGTALK_WEBHOOK = "你的钉钉Webhook地址"
SECRET = "你的加密密钥(选填,推荐加上)"

def sign(secret):
    timestamp = str(round(time.time() * 1000))
    string_to_sign = '{}
{}'.format(timestamp, secret)
    hmac_obj = hmac.new(secret.encode('utf-8'), string_to_sign.encode('utf-8'), digestmod=hashlib.sha256)
    sign = base64.urlsafe_b64encode(hmac_obj.digest()).decode('utf-8')
    return timestamp, urllib.parse.quote(sign)

def send_to_dingtalk(msg):
    headers = {'Content-Type': 'application/json'}
    if SECRET:
        timestamp, sign_val = sign(SECRET)
        full_url = "{}&timestamp={}&sign={}".format(DINGTALK_WEBHOOK, timestamp, sign_val)
    else:
        full_url = DINGTALK_WEBHOOK
    
    payload = {
        "msgtype": "markdown",
        "markdown": {
            "title": "GitHub 推送通知",
            "text": msg
        }
    }
    requests.post(full_url, headers=headers, data=json.dumps(payload))

@app.route('/webhook', methods=['POST'])
def webhook():
    data = request.json
    action = data.get('action', 'pushed')
    sender = data.get('sender', {}).get('login', 'unknown')
    repo = data.get('repository', {}).get('full_name', '')
    
    msg = "## 🚀 {}

**操作:** {}
**触发者:** @{}

> 自动通知来自 GitHub Webhook".format(repo, action, sender)
    send_to_dingtalk(msg)
    return jsonify({'status': 'ok'})

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

⚠️ 注意:钉钉要求 HMAC-SHA256 签名,base64 编码需要用 urlsafe_b64encode 避免 +/= 字符导致签名失败。

第三步:在 GitHub 配置 Webhook

  1. 进入 GitHub 仓库 → Settings → Webhooks → Add webhook
  2. Payload URL:填你的服务器地址,如 https://your-server.com/webhook
  3. Content type:选 application/json
  4. Secret:填第二步设置的 SECRET(需一致)
  5. Events:选 PushPull request(按需)
  6. Active:✅ 勾选

点击 Add webhook 之后,GitHub 会发一个测试请求,钉钉群里应该立刻收到通知了!

第四步:部署到服务器

# 用 screen 或 systemd 保持后台运行
nohup python3 dingtalk_github_bot.py > bot.log 2>&1 &

# 或者用 gunicorn(生产环境推荐)
pip install gunicorn
gunicorn -w 2 -b 0.0.0.0:5000 dingtalk_github_bot:app

注意事项

  • 服务器记得开放 5000 端口(或用 nginx 反向代理到 443)
  • HTTPS 是必须的,钉钉不支持 HTTP 明文
  • 可以用 Let’s Encrypt 免费证书
  • 如果用 Nginx 代理,注意加 proxy_set_header Content-Type application/json;
  • 钉钉机器人每分钟限 20 条消息,超了会被限流

效果展示

配置完成后,每次有人 push 代码或合并 PR,钉钉群里都会收到格式化的通知卡片,包含仓库名、操作类型、触发者,一目了然。

总结:全程 10 分钟,零成本,GitHub + 钉钉强强联合,团队协作效率 up!

有问题欢迎评论区交流 👇

Leave a Comment