1. 为什么要在 OpenClaw 里装钉钉插件
OpenClaw 本身是个能跑在本地或服务器上的 AI 助手框架,它默认的交互入口是终端或者网页控制台。但如果你想让团队里不写代码的同事也能用上这个助手,最省事的办法就是把它接到钉钉里——大家在钉钉里 @ 一下机器人就能对话,不用额外装客户端,也不用教他们敲命令。
钉钉插件(@moltybob/dingtalk)干的就是这件事:它把钉钉的机器人消息通过 Stream 模式长连接拉过来,交给 OpenClaw 处理,再把回复推回钉钉。整个过程不需要公网域名,也不需要内网穿透,对个人开发者和中小团队特别友好。
不过这里有个容易被忽略的点:OpenClaw 要调用大模型才能回复消息,而模型通道的 Key 管理如果每个插件都单独配一遍,很快就会乱。我这次的做法是统一走 TaoToken 的 API 通道,一个 Key 覆盖 OpenClaw 里所有需要模型能力的地方,钉钉插件只负责消息收发,模型调用交给统一配置。这样后面再加别的渠道(比如飞书、企微)时,不用重复折腾 Key。
这篇就按「装插件 → 配钉钉凭证 → 接 TaoToken 统一 Key → 发消息回环验证」的顺序走一遍,每一步都给可复制的配置和验证命令。适合已经在本地跑起 OpenClaw、想加钉钉入口的人。
2. 前置准备:TaoToken 统一 Key 与 OpenClaw 环境
在动钉钉插件之前,先把模型通道这块理清楚。OpenClaw 调用模型时需要一个 base URL 和一个 API Key,TaoToken 提供的就是这个通道。你可以在官网注册后拿到 Key,地址是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,注册完进控制台创建 API Key。
拿到 Key 之后,OpenClaw 侧的模型配置有两种写法:一种是写进~/.openclaw/openclaw.json的models段,另一种是用命令行openclaw config set逐项设置。我建议直接改 JSON,因为钉钉插件的配置也要写进同一个文件,一次改完省得来回切。
TaoToken 的 API 端点固定是https://taotoken.net/api,注意这个地址不带任何查询参数,直接作为 base URL 用。Key 的格式通常是一串以sk-开头的字符,复制的时候别带空格。
环境方面,我这次是在 WSL2 Ubuntu 24.04 上跑的,OpenClaw 版本 2026.1.30,插件版本 0.1.0。Node.js 建议 20 以上,npm 用自带的就行。如果你在纯 Linux 服务器上跑,步骤一样,只是路径里的~换成实际用户目录。
先确认 OpenClaw 本身能正常启动:
openclaw --version openclaw gateway status如果 gateway 没起来,先openclaw gateway start。模型通道这块可以先不急着验证,等钉钉插件装完一起测,因为最终的回环验证会同时用到模型和钉钉两条链路。
3. 钉钉开放平台侧:创建应用与开启 Stream 模式
钉钉这边的配置是整个流程里最容易卡住的地方,因为后台菜单层级比较深。按下面顺序走:
登录钉钉开放平台,进入「应用开发」→「企业内部应用」→「创建应用」,填个应用名称和描述。创建完进入应用详情页,左侧找到「添加应用能力」,选「机器人」,填机器人名称和头像。
关键一步:在机器人配置页里,把「消息接收模式」改成Stream 模式。这个模式走的是钉钉的长连接,不需要你提供公网回调地址,本地开发也能收消息。如果选成 HTTP 模式,钉钉会要求你填一个公网可访问的 URL,那就麻烦了。
然后去「凭证与基础信息」页面,记下两个值:
| 字段 | 说明 | 示例格式 |
|---|---|---|
| AppKey (clientId) | 应用唯一标识 | dingxxxxxxxxxx |
| AppSecret (clientSecret) | 应用密钥 | 一长串字符 |
最后别忘了「版本管理与发布」里发布一下,可见范围先选「仅自己可见」做测试。没发布的话,机器人搜不到也发不了消息。
注意:Stream 模式必须在发布前就设好,发布后再改模式有时需要重新发布才生效。我第一次就是先发布后改模式,结果机器人一直连不上,重新发布一次才好。
4. 安装 OpenClaw 钉钉插件并写 config.toml 骨架
插件安装一条命令:
openclaw plugins install @moltybob/dingtalk如果安装过程中依赖报错(常见于 npm 版本较新时),手动进插件目录补装:
cd ~/.openclaw/extensions/dingtalk && npm install --omit=dev --ignore-scripts装完验证插件是否被加载:
openclaw plugins list | grep dingtalk正常应该输出类似dingtalk | loaded的一行。如果显示not loaded,检查上一步的依赖是否装全。
接下来是配置。OpenClaw 的主配置文件在~/.openclaw/openclaw.json,钉钉插件的配置写在channels.dingtalk下面。同时把 TaoToken 的模型通道也写进同一个文件,形成统一的 config 骨架:
{ "models": { "default": { "baseUrl": "https://taotoken.net/api", "apiKey": "sk-你的TaoToken密钥", "model": "claude-sonnet-4-5" } }, "channels": { "dingtalk": { "enabled": true, "clientId": "dingxxxxxxxxxx", "clientSecret": "你的AppSecret", "dmPolicy": "pairing" } } }dmPolicy有三个选项,按需选:
pairing:需要配对才能私聊,推荐测试阶段用open:任何人都能私聊allowlist:只允许指定用户
如果你不想手改 JSON,也可以用命令行逐项设置:
openclaw config set channels.dingtalk.enabled true openclaw config set channels.dingtalk.clientId "dingxxxxxxxxxx" openclaw config set channels.dingtalk.clientSecret "你的AppSecret" openclaw config set channels.dingtalk.dmPolicy "pairing" openclaw config set models.default.baseUrl "https://taotoken.net/api" openclaw config set models.default.apiKey "sk-你的TaoToken密钥"改完配置后重启 Gateway 让配置生效:
openclaw gateway restart5. 验证请求:钉钉消息回环与模型通道连通性
配置写完,先看渠道状态:
openclaw channels status期望输出里能看到钉钉这一行是enabled, configured, mode:stream。如果configured显示 false,说明 clientId 或 clientSecret 没读到,回去检查 JSON 里的字段名有没有拼错。
再看日志确认 Stream 连接建立:
openclaw channels logs | grep dingtalk成功的话会看到Successfully connected to DingTalk stream。这一步过了,说明钉钉侧的长连接已经通了。
接下来做真正的回环验证:打开钉钉,在搜索框搜你的应用名找到机器人,发一条消息,比如「你好,帮我算一下 12 乘以 8」。如果一切正常,机器人会回复你。这条消息的完整链路是:钉钉 → Stream 长连接 → OpenClaw 钉钉插件 → OpenClaw 模型调用(走 TaoToken 的https://taotoken.net/api)→ 回复推回钉钉。
如果机器人没回复,先看日志里有没有模型调用的报错。常见的是 Key 无效或 base URL 写错。你可以单独测一下模型通道:
curl https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer sk-你的TaoToken密钥" \ -H "Content-Type: application/json" \ -d '{"model":"claude-sonnet-4-5","messages":[{"role":"user","content":"ping"}]}'返回里有正常的choices字段,说明 TaoToken 通道没问题,那问题就出在钉钉插件侧。群聊场景也类似:进群 → 群设置 → 群机器人 → 添加机器人 → 选你的应用,然后 @ 机器人发消息。
6. 本篇常见错排查
问题一:控制面板返回{"success":true}而不是页面
这是钉钉插件的 webhook handler 拦截了所有 HTTP 请求导致的。修复方法是编辑~/.openclaw/extensions/dingtalk/src/monitor.ts,找到handleDingTalkWebhookRequest函数开头,加上路径判断:
export async function handleDingTalkWebhookRequest( req: import('node:http').IncomingMessage, res: import('node:http').ServerResponse ): Promise<boolean> { const url = req.url || ''; const isDingTalkPath = url.includes('/dingtalk') || url.includes('/webhook'); if (req.method !== 'POST' || !isDingTalkPath) { return false; } console.log(`[dingtalk] HTTP request received: ${req.method} ${req.url}`); // ... 后面代码不变 }改完重启 Gateway。这个坑我踩过,当时控制台一直白屏,查了半天才发现是插件把非钉钉请求也吞了。
问题二:插件显示 loaded 但机器人不回消息
先确认钉钉应用已发布且可见范围包含你自己。然后看openclaw channels logs里有没有收到消息的记录。如果收到消息但没回复,多半是模型通道的问题,用上面的 curl 命令单独测 TaoToken。
问题三:openclaw plugins install卡住或超时
换 npm 源或者手动 clone 到~/.openclaw/extensions/dingtalk再npm install。WSL2 下有时 DNS 解析慢,重启 WSL 能缓解。
问题四:Stream 模式连不上,日志报鉴权失败
检查 AppKey 和 AppSecret 有没有复制错,特别是 AppSecret 里可能包含特殊字符,JSON 里要确保转义正确。另外确认钉钉后台的机器人能力已经添加,光创建应用不加机器人能力是连不上的。
相关文件位置汇总一下:插件目录在~/.openclaw/extensions/dingtalk/,主配置在~/.openclaw/openclaw.json,日志用openclaw channels logs看。
7. 后续接入与统一 Key 的延伸
钉钉这条链路跑通之后,你会发现 OpenClaw 里所有需要模型的地方都共用同一份 TaoToken 配置,加新渠道时只需要配渠道自己的凭证,模型这块不用动。如果你后面想接飞书或者企微,思路完全一样:装插件、配渠道凭证、复用models.default里的 base URL 和 Key。
需要管理多个 Key 或者查看调用量的话,可以进控制台 https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 看看。如果打算长期跑编码类或 Agent 类任务,Coding Plan 会比按量计费更划算,地址是 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,里面有针对不同框架的配置示例。API Key 管理页在 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,需要新建或吊销 Key 时用得上。
最后留一个实用习惯:每次改完openclaw.json后,先openclaw gateway restart,再openclaw channels status确认状态,最后发一条钉钉消息做回环。这三步走完,基本能覆盖 90% 的配置问题。