Clawdbot 可以作为一个运行在本地或私有环境里的 AI Agent,用来接收指令、调用工具、操作浏览器、整理结果。问题在于,很多时候我们并不想每次打开 Web 控制台,也不一定方便使用 Telegram。更自然的入口,是手机上每天都会打开的 IM(即时通信)工具。
钉钉机器人适合做这个入口,关键原因是它支持 Stream 模式。传统 Webhook 需要把一个 HTTP 地址暴露给钉钉平台,家庭网络、办公室内网、没有公网 IP 的服务器都会比较麻烦;Stream 模式基于 WebSocket 长连接,由本地服务主动建立连接,消息再通过这条连接推送进来。
整体链路可以理解成这样:
flowchart LR
U[用户在钉钉发送消息] --> D[钉钉平台]
D -->|Stream / WebSocket| C[Clawdbot 钉钉 Channel]
C --> G[Clawdbot Gateway]
G --> A[AI Agent]
A --> T[工具调用]
T --> B[Chrome 浏览器 / Skill / 其他工具]
B --> A
A --> C
C --> D
D --> U[钉钉返回结果]
这个方案能解决三个实际问题:
- 不用公网 IP:钉钉消息通过 Stream 长连接进入 Clawdbot。
- 手机端可直接发指令:钉钉就是入口,不需要额外打开控制台。
- 可以继续调用本地能力:比如控制 Chrome、读取网页、执行 Skill、操作内部系统。
接入方式怎么选
Clawdbot 可以通过多种方式接收用户消息,不同入口适合不同场景。
| 接入方式 | 优点 | 限制 | 适合场景 |
|---|---|---|---|
| Web 控制台 | 配置少,启动后就能用 | 必须打开浏览器页面 | 本地调试、快速体验 |
| Telegram | 生态成熟,海外网络环境友好 | 国内使用经常需要额外网络配置 | 开发者个人使用、海外团队 |
| 钉钉机器人 | 国内访问稳定,适合团队协作,不依赖公网 Webhook | 需要创建钉钉企业内部应用 | 国内用户、企业内部助手、移动端入口 |
钉钉方案的重点不是“聊天”,而是把 Clawdbot 暴露成一个随时可调用的工作入口。用户发一句“查一下今天的天气”,Clawdbot 收到消息后可以判断是否需要搜索、是否要打开浏览器、是否要调用脚本,处理完再把结果发回钉钉。
准备环境
开始配置前,需要具备这些条件:
| 项目 | 要求 |
|---|---|
| Clawdbot | 已安装并能正常运行 |
| 钉钉账号 | 个人账号也可以创建企业组织 |
| Node.js | 版本不低于 22 |
| 本机网络 | 能访问钉钉开放平台 |
| Chrome | 如果需要浏览器控制,需要安装 Chrome |
确认 Clawdbot 是否正常:
clawdbot status
如果 Gateway 没有运行,可以启动或重启:
clawdbot gateway restart
安装钉钉 Channel 插件
Clawdbot 通过 Channel 插件接入外部消息源。钉钉接入可以使用 clawdbot-channel-dingtalk 插件。
clawdbot plugins install https://github.com/soimy/clawdbot-channel-dingtalk.git
安装过程通常会完成几件事:
- 拉取插件代码;
- 安装插件依赖;
- 注册到 Clawdbot 插件列表;
- 等待配置文件启用对应 Channel。
安装后可以查看插件列表,确认插件是否存在:
clawdbot plugins list
创建钉钉企业内部应用
钉钉机器人需要挂在一个企业内部应用下面。即使只是个人使用,也可以创建一个钉钉企业组织,然后在开放平台里创建内部应用。
访问钉钉开放平台:
https://open.dingtalk.com/develop/app
创建应用时选择:
企业内部开发
应用信息可以按自己的用途填写,例如:
| 字段 | 示例 |
|---|---|
| 应用名称 | Clawdbot AI 助手 |
| 应用描述 | 私有 AI Agent 入口 |
| 应用类型 | 企业内部应用 |
应用创建完成后,需要给它添加机器人能力。
启用机器人能力并选择 Stream 模式
进入应用开发页面后,在能力配置里添加“机器人”。机器人配置里最关键的选项是消息接收方式。
| 配置项 | 推荐值 | 说明 |
|---|---|---|
| 消息接收方式 | Stream 模式 | 使用长连接接收消息,不需要公网 Webhook |
| 发布范围 | 全员可用或指定成员/部门 | 控制谁能看到和使用机器人 |
| 机器人名称 | 自定义 | 钉钉里展示的名称 |
Stream 模式背后的通信方式可以这样理解:
sequenceDiagram
participant C as Clawdbot 钉钉 Channel
participant D as 钉钉平台
participant A as Clawdbot Agent
C->>D: 使用应用凭证建立 Stream 长连接
D-->>C: 连接建立成功
D->>C: 推送用户消息
C->>A: 转发消息给 Agent
A-->>C: 生成回复
C-->>D: 调用钉钉接口发送回复
D-->>用户: 展示机器人消息
因为连接是从本地 Clawdbot 主动发起的,所以路由器、NAT、防火墙后面的机器也能正常使用,不需要额外做端口映射。
获取钉钉应用凭证
Clawdbot 需要使用钉钉应用凭证连接 Stream 服务,并在回复消息时调用钉钉接口。
常用参数如下:
| 参数 | 钉钉后台位置 | 用途 |
|---|---|---|
clientId | 应用凭证里的 AppKey | 应用唯一标识 |
clientSecret | 应用凭证里的 AppSecret | 调用接口的密钥 |
robotCode | 机器人配置页面 | 标识具体机器人,很多情况下与 AppKey 一致 |
corpId | 应用凭证里的企业 ID | 标识钉钉企业组织 |
agentId | 应用信息里的应用 ID | 标识内部应用实例 |
这些值属于敏感配置,尤其是 clientSecret。不要提交到 Git 仓库,也不要发到群聊里。
配置 Clawdbot 的钉钉 Channel
编辑 Clawdbot 配置文件:
vim ~/.clawdbot/clawdbot.json
在 channels 节点下加入钉钉配置:
{
"channels": {
"dingtalk": {
"enabled": true,
"clientId": "dingxxxxxxxxxxxxx",
"clientSecret": "your-app-secret-here",
"robotCode": "dingxxxxxxxxxxxxx",
"corpId": "dingxxxxxxxxxxxxx",
"agentId": "123456789",
"dmPolicy": "open",
"groupPolicy": "open",
"debug": false
}
}
}
几个策略参数需要特别注意:
| 参数 | 含义 | 示例值 |
|---|---|---|
dmPolicy | 私聊使用策略 | open、pairing |
groupPolicy | 群聊使用策略 | open、allowlist |
debug | 是否输出调试日志 | 排查问题时设为 true |
配置完成后重启 Gateway:
clawdbot gateway restart
查看钉钉 Channel 日志:
clawdbot logs | grep dingtalk
如果能看到类似信息,说明 Stream 连接已经建立:
[dingtalk] Stream connection established
Windows 环境可以用 findstr:
clawdbot logs | findstr dingtalk
在钉钉里验证机器人
在钉钉客户端中搜索刚创建的应用或机器人名称,发送一条测试消息:
你好
如果配置正确,Clawdbot 会收到消息,并通过钉钉 Channel 返回回复。验证失败时优先看三处:
- 钉钉应用是否已发布到当前账号可见范围;
- 机器人消息接收方式是否选择了 Stream 模式;
- Clawdbot Gateway 是否已经重启并加载了新配置。
让 Clawdbot 控制 Chrome
钉钉只负责把消息送到 Clawdbot。要让 Clawdbot 操作网页,还需要接入浏览器控制能力。
Chrome 扩展模式适合这种场景:用户打开自己的 Chrome 标签页,点击 Clawdbot 扩展让某个标签页进入可控状态,Clawdbot 再通过本地中继和 Chrome DevTools Protocol(Chrome 开发者工具协议,简称 CDP)控制页面。
整体结构如下:
flowchart TB
G[Clawdbot Gateway<br/>浏览器控制服务]
R[本地中继服务<br/>127.0.0.1:18792]
E[Chrome 扩展<br/>chrome.debugger API]
T[Chrome 标签页<br/>已附加的页面]
G -->|HTTP / CDP| R
R -->|WebSocket| E
E -->|CDP| T
这种方式有三个明显特点:
| 能力 | 说明 |
|---|---|
| 控制已有标签页 | 不需要再打开一个独立浏览器实例 |
| 使用当前登录状态 | 适合访问需要登录的网站 |
| 手动附加/分离 | 点击扩展图标即可控制某个页面是否交给 AI 操作 |
安装并加载 Chrome 扩展
安装扩展:
clawdbot browser extension install
查看扩展路径:
clawdbot browser extension path
输出类似:
/Users/your-name/.clawdbot/extensions/chrome-extension
在 Chrome 中加载扩展:
- 打开
chrome://extensions; - 开启右上角“开发者模式”;
- 点击“加载已解压的扩展程序”;
- 选择上面命令输出的扩展目录;
- 将扩展图标固定到工具栏,方便切换附加状态。
Clawdbot 通常自带一个名为 chrome 的浏览器配置文件。如果需要单独创建配置,可以执行:
clawdbot browser create-profile \
--name my-chrome \
--driver extension \
--cdp-url http://127.0.0.1:18792 \
--color "#00AA00"
参数含义:
| 参数 | 作用 |
|---|---|
--name | 浏览器配置名称,后续工具调用会用到 |
--driver extension | 使用 Chrome 扩展作为控制驱动 |
--cdp-url | 本地中继服务地址 |
--color | 用于区分配置的展示颜色 |
检查浏览器配置:
clawdbot browser profiles
检查当前可控标签页:
clawdbot browser tabs --browser-profile chrome
从钉钉发起一次浏览器搜索
假设目标是:在钉钉里发送“通过百度搜索今天天气”,Clawdbot 控制 Chrome 打开百度、执行搜索、读取结果,并把整理后的天气信息发回钉钉。
操作顺序如下:
- 在 Chrome 中打开
https://www.baidu.com; - 点击 Clawdbot 扩展图标,让当前标签页进入
ON状态; - 在钉钉机器人会话里发送:
通过百度搜索今天天气
Clawdbot 的内部执行链路可以画成时序图:
sequenceDiagram
participant U as 用户
participant D as 钉钉机器人
participant A as Clawdbot Agent
participant B as Browser 工具
participant C as Chrome 标签页
U->>D: 通过百度搜索今天天气
D->>A: 转发用户消息
A->>A: 判断需要网页搜索
A->>B: 使用 chrome profile
B->>C: 定位百度搜索框
B->>C: 输入“今天天气”
B->>C: 点击搜索
B->>C: 获取页面快照
C-->>B: 返回搜索结果页面内容
B-->>A: 返回结构化页面信息
A->>A: 提取天气摘要
A-->>D: 发送回复
D-->>U: 展示搜索结果
Clawdbot 在浏览器侧通常会做这些动作:
1. 接收钉钉消息
2. 将消息交给 AI Agent
3. Agent 判断用户意图是搜索天气
4. 选择 browser 工具
5. 使用 chrome 浏览器配置
6. 定位搜索框
7. 输入搜索词
8. 点击搜索按钮
9. 读取页面内容或页面快照
10. 提炼结果并通过钉钉返回
返回内容可能类似:
根据搜索结果,今天的天气如下:
上海:多云,8°C ~ 15°C,东南风 2 级。
数据来源:中国天气网。
真实返回结果取决于搜索引擎页面、当前位置、搜索词和 Clawdbot 可读取到的页面内容。
常见故障排查
钉钉机器人没有回复
常见原因:
| 现象 | 可能原因 | 排查方式 |
|---|---|---|
| 发送消息后无响应 | 应用未发布或当前账号不可见 | 检查应用发布范围 |
| 日志里没有钉钉消息 | Stream 模式未配置成功 | 检查机器人消息接收方式 |
| 修改配置后仍无效 | Gateway 没有重启 | 执行 clawdbot gateway restart |
| 日志报鉴权错误 | AppKey、AppSecret、Corp ID 等填错 | 回到钉钉后台核对凭证 |
常用命令:
clawdbot logs | grep dingtalk
clawdbot gateway restart
clawdbot config get channels.dingtalk
Chrome 扩展图标显示 !
! 通常表示扩展无法连接本地中继服务。
排查本地 Gateway 状态:
clawdbot status
检查 18792 端口是否被占用。
macOS / Linux:
lsof -i :18792
Windows:
netstat -ano | findstr :18792
重启 Gateway:
clawdbot gateway restart
如果端口被其他程序占用,需要释放端口或调整 Clawdbot 的浏览器中继配置。
浏览器能附加,但控制无响应
按这个顺序检查:
# 查看浏览器配置
clawdbot browser profiles
# 查看 chrome profile 下的标签页
clawdbot browser tabs --browser-profile chrome
还需要确认 Chrome 里当前标签页的扩展状态是 ON。如果页面没有被附加,Clawdbot 看不到它,也就无法执行点击、输入、截图等操作。
简单搜索可以改用 Skill
Chrome 扩展适合“像人一样操作网页”,但并不是所有搜索任务都值得启动浏览器。如果只是查询天气、抓取网页、调用搜索接口,Skill 通常更轻量。
| 对比项 | Chrome 扩展方案 | Skill 方案 |
|---|---|---|
| 配置复杂度 | 需要安装扩展、加载 Chrome、附加标签页 | 配好 Skill 即可调用 |
| 资源占用 | 需要运行 Chrome | 通常只是脚本执行 |
| 登录状态 | 可以复用浏览器登录态 | 需要额外处理 Cookie 或 Token |
| 动态页面 | 适合 JavaScript 渲染页面 | 不适合复杂前端交互 |
| 执行速度 | 浏览器操作相对慢 | 直接请求通常更快 |
| 典型场景 | 登录后台、复杂表单、多步骤交互 | 搜索、网页抓取、API 查询、批量下载 |
安装一个本地网页抓取 Skill 的示例:
git clone https://github.com/edwin19861218/skills-demo.git ~/.claude/skills/local-web-fetch
钉钉里发送:
搜索今天天气
Clawdbot 可以直接调用脚本获取结果,不需要打开 Chrome。
选择方案时可以按任务类型判断:
| 任务 | 推荐方案 |
|---|---|
| 查询公开网页内容 | Skill |
| 调用天气、股票、内部 API | Skill |
| 批量下载文件 | Skill |
| 访问需要登录的网站 | Chrome 扩展 |
| 操作 OA、后台系统、管理控制台 | Chrome 扩展 |
| 处理弹窗、按钮、表单、多页面流程 | Chrome 扩展 |
| 需要截图或视觉确认 | Chrome 扩展 |
安全配置建议
钉钉入口一旦接上 Clawdbot,就相当于给 AI Agent 开了一个远程指令入口。配置时不能只考虑能不能用,还要限制谁能用、能用到什么程度。
限制钉钉使用范围
如果机器人只给少数人使用,不要把私聊和群聊策略都设成完全开放。可以改成配对或白名单模式。
示例配置使用 JSONC 表达,实际写入 clawdbot.json 时要去掉注释:
{
"channels": {
"dingtalk": {
"enabled": true,
"clientId": "dingxxxxxxxxxxxxx",
"clientSecret": "your-app-secret-here",
"robotCode": "dingxxxxxxxxxxxxx",
"corpId": "dingxxxxxxxxxxxxx",
"agentId": "123456789",
// 私聊需要配对验证
"dmPolicy": "pairing",
// 群聊只允许白名单
"groupPolicy": "allowlist",
// 允许的用户或群,根据插件支持的格式填写
"allowFrom": ["user1", "user2"],
"debug": false
}
}
}
保护应用密钥
clientSecret 泄露后,别人可能冒用应用能力调用钉钉接口。建议做到:
- 配置文件只放在运行 Clawdbot 的机器上;
- 不把
~/.clawdbot/clawdbot.json提交到代码仓库; - 服务器多人共用时限制文件权限;
- 怀疑泄露时立刻到钉钉后台重置密钥。
macOS / Linux 可以限制配置文件权限:
chmod 600 ~/.clawdbot/clawdbot.json
单独准备 AI 控制用的 Chrome 配置
不要让 AI 直接控制日常使用的 Chrome 配置文件。更安全的方式是准备一个专门的浏览器环境,只登录必要系统,避免同时打开邮箱、网银、云控制台等敏感页面。
建议:
- 为 Clawdbot 单独创建 Chrome 用户配置;
- 附加状态下不要访问敏感网站;
- 操作完成后关闭扩展附加状态;
- 定期检查哪些标签页处于
ON状态。
不要把本地中继端口暴露到公网
Chrome 扩展使用的本地中继地址通常是:
http://127.0.0.1:18792
这个端口应该只在本机或可信内网内使用。不要直接映射到公网。如果确实需要远程访问,可以考虑 Tailscale 这类组网工具,把访问范围限制在自己的设备之间。
完成后的检查清单
配置完成后,可以按这个清单验证链路是否正常:
| 检查项 | 命令或操作 | 期望结果 |
|---|---|---|
| Clawdbot Gateway | clawdbot status | Gateway 正常运行 |
| 钉钉插件 | clawdbot plugins list | 能看到 dingtalk Channel 插件 |
| 钉钉连接 | clawdbot logs | grep dingtalk | 出现 Stream connection established |
| 钉钉消息 | 给机器人发送“你好” | 收到 Clawdbot 回复 |
| Chrome 扩展 | 打开 chrome://extensions | 扩展已加载 |
| 本地中继 | lsof -i :18792 | 端口被 Clawdbot 使用 |
| 标签页附加 | 点击扩展图标 | 页面显示 ON |
| 浏览器工具 | clawdbot browser tabs --browser-profile chrome | 能看到可控标签页 |
参考链接
- Clawdbot:
https://github.com/clawdbot/clawdbot - 钉钉开发者后台:
https://open.dingtalk.com/develop/app - 钉钉 Channel 插件:
https://github.com/soimy/clawdbot-channel-dingtalk - Clawdbot 官方文档:
https://docs.molt.bot/ - Chrome 扩展配置文档:
https://docs.molt.bot/tools/chrome-extension - Moltbot 讨论区:
https://github.com/moltbot/moltbot/discussions