钉钉(DingTalk)对接(推荐方案 + 自定义渠道扩展)
结论先说:当前 OpenClaw 的“内置/官方扩展”里未看到钉钉 channel 插件,因此钉钉对接建议优先走 Webhook → OpenClaw Hooks 的桥接方案;如果你要“像飞书/Telegram 那样原生渠道体验”,则需要开发一个 自定义渠道插件。
方案 A(推荐):钉钉 Webhook → 你的桥接服务 → OpenClaw Hooks
A1) 架构与流程(标准)
A2) OpenClaw 侧:开启 Hooks
编辑 ~/.openclaw/openclaw.json(示例):
json5
{
hooks: {
enabled: true,
token: "<SHARED_SECRET>",
path: "/hooks",
// 可选:限制 hooks 调用能指定的 agentId
allowedAgentIds: ["main", "hooks"]
}
}重启网关后,hooks 将在 gateway 的 HTTP 服务下生效。
A3) 桥接服务要做哪些事(必做清单)
- 校验钉钉回调签名(防伪造)
- 时间戳/nonce 防重放
- 把“富结构消息”归一化为纯文本(保留:发送人、群、时间、正文)
- 调用 OpenClaw:
POST /hooks/wake(只注入系统事件)或POST /hooks/agent(触发一次隔离 agent 回合)
- 出站回复(两种策略):
- 简单版:只把钉钉消息注入 OpenClaw,不把回复推回钉钉(你在 Control UI/别的渠道看结果)
- 完整版:桥接服务拿到 OpenClaw 生成结果后,再调用钉钉 API 发回群/私聊
推荐完整版:这样钉钉里就像“真正对话”。
方案 B:开发自定义钉钉渠道插件(更像原生渠道)
如果你希望:
openclaw channels add能直接选择“DingTalk”- OpenClaw 能自己维护账号、多群路由、配对策略
那么需要写一个 channel plugin,把钉钉的入站事件与出站发送封装为 OpenClaw 的渠道适配层。
你可以参考本教程的《自定义渠道开发》章节(见下文链接)。
常见问题
Q1:为什么不直接写 openclaw channels add --channel dingtalk?
因为渠道 ID 必须由 OpenClaw 内置或插件注册。当前本机安装的扩展列表里未看到 dingtalk 插件,所以命令无法保证存在。
Q2:桥接服务部署在哪里最好?
- Cloudflare Worker:省运维、适合 webhook 入口
- 自己服务器:更灵活(尤其是你要做媒体转发/长任务)
参考
- OpenClaw Webhooks/Hooks 文档(/hooks):docs → automation/webhook
- 自定义渠道开发:见
guides/custom-channel