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

相关推荐
码事漫谈8 小时前
黄仁勋被裁第一天,就收到了橄榄枝
后端
金銀銅鐵9 小时前
带您看懂字节码指令(二):空循环里有什么
java·后端·ai编程
飞哥数智坊10 小时前
打造自己的 Personal Agent,从抄大肥鱼作业开始
人工智能·deepseek
皮皮林55110 小时前
比 Xshell 还好用的 SSH 客户端神器,MobaXterm 太爱了!
后端
我不会起名字32211 小时前
会话缓存失效排查:区分 Redis 失效与节点广播
redis·后端·go·即时通讯·im·故障排查
深入云栈13 小时前
Netty 4.2.x 源码深度解析 (二十三):ByteBuf 核心设计 —— 索引、类型与零拷贝
java·后端·架构
JackJiang13 小时前
IM踩坑:聊天消息ID怎么设计?一个UUID搞不定,我用双ID解决
后端·架构
开心猴爷13 小时前
iOS 上架 App 流程
后端·ios
code_Bo13 小时前
不只命令行:我把跨 Agent 会话同步做成了桌面应用
前端·javascript·后端
用户83562907805114 小时前
使用 Python 控制 Excel 工作表的分页位置
后端·python