OpenClaw通过GitHub API抓取当日提交记录并生成日报:1. 调用API获取代码提交与TAPD/Jira任务;2. 用LLM归纳为三类并提取关键信息;3. 输出Markdown模板并填充数据;4. 推送至Notion和钉钉;含三层校验防错。

用 GitHub REST API 获取当天提交记录
Slack 每日汇总的前提是能准确拿到「今天」的 GitHub 动态,不能靠本地时区硬算,得对齐 GitHub API 的时间标准(UTC)。GET /users/{username}/events 返回的是最近 30 条事件,但不支持按日期过滤;更可靠的是用 GET /repos/{owner}/{repo}/commits 加 since 和 until 参数——这两个参数接受 ISO 8601 时间字符串(如 2024-05-20T00:00:00Z),且必须是 UTC。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 用
datetime.utcnow().date()算出今天,再构造since为当日 00:00:00Z,until为次日 00:00:00Z - GitHub 对未认证请求限流极严(60次/小时),务必在请求头里加
Authorization: token {your_token}(用 Personal Access Token,scope 至少含repo) - 别一次性查所有仓库,先用
GET /user/repos拿到你有权限的私有+公开仓库列表,再逐个查 commit —— 否则容易被 403 或超时打断
用 Slack WebClient 发送格式化消息
Slack 官方推荐用 slack_sdk.WebClient,不是简单 POST 到 webhook。因为 daily summary 往往含多条提交、多个仓库,需要区块(blocks)布局,而 webhook 只支持基础 text 字段,无法展开折叠、加图标、分组。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 初始化 client 时传
token(Bot User OAuth Token,scope 含chat:write和chat:write.public) - 消息体用
blocks字段:每条 commit 做一个section,仓库名用header区块隔开,避免堆成大段文字 - commit message 超过 100 字要截断并加「…」,否则 Slack 渲染失败;URL 必须是完整
https://开头,相对路径会丢 - 发送前检查
channel_id是否有效——用conversations.list查一次,缓存 ID 比每次查名字更稳
用 cron 或 GitHub Actions 触发定时执行
本地跑 cron 最简单,但机器关机就漏发;用 GitHub Actions 更可靠,但要注意它默认用 UTC 时区,且 schedule 触发器最小粒度是分钟级,不能精确到「每天上午 9 点」这种需求——得靠脚本内判断是否「今天还没发过」。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- Linux 上加 cron:
0 9 * * * cd /path/to/script && python daily_github.py >> /var/log/github-slack.log 2>&1(注意设好PYTHONPATH和虚拟环境) - GitHub Actions 中,用
on.schedule: ['0 9 * * *'](UTC 时间),然后在脚本开头用if not today_sent(): exit(0)防重发 - 无论哪种方式,都要在脚本里加异常捕获和日志输出——比如
requests.exceptions.ConnectionError或slack_sdk.errors.SlackApiError,否则失败了你根本不知道
处理常见失败场景:Token 过期、仓库权限变更、Slack channel 归档
这类自动化最怕「静默失败」:脚本跑完没报错,但 Slack 没收到消息,也没日志提示。核心问题往往不在逻辑,而在凭证或环境突变。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- GitHub Token 失效时,API 返回
401 Unauthorized,但错误信息是{"message":"Bad credentials","documentation_url":"https://docs.github.com/rest"}—— 脚本里要显式检查response.status_code == 401并告警 - Slack channel 被设为私有或归档后,
chat.postMessage会返回not_in_channel错误,需提前用conversations.join尝试加入(Bot 必须是 channel 成员) - 仓库改名或删掉后,
/repos/{owner}/{repo}/commits返回404 Not Found,不要跳过,应记录日志并继续下一个仓库
真正麻烦的不是写一次脚本,而是让这玩意连续三个月不掉链子——时间偏移、Token 到期、Slack 政策更新、GitHub 接口微调,每个都可能让消息停发三天你才发现。



















