Skip to content

钉钉(DingTalk)对接(推荐方案 + 自定义渠道扩展)

结论先说:当前 OpenClaw 的“内置/官方扩展”里未看到钉钉 channel 插件,因此钉钉对接建议优先走 Webhook → OpenClaw Hooks 的桥接方案;如果你要“像飞书/Telegram 那样原生渠道体验”,则需要开发一个 自定义渠道插件


方案 A(推荐):钉钉 Webhook → 你的桥接服务 → OpenClaw Hooks

A1) 架构与流程(标准)

钉钉 → 桥接服务 → OpenClaw Hooks → Agent 的标准流程

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 回合)
  • 出站回复(两种策略):
    1. 简单版:只把钉钉消息注入 OpenClaw,不把回复推回钉钉(你在 Control UI/别的渠道看结果)
    2. 完整版:桥接服务拿到 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