芥末
发布于 2026-01-29 / 0 阅读
0
0

用钉钉 Stream 模式接入私有 Clawdbot 并控制 Chrome

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[钉钉返回结果]

这个方案能解决三个实际问题:

  1. 不用公网 IP:钉钉消息通过 Stream 长连接进入 Clawdbot。
  2. 手机端可直接发指令:钉钉就是入口,不需要额外打开控制台。
  3. 可以继续调用本地能力:比如控制 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私聊使用策略openpairing
groupPolicy群聊使用策略openallowlist
debug是否输出调试日志排查问题时设为 true

配置完成后重启 Gateway:

clawdbot gateway restart

查看钉钉 Channel 日志:

clawdbot logs | grep dingtalk

如果能看到类似信息,说明 Stream 连接已经建立:

[dingtalk] Stream connection established

Windows 环境可以用 findstr

clawdbot logs | findstr dingtalk

在钉钉里验证机器人

在钉钉客户端中搜索刚创建的应用或机器人名称,发送一条测试消息:

你好

如果配置正确,Clawdbot 会收到消息,并通过钉钉 Channel 返回回复。验证失败时优先看三处:

  1. 钉钉应用是否已发布到当前账号可见范围;
  2. 机器人消息接收方式是否选择了 Stream 模式;
  3. 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 中加载扩展:

  1. 打开 chrome://extensions
  2. 开启右上角“开发者模式”;
  3. 点击“加载已解压的扩展程序”;
  4. 选择上面命令输出的扩展目录;
  5. 将扩展图标固定到工具栏,方便切换附加状态。

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 打开百度、执行搜索、读取结果,并把整理后的天气信息发回钉钉。

操作顺序如下:

  1. 在 Chrome 中打开 https://www.baidu.com
  2. 点击 Clawdbot 扩展图标,让当前标签页进入 ON 状态;
  3. 在钉钉机器人会话里发送:
通过百度搜索今天天气

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
调用天气、股票、内部 APISkill
批量下载文件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 Gatewayclawdbot statusGateway 正常运行
钉钉插件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

评论