让 AI 执行长任务时,最浪费时间的往往不是任务本身,而是等待。
跑测试、分析日志、批量修改代码、生成报告,这些工作可能需要十几分钟甚至几个小时之久。人不可能一直盯着 Codex 窗口,但如果隔一会儿就回来刷新一次,又失去了自动化的意义。
我的解决办法很简单:让 Codex 完成任务并验证结果后,主动给钉钉发一条消息。
最终我保留了两条发送链路:
- 通过群机器人 Webhook 发通知,适合 AI 长任务完成提醒。
- 给钉钉联系人发个人消息,例如"文件小助手",适合保存普通结果。
这两种方式看起来相似,底层依赖却完全不同。理解这个区别,能少走很多弯路。
首选方案:用群机器人通知长任务完成
群机器人是最适合 Codex 的方案。
它只依赖一个 Webhook 地址和网络,不要求电脑打开钉钉客户端,也不要求当前账号保持登录。即使更换电脑,只要把 Webhook 和 Skill 配置迁移过去,就能继续使用。
更重要的是,机器人向群里发送消息后,钉钉会产生群聊未读提示。相比"文件小助手"里的普通消息,这种提醒更醒目,适合在 AI 完成长任务后通知自己。
日常使用时,我只需要对 Codex 说:
text
群发 任务已完成
或者在任务开始前直接交代:
text
完成任务并验证结果后,钉钉通知我。
Codex 会在任务结束后发送类似下面的消息:
text
任务已完成
2026-10-16 15:29:35
配置钉钉群机器人
先在钉钉中创建一个群,进入群设置,添加"自定义机器人",然后配置安全关键词,例如:
text
ai通知
创建完成后,钉钉会生成一个 Webhook:
text
https://oapi.dingtalk.com/robot/send?access_token=YOUR_TOKEN
Webhook 本质上是发送凭证。谁拿到它,谁就能向这个群发送消息,因此不要把真实地址提交到 Git、截图公开或放进公开文章。
机器人发送消息时必须满足安全关键词规则。可以把关键词放进 Markdown 消息的标题里,这样正文仍然可以保持干净。
下面是一个脱敏后的 curl 示例:
bash
WEBHOOK='https://oapi.dingtalk.com/robot/send?access_token=YOUR_TOKEN'
TIME=$(TZ=Asia/Shanghai date '+%Y-%m-%d %H:%M:%S')
curl "$WEBHOOK" \
-H 'Content-Type: application/json' \
-d "{
\"msgtype\": \"markdown\",
\"markdown\": {
\"title\": \"ai通知\",
\"text\": \"任务已完成\\n\\n${TIME}\"
}
}"
成功时,钉钉通常返回:
json
{"errcode":0,"errmsg":"ok"}
这里有一个关键结论:群机器人不需要 dws。 dws 只是对钉钉能力的一层命令行封装,直接调用 Webhook 同样可以完成群通知。
把发送规则沉淀成 Codex Skill
每次都向 Codex 解释 Webhook、关键词和时间格式很麻烦,更稳妥的做法是把规则写进 Skill。
在 macOS 上创建:
text
~/.codex/skills/dingtalk-notifier/SKILL.md
可以使用下面这份精简模板:
markdown
---
name: dingtalk-notifier
description: 发送钉钉通知。用户要求群发、钉钉通知或任务完成后通知时,通过默认群机器人发送;用户指定钉钉联系人时发送个人消息。
---
# 钉钉通知
消息只发送一次。状态不明时先检查结果,不自动重发。
## 使用机器人发送群通知
1. 使用默认群 Webhook:`https://oapi.dingtalk.com/robot/send?access_token=YOUR_TOKEN`。
2. 使用标题 `ai通知` 满足机器人的安全关键词要求。
3. 在正文最后换行追加上海时间 `YYYY-MM-DD HH:MM:SS`。
4. 通过 Webhook 发送,仅在返回 `errcode: 0` 时报告成功。
5. 不在回复或日志中输出 Webhook。
## 给个人发送消息
1. 使用钉钉连接器、`dws` 或已登录的 macOS 钉钉客户端。
2. 发送前确认联系人名称与用户指定的名称完全匹配,例如"文件小助手"。
3. 在正文最后换行追加上海时间 `YYYY-MM-DD HH:MM:SS`。
4. 发送后核对最新聊天记录,再报告是否成功。
配置后,群发 xxx 会走机器人 Webhook;给钉钉上的文件小助手发送 xxx 会走个人消息流程。一个 Skill 就可以完成路由,不需要分别维护两份规则。
给个人发送消息为什么不同
个人联系人没有群机器人的 Webhook。要给"文件小助手"或其他联系人发送消息,必须通过钉钉账号能力完成,通常需要以下方式之一:
- 使用已经授权的
dws。 - 使用可访问钉钉的连接器。
- 操作 Mac 上已登录的钉钉客户端。
例如:
text
给钉钉上的文件小助手发送:任务已完成
这种方式适合保存结果,但普通个人消息不一定产生醒目的未读提示。因此,我把群机器人设为长任务完成通知的默认方式,把个人消息作为补充。
几个容易踩的坑
第一个坑是安全关键词不匹配。钉钉会返回 310000,提示消息中没有包含机器人配置的关键词。检查消息标题或正文是否包含关键词即可。
第二个坑是把群名当成路由条件。机器人实际绑定的是 Webhook,不是群名。修改群名不会影响发送;删除机器人、重置 Webhook 或把 Skill 中的 Token 换错,才会改变投递结果。
第三个坑是失败后盲目重试。网络超时不等于发送失败,自动重试可能让群里出现两条相同消息。正确做法是只发送一次,根据钉钉的 JSON 回执判断业务是否成功;状态不明确时先检查,不要立刻重发。
第四个坑是泄露 Webhook。真实 Token 不应该出现在公开博客、开源仓库和聊天截图中。如果已经泄露,应立即在钉钉中重置机器人 Webhook。
最后
这套方案真正有价值的地方,不是"用 Codex 发了一条钉钉消息",而是把长任务从需要人工盯守的流程,变成了完成后主动通知的异步工作流。
我的实际选择很明确:长任务完成提醒优先走群机器人,个人联系人消息只作为补充。 前者不依赖钉钉客户端和 dws,迁移简单,还有醒目的群聊未读提示;后者适合把结果留在文件小助手中,方便随后查阅。
当 Codex 能在任务完成、验证通过或执行失败后主动通知你,AI 才真正从"需要盯着使用的工具"变成了"可以放心交付工作的助手"。
