@yaoyuanchao/dingtalk 1.5.0 → 1.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,303 +1,93 @@
1
- # DingTalk Channel Plugin for Clawdbot
2
-
3
- [![npm version](https://img.shields.io/npm/v/@yaoyuanchao/dingtalk.svg)](https://www.npmjs.com/package/@yaoyuanchao/dingtalk)
4
- [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
5
-
6
- 钉钉(DingTalk)频道插件,支持通过 Stream 模式接收和回复私聊及群聊消息。**无需公网域名,开箱即用!**
7
-
8
- ---
9
-
10
- ## 功能特性
11
-
12
- - Stream 模式连接(无需公网域名)
13
- - 私聊消息支持(DM)
14
- - 群聊消息支持(@机器人)
15
- - ✅ Pairing 模式访问控制
16
- - SessionWebhook 优先回复(35分钟内快速响应)
17
- - ✅ REST API 兜底回复
18
-
19
- ## 前置要求
20
-
21
- 1. 钉钉企业内部应用(已创建并配置 Stream 模式)
22
- 2. Node.js 环境(clawdbot 已安装)
23
- 3. 应用的 AppKey (clientId) 和 AppSecret (clientSecret)
24
-
25
- ## 快速开始
26
-
27
- > **从 v0.1.0 升级?** 查看 [升级指南](./UPGRADE.md)
28
-
29
- ### 方式一:官方安装(推荐)
30
-
31
- ```bash
32
- # 安装插件
33
- clawdbot plugins install @yaoyuanchao/dingtalk
34
-
35
- # 运行交互式配置向导
36
- clawdbot onboard --channel dingtalk
37
-
38
- # 启动网关
39
- clawdbot gateway
40
- ```
41
-
42
- 就这么简单!配置向导会引导你完成所有设置。
43
-
44
- ### 方式二:手动安装
45
-
46
- 如果你想从源码安装或进行开发:
47
-
48
- ```bash
49
- # 克隆或下载源码
50
- git clone https://github.com/yourusername/dingtalk-clawdbot.git
51
-
52
- # 本地安装
53
- cd dingtalk-clawdbot
54
- npm install
55
- clawdbot plugins install .
56
- ```
57
-
58
- ## 配置说明
59
-
60
- ### 交互式配置(推荐)
61
-
62
- 运行 `clawdbot onboard --channel dingtalk` 启动配置向导,它会:
63
-
64
- 1. ✅ 要求输入 Client ID 和 Client Secret
65
- 2. ✅ 自动测试连接
66
- 3. ✅ 引导选择私聊策略(Pairing/Allowlist/Open/Disabled)
67
- 4. 引导选择群聊策略(Allowlist/Open/Disabled)
68
- 5. ✅ 自动保存配置到 `~/.clawdbot/clawdbot.json`
69
-
70
- ### 手动配置 clawdbot.json
71
-
72
- 编辑 `~/.clawdbot/clawdbot.json`,添加 DingTalk 频道配置:
73
-
74
- ```json
75
- {
76
- "channels": {
77
- "dingtalk": {
78
- "enabled": true,
79
- "clientId": "dingXXXXXXXXXXXXXXXX",
80
- "clientSecret": "YOUR_APP_SECRET_HERE",
81
- "dm": {
82
- "policy": "pairing",
83
- "allowFrom": ["YOUR_STAFF_ID"]
84
- },
85
- "groupPolicy": "allowlist",
86
- "groupAllowlist": ["YOUR_CONVERSATION_ID"],
87
- "requireMention": true
88
- }
89
- }
90
- }
91
- ```
92
-
93
- **配置说明**:
94
- - `clientId`: 钉钉应用的 AppKey
95
- - `clientSecret`: 钉钉应用的 AppSecret
96
- - `dm.policy`: 私聊策略
97
- - `"pairing"`: 需要明确允许的用户才能使用(推荐)
98
- - `"open"`: 任何人都可以私聊
99
- - `"disabled"`: 禁用私聊
100
- - `dm.allowFrom`: 允许私聊的 staffId 列表(当 policy 为 pairing 时生效)
101
- - `groupPolicy`: 群聊策略
102
- - `"allowlist"`: 仅允许列表中的群
103
- - `"open"`: 允许所有群
104
- - `"disabled"`: 禁用群聊
105
- - `groupAllowlist`: 允许的群聊 conversationId 列表(当 groupPolicy 为 allowlist 时生效)
106
- - `requireMention`: 是否要求在群聊中 @机器人(推荐 true)
107
- - `messageFormat`: 消息格式(可选)
108
- - `"text"`: 纯文本格式(默认,推荐)
109
- - `"markdown"`: Markdown 格式(⚠️ 钉钉仅支持有限的 Markdown 语法,**不支持表格**)
110
-
111
- **Markdown 格式说明**:
112
- - ✅ 支持:标题、粗体、斜体、链接、图片、引用、列表、代码块
113
- - ❌ 不支持:**表格**、复杂嵌套列表、HTML 标签、任务列表
114
- - 📝 自动转换:插件会自动将 Markdown 表格转换为纯文本代码块显示
115
- - ⏰ 仅 SessionWebhook 可用:REST API 兜底时自动降级为纯文本
116
-
117
- **配置示例**:
118
- ```json
119
- {
120
- "messageFormat": "markdown"
121
- }
122
- ```
123
-
124
- ### 4. 启动 clawdbot gateway
125
-
126
- ```bash
127
- # 如果已经在运行,需要重启
128
- clawdbot gateway restart
129
-
130
- # 或者首次启动
131
- clawdbot gateway
132
- ```
133
-
134
- ### 5. 查看日志验证
135
-
136
- ```bash
137
- # 查看实时日志
138
- tail -f /tmp/clawdbot/clawdbot-$(date +%Y-%m-%d).log | grep dingtalk
139
-
140
- # 成功的标志:
141
- # [dingtalk:default] Starting Stream...
142
- # [dingtalk:default] Stream connected
143
- # [dingtalk] Stream connection started successfully
144
- ```
145
-
146
- ## 获取你的 staffId
147
-
148
- 首次使用时,机器人会告诉你的 staffId:
149
-
150
- 1. 在钉钉中找到机器人
151
- 2. 发送任意消息
152
- 3. 机器人会回复:"Access denied. Your staffId: XXXXXXXXXXXXXXXXXXXX Ask admin to add you."
153
- 4. 将这个 staffId 添加到配置文件的 `dm.allowFrom` 数组中
154
- 5. 重启 gateway
155
-
156
- ## 获取群聊 conversationId
157
-
158
- 如果使用 `groupPolicy: "allowlist"`,需要获取群聊的 conversationId:
159
-
160
- **方法1: 查看日志**
161
- 1. 在群聊中 @机器人发送消息
162
- 2. 查看 gateway 日志:
163
- ```bash
164
- tail -f /tmp/clawdbot/clawdbot-$(date +%Y-%m-%d).log | grep "dingtalk.*Group"
165
- ```
166
- 3. 日志会显示:`[dingtalk] Group from XXX: ...` 以及相关的 conversationId
167
- 4. 或者查看日志中的 "Group not in allowlist" 消息获取 conversationId
168
-
169
- **方法2: 临时设置为 open**
170
- 1. 临时修改配置为 `groupPolicy: "open"`
171
- 2. 重启 gateway
172
- 3. 在群聊中 @机器人发送消息
173
- 4. 查看日志获取 conversationId(格式类似 `cidXXXXXXXXXXXXXXXXXX==`)
174
- 5. 将 conversationId 添加到 `groupAllowlist` 数组
175
- 6. 改回 `groupPolicy: "allowlist"` 并重启
176
-
177
- **配置示例**:
178
- ```json
179
- {
180
- "groupPolicy": "allowlist",
181
- "groupAllowlist": [
182
- "cidXXXXXXXXXXXXXXXXXX==",
183
- "cidYYYYYYYYYYYYYYYYYY=="
184
- ],
185
- "requireMention": true
186
- }
187
- ```
188
-
189
- ## 钉钉应用配置
190
-
191
- ### 创建应用
192
-
193
- 1. 登录 [钉钉开发者平台](https://open-dev.dingtalk.com)
194
- 2. 进入 **应用开发** → **企业内部开发**
195
- 3. 点击 **创建应用**
196
- 4. 添加 **机器人** 能力
197
- 5. 消息接收模式选择 **Stream 模式**
198
-
199
- ### 配置权限
200
-
201
- 应用需要以下权限:
202
- - `qyapi_chat_manage`(企业会话管理)
203
- - `qyapi_robot_sendmsg`(机器人发送消息)
204
-
205
- ### 获取凭证
206
-
207
- 在应用详情页面:
208
- - **AppKey** → 这是你的 `clientId`
209
- - **AppSecret** → 点击查看并复制,这是你的 `clientSecret`
210
-
211
- ### 发布应用
212
-
213
- 配置完成后,点击 **发布** 使应用生效。
214
-
215
- ## 故障排查
216
-
217
- ### Stream 连接失败
218
-
219
- ```
220
- [dingtalk] Failed to start Stream
221
- ```
222
-
223
- **可能原因**:
224
- 1. clientId 或 clientSecret 错误
225
- 2. 应用未选择 Stream 模式
226
- 3. 应用未发布
227
-
228
- **解决方法**:
229
- - 检查配置文件中的凭证是否正确
230
- - 确认钉钉应用已选择 Stream 模式并发布
231
-
232
- ### 发送消息无响应
233
-
234
- **可能原因**:
235
- 1. staffId 未添加到 allowFrom 列表
236
- 2. 群聊未 @机器人(requireMention 为 true 时)
237
-
238
- **解决方法**:
239
- - 查看日志获取 staffId 并添加到配置
240
- - 在群聊中使用 @机器人名称 来触发
241
-
242
- ### 配置修改未生效
243
-
244
- **原因**:配置修改需要重启 gateway
245
-
246
- **解决方法**:
247
- ```bash
248
- clawdbot gateway restart
249
- ```
250
-
251
- ## 技术细节
252
-
253
- ### 核心实现
254
-
255
- - **Stream SDK**: `dingtalk-stream@2.1.4`
256
- - **消息处理**: 通过 `DWClient` 建立 WebSocket 长连接
257
- - **配置加载**: 自动调用 `cfg.loadConfig()` 获取实际配置(重要修复)
258
- - **回复策略**: SessionWebhook (35分钟内) → REST API (兜底)
259
-
260
- ### 关键文件
261
-
262
- | 文件 | 作用 |
263
- |------|------|
264
- | `src/monitor.ts` | Stream 连接 + 消息处理核心逻辑 |
265
- | `src/api.ts` | 钉钉 REST API 封装 |
266
- | `src/channel.ts` | ChannelPlugin 接口实现 |
267
- | `src/accounts.ts` | 账号凭证解析 |
268
-
269
- ### 已知限制
270
-
271
- - **Markdown 有限支持**:钉钉不支持 Markdown 表格,插件会自动转换为纯文本代码块
272
- - **消息格式**:默认纯文本,可选 Markdown(但有语法限制)
273
- - **媒体消息**:暂不支持文件、图片等媒体消息发送
274
- - **钉钉限流**:20条/分钟/群,超限后10分钟限流
275
-
276
- ## 更新日志
277
-
278
- 查看 [CHANGELOG.md](./CHANGELOG.md) 获取详细的版本历史。
279
-
280
- ### v1.2.0 (2026-01-28) - 官方插件发布
281
-
282
- - ✅ **官方 NPM 安装支持** - `clawdbot plugins install @yaoyuanchao/dingtalk`
283
- - ✅ **交互式配置向导** - `clawdbot onboard --channel dingtalk`
284
- - ✅ **Zod 配置验证** - 类型安全、自动错误提示
285
- - ✅ **健康检查** - 自动探测连接状态和延迟
286
- - ✅ 保留所有 v0.1.0 功能
287
-
288
- ### v0.1.0 (2026-01-26)
289
-
290
- - ✅ 初始版本发布
291
- - ✅ Stream 模式连接
292
- - ✅ 私聊 + 群聊支持
293
- - ✅ Pairing 访问控制
294
- - ✅ 群聊白名单(groupAllowlist)
295
- - ✅ Markdown 消息格式支持(自动转换表格为纯文本)
296
-
297
- ## 许可证
298
-
299
- MIT License - 查看 [LICENSE](./LICENSE) 文件获取详细信息。
300
-
301
- ## 贡献
302
-
303
- 发现问题或有改进建议?欢迎提交 Issue 或 Pull Request。
1
+ # 🤖 DingTalk Plugin for Clawdbot
2
+
3
+ [![npm](https://img.shields.io/npm/v/@yaoyuanchao/dingtalk.svg)](https://www.npmjs.com/package/@yaoyuanchao/dingtalk)
4
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
5
+
6
+ 让你的 AI 助手住进钉钉。**无需公网域名,3 分钟搞定。**
7
+
8
+ ## ✨ 特性
9
+
10
+ - 🚀 **Stream 模式** — 无需公网域名,内网即可用
11
+ - 💬 **私聊 + 群聊** — 完整的消息收发支持
12
+ - 🖼️ **富媒体** — 图片、语音、视频、文件接收
13
+ - **思考中提示** — 自动显示处理状态,完成后消失
14
+ - 🔒 **访问控制** — 灵活的用户/群组白名单
15
+
16
+ ## 🚀 快速开始
17
+
18
+ ```bash
19
+ # 1. 安装
20
+ clawdbot plugins install @yaoyuanchao/dingtalk
21
+
22
+ # 2. 配置(交互式向导)
23
+ clawdbot onboard --channel dingtalk
24
+
25
+ # 3. 启动
26
+ clawdbot gateway
27
+ ```
28
+
29
+ 完事!去钉钉找机器人聊天吧。
30
+
31
+ ## ⚙️ 配置示例
32
+
33
+ ```json
34
+ {
35
+ "channels": {
36
+ "dingtalk": {
37
+ "enabled": true,
38
+ "clientId": "dingXXXXXXXXXXXX",
39
+ "clientSecret": "YOUR_SECRET",
40
+ "dm": {
41
+ "policy": "pairing",
42
+ "allowFrom": ["YOUR_STAFF_ID"]
43
+ }
44
+ }
45
+ }
46
+ }
47
+ ```
48
+
49
+ <details>
50
+ <summary>📋 完整配置项</summary>
51
+
52
+ | 配置项 | 说明 | 默认值 |
53
+ |--------|------|--------|
54
+ | `clientId` | 钉钉应用 AppKey | - |
55
+ | `clientSecret` | 钉钉应用 AppSecret | - |
56
+ | `dm.policy` | 私聊策略: `pairing`/`open`/`disabled` | `pairing` |
57
+ | `dm.allowFrom` | 允许私聊的 staffId 列表 | `[]` |
58
+ | `groupPolicy` | 群聊策略: `allowlist`/`open`/`disabled` | `allowlist` |
59
+ | `groupAllowlist` | 允许的群 conversationId 列表 | `[]` |
60
+ | `requireMention` | 群聊是否需要 @机器人 | `true` |
61
+ | `messageFormat` | 消息格式: `text`/`markdown`/`auto` | `auto` |
62
+ | `typingIndicator` | 显示"思考中"提示 | `true` |
63
+ | `longTextMode` | 长文本处理: `chunk`/`file` | `chunk` |
64
+
65
+ </details>
66
+
67
+ ## 🔑 获取凭证
68
+
69
+ 1. 打开 [钉钉开发者平台](https://open-dev.dingtalk.com)
70
+ 2. 创建企业内部应用 → 添加机器人能力
71
+ 3. 消息接收模式选 **Stream 模式**
72
+ 4. 复制 AppKey (clientId) 和 AppSecret (clientSecret)
73
+ 5. 发布应用
74
+
75
+ ## 💡 获取 staffId
76
+
77
+ 首次私聊机器人时会返回:
78
+ ```
79
+ Access denied. Your staffId: 050914XXXXXXXXX
80
+ ```
81
+ 把这个 ID 加到 `dm.allowFrom` 里,重启 gateway 即可。
82
+
83
+ ## 📝 更新日志
84
+
85
+ **v1.5.0** — 新增 Typing Indicator(思考中提示,自动撤回)
86
+
87
+ **v1.4.x** — 媒体消息支持、长文本文件发送
88
+
89
+ 查看完整 [CHANGELOG](./CHANGELOG.md)
90
+
91
+ ## 📄 License
92
+
93
+ MIT
@@ -0,0 +1,9 @@
1
+ {
2
+ "id": "dingtalk",
3
+ "channels": ["dingtalk"],
4
+ "configSchema": {
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "properties": {}
8
+ }
9
+ }
package/package.json CHANGED
@@ -1,52 +1,79 @@
1
- {
2
- "name": "@yaoyuanchao/dingtalk",
3
- "version": "1.5.0",
4
- "type": "module",
5
- "description": "DingTalk channel plugin for Clawdbot with Stream Mode support",
6
- "license": "MIT",
7
- "author": "Yao Yuanchao",
8
- "keywords": [
9
- "clawdbot",
10
- "dingtalk",
11
- "channel-plugin",
12
- "stream-mode",
13
- "ai-assistant"
14
- ],
15
- "clawdbot": {
16
- "extensions": [
17
- "./index.ts"
18
- ],
19
- "channel": {
20
- "id": "dingtalk",
21
- "label": "DingTalk",
22
- "selectionLabel": "DingTalk (钉钉)",
23
- "detailLabel": "DingTalk Stream Mode",
24
- "docsPath": "/channels/dingtalk",
25
- "docsLabel": "dingtalk",
26
- "blurb": "DingTalk bot via Stream Mode (WebSocket) - No public domain required",
27
- "aliases": [
28
- "dingding",
29
- "dd"
30
- ],
31
- "order": 75,
32
- "quickstartAllowFrom": true
33
- },
34
- "install": {
35
- "npmSpec": "@yaoyuanchao/dingtalk",
36
- "localPath": ".",
37
- "defaultChoice": "npm"
38
- }
39
- },
40
- "dependencies": {
41
- "dingtalk-stream": "^2.1.4",
42
- "zod": "^4.3.6"
43
- },
44
- "files": [
45
- "index.ts",
46
- "src/**/*.ts",
47
- "clawdbot.plugin.json",
48
- "README.md",
49
- "CHANGELOG.md",
50
- "LICENSE"
51
- ]
52
- }
1
+ {
2
+ "name": "@yaoyuanchao/dingtalk",
3
+ "version": "1.5.2",
4
+ "type": "module",
5
+ "description": "DingTalk channel plugin for ClawdBot/OpenClaw with Stream Mode support",
6
+ "license": "MIT",
7
+ "author": "Yao Yuanchao",
8
+ "keywords": [
9
+ "clawdbot",
10
+ "openclaw",
11
+ "dingtalk",
12
+ "channel-plugin",
13
+ "stream-mode",
14
+ "ai-assistant"
15
+ ],
16
+ "clawdbot": {
17
+ "extensions": [
18
+ "./index.ts"
19
+ ],
20
+ "channel": {
21
+ "id": "dingtalk",
22
+ "label": "DingTalk",
23
+ "selectionLabel": "DingTalk (钉钉)",
24
+ "detailLabel": "DingTalk Stream Mode",
25
+ "docsPath": "/channels/dingtalk",
26
+ "docsLabel": "dingtalk",
27
+ "blurb": "DingTalk bot via Stream Mode (WebSocket) - No public domain required",
28
+ "aliases": [
29
+ "dingding",
30
+ "dd"
31
+ ],
32
+ "order": 75,
33
+ "quickstartAllowFrom": true
34
+ },
35
+ "install": {
36
+ "npmSpec": "@yaoyuanchao/dingtalk",
37
+ "localPath": ".",
38
+ "defaultChoice": "npm"
39
+ }
40
+ },
41
+ "openclaw": {
42
+ "extensions": [
43
+ "./index.ts"
44
+ ],
45
+ "channel": {
46
+ "id": "dingtalk",
47
+ "label": "DingTalk",
48
+ "selectionLabel": "DingTalk (钉钉)",
49
+ "detailLabel": "DingTalk Stream Mode",
50
+ "docsPath": "/channels/dingtalk",
51
+ "docsLabel": "dingtalk",
52
+ "blurb": "DingTalk bot via Stream Mode (WebSocket) - No public domain required",
53
+ "aliases": [
54
+ "dingding",
55
+ "dd"
56
+ ],
57
+ "order": 75,
58
+ "quickstartAllowFrom": true
59
+ },
60
+ "install": {
61
+ "npmSpec": "@yaoyuanchao/dingtalk",
62
+ "localPath": ".",
63
+ "defaultChoice": "npm"
64
+ }
65
+ },
66
+ "dependencies": {
67
+ "dingtalk-stream": "^2.1.4",
68
+ "zod": "^4.3.6"
69
+ },
70
+ "files": [
71
+ "index.ts",
72
+ "src/**/*.ts",
73
+ "clawdbot.plugin.json",
74
+ "openclaw.plugin.json",
75
+ "README.md",
76
+ "CHANGELOG.md",
77
+ "LICENSE"
78
+ ]
79
+ }