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...

相关推荐
程序员鱼皮1 小时前
16 个超火的 DeepSeek Harness 插件,大肥鱼已经落后 N 个版本了。。。
前端·后端·ai编程
步行cgn1 小时前
Spring Cache 详解:Spring 框架的缓存抽象
后端
eralong1 小时前
Java IO 与 NIO
java·后端
量化小c1 小时前
从数据到策略:QuantDash + DuckDB 搭建 5 分钟 K 线本地量化数据仓库
后端·github
马可家的菠萝1 小时前
AI Agent Demo 10 分钟就能跑,真正难的是让它 200 个场景都别乱来
前端·后端·aigc
菜鸟谢1 小时前
Rust 数据类型 完整超详细知识点
后端
菜鸟谢1 小时前
Rust let / static / const 完整详解
后端
超超不吵吵1 小时前
Java AI转型实战(三):第一次调用大模型API,拿到AI回复
后端
名字还没想好☜1 小时前
Go 1.23 range-over-func 迭代器实战:自定义可迭代类型、提前退出与惰性求值
开发语言·后端·golang·go·迭代器