DingTalk Channel for OpenClaw
钉钉企业内部机器人 Channel 插件,使用 Stream 模式(无需公网 IP)。
功能特性
- ✅ Stream 模式 — WebSocket 长连接,无需公网 IP 或 Webhook
- ✅ 私聊支持 — 直接与机器人对话
- ✅ 群聊支持 — 在群里 @机器人
- ✅ 多种消息类型 — 文本、图片、语音(自带识别)、视频、文件
- ✅ Markdown 回复 — 支持富文本格式回复
- ✅ 互动卡片 — 支持流式更新,适用于 AI 实时输出
- ✅ 完整 AI 对话 — 接入 Clawdbot 消息处理管道
安装
方法 A:通过 npm 包安装 (推荐)
手动通过 npm 包名安装:
openclaw plugins install @soimy/dingtalk方法 B:通过本地源码安装
如果你想对插件进行二次开发,可以先克隆仓库:
# 1. 克隆仓库
git clone https://github.com/soimy/openclaw-channel-dingtalk.git
cd openclaw-channel-dingtalk
# 2. 安装依赖 (必需)
npm install
# 3. 以链接模式安装 (方便修改代码后实时生效)
openclaw plugins install -l .方法 C:手动安装
- 将本目录下载或复制到
~/.openclaw/extensions/dingtalk。 - 确保包含
index.ts,openclaw.plugin.json和package.json。 - 运行
openclaw plugins list确认dingtalk已显示在列表中。
安装后必做:配置插件信任白名单(plugins.allow)
从 OpenClaw 新版本开始,如果发现了非内置插件且 plugins.allow 为空,会提示:
[plugins] plugins.allow is empty; discovered non-bundled plugins may auto-load ...这是一条安全告警(不是安装失败),建议显式写入你信任的插件 id。
步骤 1:确认插件 id
本插件 id 固定为:dingtalk(定义于 openclaw.plugin.json)。
也可用下面命令查看已发现插件:
openclaw plugins list步骤 2:在 ~/.openclaw/openclaw.json 添加 plugins.allow
{
"plugins": {
"enabled": true,
"allow": ["dingtalk"]
}
}如果你还有其他已安装且需要启用的插件,请一并加入,例如:
{
"plugins": {
"allow": ["dingtalk", "telegram", "voice-call"]
}
}步骤 3:重启 Gateway
openclaw gateway restart注意:如果你之前已经配置过
plugins.allow,但没有dingtalk,那么插件不会被加载。请把dingtalk加入该列表。
更新
openclaw plugins update 使用插件 id(不是 npm 包名),并且仅适用于 npm 安装来源。
如果你是通过 npm 安装本插件:
openclaw plugins update dingtalk如果你是本地源码/链接安装(openclaw plugins install -l .),请在插件目录更新代码后重启 Gateway:
git pull
openclaw gateway restart配置
OpenClaw 支持交互式配置和手动配置文件两种方式。
方法 1:交互式配置(推荐)
使用 OpenClaw 命令行向导式配置插件参数:
# 方式 A:使用 onboard 命令
openclaw onboard
# 方式 B:直接配置 channels 部分
openclaw configure --section channels交互式配置流程:
- 选择插件 — 在插件列表中选择
dingtalk或DingTalk (钉钉) - Client ID — 输入钉钉应用的 AppKey
- Client Secret — 输入钉钉应用的 AppSecret
- 完整配置 — 可选配置 Robot Code、Corp ID、Agent ID(推荐)
- 卡片模式 — 可选启用 AI 互动卡片模式
- 如启用,需输入 Card Template ID 和 Card Template Key
- 私聊策略 — 选择
open(开放)或allowlist(白名单) - 群聊策略 — 选择
open(开放)或allowlist(白名单)
所有的参数参考下文中的钉钉开发者平台配置指南
配置完成后会自动保存并重启 Gateway。
钉钉开发者平台配置指南
1. 创建钉钉应用
- 访问 钉钉开发者后台
- 创建企业内部应用
- 添加「机器人」能力
- 配置消息接收模式为 Stream 模式
- 发布应用
2. 配置权限管理
在应用的权限管理页面,需要开启以下权限:
- ✅ Card.Instance.Write — 创建和投放卡片实例
- ✅ Card.Streaming.Write — 对卡片进行流式更新
步骤:
- 进入应用 → 权限管理
- 搜索「Card」相关权限
- 勾选上述两个权限
- 保存权限配置
3. 建立卡片模板(可选)
步骤:
- 访问 钉钉卡片平台
- 进入「我的模板」
- 点击「创建模板」
- 卡片模板场景选择 「AI 卡片」
- 按需设计卡片排版,点击保存并发布
- 记下模板中定义的内容字段名称
- 复制模板 ID(格式如:
xxxxx-xxxxx-xxxxx.schema) - 将 templateId 配置到
openclaw.json的cardTemplateId字段 - 或在OpenClaw控制台的Channel标签->Dingtalk配置面板-> Card Template Id填入
- 将记下的内容字段变量名配置到
openclaw.json的cardTemplateKey字段 - 或在OpenClaw控制台的Channel标签->Dingtalk配置面板-> Card Template Key填入
说明:
- 使用 DingTalk 官方 AI 卡片模板时,
cardTemplateKey默认为'msgContent',无需修改 - 如果您创建自定义卡片模板,需要确保模板中包含相应的内容字段,并将
cardTemplateKey配置为该字段名称
4. 获取凭证
从开发者后台获取:
- Client ID (AppKey)
- Client Secret (AppSecret)
- Robot Code (与 Client ID 相同)
- Corp ID (企业 ID)
- Agent ID (应用 ID)
方法 2:手动配置文件
在 ~/.openclaw/openclaw.json 中添加(仅作参考,交互式配置会自动生成):
至少包含
plugins.allow和channels.dingtalk两部分,内容参考上文钉钉开发者配置指南
{
"plugins": {
"enabled": true,
"allow": ["dingtalk"]
},
...
"channels": {
"telegram": { ... },
"dingtalk": {
"enabled": true,
"clientId": "dingxxxxxx",
"clientSecret": "your-app-secret",
"robotCode": "dingxxxxxx",
"corpId": "dingxxxxxx",
"agentId": "123456789",
"dmPolicy": "open",
"groupPolicy": "open",
"debug": false,
"messageType": "markdown", // 或 "card"
// 仅card需要配置
"cardTemplateId": "你复制的模板ID",
"cardTemplateKey": "你模板的内容变量"
}
},
...
}最后重启 Gateway
使用交互式配置时,Gateway 会自动重启。使用手动配置时需要手动执行:
openclaw gateway restart配置选项
| 选项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
enabled |
boolean | true |
是否启用 |
clientId |
string | 必填 | 应用的 AppKey |
clientSecret |
string | 必填 | 应用的 AppSecret |
robotCode |
string | - | 机器人代码(用于下载媒体和发送卡片) |
corpId |
string | - | 企业 ID |
agentId |
string | - | 应用 ID |
dmPolicy |
string | "open" |
私聊策略:open/pairing/allowlist |
groupPolicy |
string | "open" |
群聊策略:open/allowlist |
allowFrom |
string[] | [] |
允许的发送者 ID 列表 |
messageType |
string | "markdown" |
消息类型:markdown/card |
cardTemplateId |
string | AI 互动卡片模板 ID(仅当 messageType=card) | |
cardTemplateKey |
string | "content" |
卡片模板内容字段键(仅当 messageType=card) |
debug |
boolean | false |
是否开启调试日志 |
maxConnectionAttempts |
number | 10 |
最大连接尝试次数 |
initialReconnectDelay |
number | 1000 |
初始重连延迟(毫秒) |
maxReconnectDelay |
number | 60000 |
最大重连延迟(毫秒) |
reconnectJitter |
number | 0.3 |
重连延迟抖动因子(0-1) |
连接鲁棒性配置
为提高连接稳定性,插件支持以下高级配置:
- maxConnectionAttempts: 连接失败后的最大重试次数,超过后将停止尝试并报警。
- initialReconnectDelay: 第一次重连的初始延迟(毫秒),后续重连会按指数增长。
- maxReconnectDelay: 重连延迟的上限(毫秒),防止等待时间过长。
- reconnectJitter: 延迟抖动因子,在延迟基础上增加随机变化(±30%),避免多个客户端同时重连。
重连延迟计算公式:delay = min(initialDelay × 2^attempt, maxDelay) × (1 ± jitter)
示例延迟序列(默认配置):~1s, ~2s, ~4s, ~8s, ~16s, ~32s, ~60s(达到上限)
更多详情请参阅 CONNECTION_ROBUSTNESS.md。
安全策略
私聊策略 (dmPolicy)
open— 任何人都可以私聊机器人pairing— 新用户需要通过配对码验证allowlist— 只有 allowFrom 列表中的用户可以使用
群聊策略 (groupPolicy)
open— 任何群都可以 @机器人allowlist— 只有配置的群可以使用
消息类型支持
接收
| 类型 | 支持 | 说明 |
|---|---|---|
| 文本 | ✅ | 完整支持 |
| 富文本 | ✅ | 提取文本内容 |
| 图片 | ✅ | 下载并传递给 AI |
| 语音 | ✅ | 使用钉钉语音识别结果 |
| 视频 | ✅ | 下载并传递给 AI |
| 文件 | ✅ | 下载并传递给 AI |
发送
| 类型 | 支持 | 说明 |
|---|---|---|
| 文本 | ✅ | 完整支持 |
| Markdown | ✅ | 自动检测或手动指定 |
| 互动卡片 | ✅ | 支持流式更新,适用于 AI 实时输出 |
| 图片 | ⏳ | 需要通过媒体上传 API |
API 消耗说明
Text/Markdown 模式
| 操作 | API 调用次数 | 说明 |
|---|---|---|
| 获取 Token | 1 | 共享/缓存(60 秒检查过期一次) |
| 发送消息 | 1 | 使用 /v1.0/robot/oToMessages/batchSend 或 /v1.0/robot/groupMessages/send |
| 总计 | 2 | 每条回复 1 次 |
Card(AI 互动卡片)模式
| 阶段 | API 调用 | 说明
…(truncated)…
最后编辑:Ddd4j 更新时间:2026-03-09 11:36