还在手动盯着 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 = "{}×tamp={}&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
- 进入 GitHub 仓库 → Settings → Webhooks → Add webhook
- Payload URL:填你的服务器地址,如
https://your-server.com/webhook - Content type:选
application/json - Secret:填第二步设置的 SECRET(需一致)
- Events:选
Push和Pull request(按需) - 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!
有问题欢迎评论区交流 👇