DeepSeek Harness 接钉钉通知,踩了两个坑:签名不匹配 + 纯对话刷屏

想让 AI 干完活之后喊我一声,结果在钉钉里连踩两坑。

起因:浏览器关了,我怎么知道它干完了?

先交代下背景:我正在用 DeepSeek Harness 干一个真实项目(前端 + Java 后端),全程写在这篇《前端转全栈,用 DeepSeek Harness 照着参考项目把前后端做了》里。今天说的是中间冒出来的一个小需求。

我最先问的是这个:「如果在 dsh web 里开了任务,然后我把浏览器关了,任务还会继续跑吗?关了之后我怎么知道它做完了?」

(这问题是在网页端单独开的 DeepSeek 对话里问的,不是在 DSH 里。)

DeepSeek 推荐我装通知插件,其中 dsh-notify-center 支持接钉钉。我平时用钉钉,就选它。

配置:一个只有我和机器人的群

钉钉的通知要走群里的自定义机器人,而机器人必须建在群里。这里有个小麻烦:钉钉的群至少要两个人才能建,没法自己跟自己开个群。

我的做法是找个同事当「工具人」,分三步:

  1. 拉一个同事临时建个群(随便起个名,比如「通知测试」)
  2. 进群设置 → 智能群助手 → 添加「自定义」机器人,起个名,拿到 Webhook 地址
  3. 把同事移出群

这样群里就只剩我和机器人,通知不会打扰到别人。

第一个坑:只有系统通知,没有钉钉

照着说明配完,跑个任务试了下。任务完成只有系统通知,钉钉一点动静都没有。

我直接在 DSH 里问:「我装了 dsh-notify-center,也加了钉钉配置,怎么测到底成没成功?」它自己查了一遍,给了三段结论:

  1. 插件加载成功,URL 也配上了
  2. access_token 和密钥是有效的,它用钉钉的动态签名算法(timestamp + HMAC-SHA256)发了条测试消息,返回 {"errcode":0,"errmsg":"ok"}
  3. 但插件真发通知会失败,用配置里的 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...

相关推荐
码事漫谈6 小时前
多人共用一个 key,缓存命中率会不会因此降低?
后端
考虑考虑7 小时前
docker compose环境变量替换
运维·后端·自动化运维
武雄(小星Ai)8 小时前
飞书API上传26MB文件偶发失败:错误码9499与空响应体排坑实录
后端·api·排坑实录
徐小夕8 小时前
JitWord 4.0 万字分享:从协同工具到AI Word操作系统,聊聊3年产品创业史
前端·vue.js·后端
冬奇Lab9 小时前
DeepSeek Harness 系列(03):工具系统——给 Agent 装上手
人工智能·deepseek
geovindu10 小时前
CSharp: Observer Pattern
开发语言·后端·观察者模式·设计模式·c#·.netcore·行为模式
Flynt10 小时前
把公司项目迁到 Spring Boot 4.0:编译通过只是开始
java·spring boot·后端
IT_陈寒10 小时前
Redis误用keys命令把生产环境搞崩了,血的教训
前端·人工智能·后端
她的男孩11 小时前
多租户和数据权限怎么共存?扒完拦截器注册链路,我找到 4 个隐蔽的坑
java·后端·架构
用户83562907805111 小时前
使用 Python 设置 Excel 页眉和页脚
后端·python