想让 AI 干完活之后喊我一声,结果在钉钉里连踩两坑。
起因:浏览器关了,我怎么知道它干完了?
先交代下背景:我正在用 DeepSeek Harness 干一个真实项目(前端 + Java 后端),全程写在这篇《前端转全栈,用 DeepSeek Harness 照着参考项目把前后端做了》里。今天说的是中间冒出来的一个小需求。
我最先问的是这个:「如果在 dsh web 里开了任务,然后我把浏览器关了,任务还会继续跑吗?关了之后我怎么知道它做完了?」
(这问题是在网页端单独开的 DeepSeek 对话里问的,不是在 DSH 里。)
DeepSeek 推荐我装通知插件,其中 dsh-notify-center 支持接钉钉。我平时用钉钉,就选它。
配置:一个只有我和机器人的群
钉钉的通知要走群里的自定义机器人,而机器人必须建在群里。这里有个小麻烦:钉钉的群至少要两个人才能建,没法自己跟自己开个群。
我的做法是找个同事当「工具人」,分三步:
- 拉一个同事临时建个群(随便起个名,比如「通知测试」)
- 进群设置 → 智能群助手 → 添加「自定义」机器人,起个名,拿到 Webhook 地址
- 把同事移出群
这样群里就只剩我和机器人,通知不会打扰到别人。
第一个坑:只有系统通知,没有钉钉
照着说明配完,跑个任务试了下。任务完成只有系统通知,钉钉一点动静都没有。
我直接在 DSH 里问:「我装了 dsh-notify-center,也加了钉钉配置,怎么测到底成没成功?」它自己查了一遍,给了三段结论:
- 插件加载成功,URL 也配上了
- access_token 和密钥是有效的,它用钉钉的动态签名算法(timestamp + HMAC-SHA256)发了条测试消息,返回
{"errcode":0,"errmsg":"ok"} - 但插件真发通知会失败,用配置里的 URL 原样 POST,返回
{"errcode":310000,"errmsg":"机器人发送签名不匹配"}

根因也挺典型。我在 URL 里写了 sign=SEC...,以为那就是签名,其实 SEC 开头的是加签密钥本身。钉钉的「加签」模式要求每次请求动态算 sign(时间戳加密钥做 HMAC-SHA256),还要带 timestamp,签名一小时就过期。
而这个插件 dsh-notify-center(v0.2.1)的 deliverWebhook 是拿配置的 URL 原样 POST,不做任何签名计算,这一点是它读了源码 webhooks.js 确认的。所以只要机器人保持「加签」,这插件就永远发不出去。
它给了两个方案,我选了 A:把机器人安全设置从「加签」改成「自定义关键词」,关键词填 DSH(消息以 【DSH 任务完成】 开头),URL 删掉 sign=... 那部分。

改完,任务完成或者出错,钉钉群就收到 【DSH 任务完成】... 了。

第二个坑:通知太吵了
通知通了之后,我又发现不对:不光是真做任务会通知,普通聊几句,比如我回一句「收到了」,它也会往钉钉里推一条。我要的是「真正跑了任务才通知」,不是每一轮对话都刷屏。
又让 DSH 帮我查。它把插件代码翻了一遍,给的结论是:
- 插件把每一轮 turn/end 都当成「任务完成」来通知
- 其实它内部已经记了这轮调用过哪些工具(
envelope.tools):纯对话时这个数组是空的,真执行任务时才有内容 - 但现在的判断逻辑没用上这个字段,插件也没有现成的配置开关
所以它的修法是直接改本地插件代码,给 shouldNotify 加一条判断:
js
if (envelope.kind === 'completed' && !(envelope.tools?.length))
return false; // 纯对话:本轮没调用任何工具 → 不通知
改完它还验了 4 个场景:
| 场景 | 是否通知 |
|---|---|
| 纯对话(没调用工具) | 不通知 |
| 执行任务(调用了工具) | 通知 |
| 出错 error | 照常通知 |
| 等待审批 approval | 照常通知 |
两个要注意的地方,它也讲清楚了:一是改的是磁盘文件,要重启 dsh web 才生效;二是改的是本地插件,以后插件一升级就会被覆盖,得重新打(它留了备份 policy.js.bak,想回退也方便)。
一点反思
这两个坑跑下来,最让我意外的不是「解决了」,而是解决的方式。
「建议勾选加签」是网页端 DeepSeek 对话给的;「加签不兼容」「纯对话也通知」这些,是 DSH 自己读源码、发测试消息、改代码查出来的。一个给的是「听起来对」的建议,一个做的是「动手验证」的活。这中间我自己没查任何外部资料。
当然,这也说明插件生态还在早期:要么不支持加签,要么没有「仅任务通知」的开关,都得自己动手补。图省事的话,给插件作者提个 issue 更一劳永逸。
如果这篇帮你少踩一个坑,点个赞 / 收藏。同款问题的细节欢迎评论区补充。
我这次是拿 DeepSeek Harness 干真实项目时踩的这些坑,整个项目怎么让它做的,我单独写了一篇:《前端转全栈,用 DeepSeek Harness 照着参考项目把前后端做了》 (链接:juejin.cn/post/767595...