# openclaw-docker-cn-im
**Repository Path**: itsforkgithub/openclaw-docker-cn-im
## Basic Information
- **Project Name**: openclaw-docker-cn-im
- **Description**: OpenClaw 的中国IM平台整合Docker版本,预装并配置了飞书、钉钉、QQ机器人、企业微信等主流中国IM软件的插件,让您可以快速部署一个支持多个中国IM平台的 AI 机器人网关
- **Primary Language**: Unknown
- **License**: GPL-3.0
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 1
- **Created**: 2026-03-11
- **Last Updated**: 2026-03-11
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# OpenClaw-Docker-CN-IM
> 🚀 **推荐搭配**:OpenClaw 功能强大但 Token 消耗较大,推荐配合 [AIClient-2-API](https://github.com/justlovemaki/AIClient-2-API) 项目使用,将各大 AI 客户端转换为标准 API 接口,实现无限 Token 调用,彻底解决 Token 焦虑!本项目已支持 OpenAI 和 Claude 两种协议,可直接对接 AIClient-2-API 服务。
## 项目简介
OpenClaw 中国 IM 插件整合版 Docker 镜像,预装并配置了飞书、钉钉、QQ机器人、企业微信等主流中国 IM 平台插件,让您可以快速部署一个支持多个中国 IM 平台的 AI 机器人网关。
**项目地址**: https://github.com/justlovemaki/OpenClaw-Docker-CN-IM
### 核心特性
- 🚀 **开箱即用**:预装所有中国主流 IM 平台插件
- 🔧 **灵活配置**:通过环境变量轻松配置各平台凭证
- 🐳 **Docker 部署**:一键启动,无需复杂配置
- 📦 **数据持久化**:支持配置和工作空间数据持久化
- 💻 **OpenCode AI**:内置 AI 代码助手,支持智能代码生成和分析
- 🎭 **Playwright**:预装浏览器自动化工具,支持网页操作和截图
- 🗣️ **中文 TTS**:支持中文语音合成(Text-to-Speech)
### 历史更新
点击展开查看历史更新记录
#### 2026 年 3 月
| 日期 | 版本 | 更新内容 |
|------|------|----------|
| 2026-03-08 | `2026.3.2-f3` |
|
| 2026-03-04 | `2026.3.2-f2` |
|
| 2026-03-02 | `2026.3.1` |
|
飞书配置
### 1. 获取飞书机器人凭证
1. 在 [飞书开放平台](https://open.feishu.cn/) 创建自建应用
2. 添加应用能力-机器人
3. 在凭证页面获取 **App ID** 和 **App Secret**
4. 开启所需权限(见下方)⚠️ **重要**
5. 配置事件订阅(见下方)⚠️ **重要**
### 2. 必需权限(租户级别)
| 权限 | 范围 | 说明 |
|------|------|------|
| `im:message` | 消息 | 发送和接收消息(核心权限) |
| `im:message.p2p_msg:readonly` | 私聊 | 读取发给机器人的私聊消息 |
| `im:message.group_at_msg:readonly` | 群聊 | 接收群内 @机器人 的消息 |
| `im:message:send_as_bot` | 发送 | 以机器人身份发送消息 |
| `im:resource` | 媒体 | 上传和下载图片/文件 |
| `im:chat.members:bot_access` | 群成员 | 获取群成员信息 |
| `im:chat.access_event.bot_p2p_chat:read` | 聊天事件 | 读取机器人单聊事件 |
### 3. 推荐权限(租户级别)
| 权限 | 范围 | 说明 |
|------|------|------|
| `contact:user.employee_id:readonly` | 用户信息 | 获取用户员工 ID(用于用户识别) |
| `im:message:readonly` | 读取 | 获取历史消息 |
| `application:application:self_manage` | 应用管理 | 应用自我管理 |
| `application:bot.menu:write` | 机器人菜单 | 配置机器人菜单 |
| `event:ip_list` | IP 列表 | 获取飞书服务器 IP 列表 |
### 4. 可选权限(租户级别)
| 权限 | 范围 | 说明 |
|------|------|------|
| `aily:file:read` | AI 文件读取 | 读取 AI 助手文件 |
| `aily:file:write` | AI 文件写入 | 写入 AI 助手文件 |
| `application:application.app_message_stats.overview:readonly` | 消息统计 | 查看应用消息统计概览 |
| `corehr:file:download` | 人事文件 | 下载人事系统文件 |
### 5. 用户级别权限(可选)
| 权限 | 范围 | 说明 |
|------|------|------|
| `aily:file:read` | AI 文件读取 | 以用户身份读取 AI 助手文件 |
| `aily:file:write` | AI 文件写入 | 以用户身份写入 AI 助手文件 |
| `im:chat.access_event.bot_p2p_chat:read` | 聊天事件 | 以用户身份读取机器人单聊事件 |
官方飞书插件推荐权限 JSON(默认折叠)
```json
{
"scopes": {
"tenant": [
"contact:contact.base:readonly",
"docx:document:readonly",
"im:chat:read",
"im:chat:update",
"im:message.group_at_msg:readonly",
"im:message.p2p_msg:readonly",
"im:message.pins:read",
"im:message.pins:write_only",
"im:message.reactions:read",
"im:message.reactions:write_only",
"im:message:readonly",
"im:message:recall",
"im:message:send_as_bot",
"im:message:send_multi_users",
"im:message:send_sys_msg",
"im:message:update",
"im:resource",
"application:application:self_manage",
"cardkit:card:write",
"cardkit:card:read"
],
"user": [
"contact:user.employee_id:readonly",
"offline_access",
"base:app:copy",
"base:field:create",
"base:field:delete",
"base:field:read",
"base:field:update",
"base:record:create",
"base:record:delete",
"base:record:retrieve",
"base:record:update",
"base:table:create",
"base:table:delete",
"base:table:read",
"base:table:update",
"base:view:read",
"base:view:write_only",
"base:app:create",
"base:app:update",
"base:app:read",
"board:whiteboard:node:create",
"board:whiteboard:node:read",
"calendar:calendar:read",
"calendar:calendar.event:create",
"calendar:calendar.event:delete",
"calendar:calendar.event:read",
"calendar:calendar.event:reply",
"calendar:calendar.event:update",
"calendar:calendar.free_busy:read",
"contact:contact.base:readonly",
"contact:user.base:readonly",
"contact:user:search",
"docs:document.comment:create",
"docs:document.comment:read",
"docs:document.comment:update",
"docs:document.media:download",
"docs:document:copy",
"docx:document:create",
"docx:document:readonly",
"docx:document:write_only",
"drive:drive.metadata:readonly",
"drive:file:download",
"drive:file:upload",
"im:chat.members:read",
"im:chat:read",
"im:message",
"im:message.group_msg:get_as_user",
"im:message.p2p_msg:get_as_user",
"im:message.send_as_user",
"im:message:readonly",
"search:docs:read",
"search:message",
"space:document:delete",
"space:document:move",
"space:document:retrieve",
"task:comment:read",
"task:comment:write",
"task:task:read",
"task:task:write",
"task:task:writeonly",
"task:tasklist:read",
"task:tasklist:write",
"wiki:node:copy",
"wiki:node:create",
"wiki:node:move",
"wiki:node:read",
"wiki:node:retrieve",
"wiki:space:read",
"wiki:space:retrieve",
"wiki:space:write_only"
]
}
}
```
钉钉配置
### 1. 创建钉钉应用
1. 访问 [钉钉开发者后台](https://open-dev.dingtalk.com/)
2. 创建企业内部应用
3. 添加「机器人」能力
4. 配置消息接收模式为 **Stream 模式**
5. 发布应用
### 2. 获取凭证
从开发者后台获取:
- **Client ID**(AppKey)
- **Client Secret**(AppSecret)
- **Robot Code**(与 Client ID 相同)
- **Corp ID**(与 Client ID 相同)
- **Agent ID**(应用 ID)
### 3. 环境变量配置
在 `.env` 文件中添加:
```bash
DINGTALK_CLIENT_ID=your-dingtalk-client-id
DINGTALK_CLIENT_SECRET=your-dingtalk-client-secret
DINGTALK_ROBOT_CODE=your-dingtalk-robot-code
DINGTALK_CORP_ID=your-dingtalk-corp-id
DINGTALK_AGENT_ID=your-dingtalk-agent-id
```
**参数说明**:
- `DINGTALK_CLIENT_ID` - 必需,钉钉应用的 Client ID(AppKey)
- `DINGTALK_CLIENT_SECRET` - 必需,钉钉应用的 Client Secret(AppSecret)
- `DINGTALK_ROBOT_CODE` - 可选,机器人 Code,默认与 Client ID 相同
- `DINGTALK_CORP_ID` - 可选,企业 ID
- `DINGTALK_AGENT_ID` - 可选,应用 Agent ID
> 💡 **参考项目**:[openclaw-channel-dingtalk](https://github.com/soimy/openclaw-channel-dingtalk) - 钉钉渠道完整实现示例
QQ 机器人配置
### 1. 获取 QQ 机器人凭证
1. 访问 [QQ 开放平台](https://q.qq.com/)
2. 创建机器人应用
3. 获取 AppID 和 AppSecret(ClientSecret)
4. 获取主机在公网的 IP,配置到 IP 白名单
### 2. 环境变量配置
在 `.env` 文件中添加:
```bash
QQBOT_APP_ID=你的AppID
QQBOT_CLIENT_SECRET=你的AppSecret
```
> 💡 **参考项目**:[qqbot](https://github.com/sliverp/qqbot) - QQ 机器人完整实现示例
企业微信配置
### 1. 获取企业微信凭证
1. 访问 [企业微信管理后台](https://work.weixin.qq.com/)
2. 进入"应用管理",用 API 模式创建一个或多个"智能机器人"应用
3. 在每个应用的"接收消息"配置中设置 Token 和 EncodingAESKey
4. 配置对应回调 URL(见下方单账号/多账号路径说明)
### 2. 单账号配置(兼容旧格式)
在 `.env` 文件中添加:
```bash
WECOM_TOKEN=your-token
WECOM_ENCODING_AES_KEY=your-aes-key
```
> 启动后会自动写入 [`channels.wecom.default`](openclaw.json.example:155) 结构,旧配置无需手工迁移。
### 3. 多账号配置(Multi-Bot)
在 [`openclaw.json`](README.md:648) 的 [`channels.wecom`](openclaw.json.example:154) 下使用字典结构,每个 key 为账号 ID(如 `bot1`、`bot2`),每个 value 为该账号独立配置:
```json
{
"channels": {
"wecom": {
"bot1": {
"token": "Bot1 的 Token",
"encodingAesKey": "Bot1 的 EncodingAESKey",
"adminUsers": ["admin1"],
"agent": {
"corpId": "企业 CorpID",
"corpSecret": "Bot1 应用 Secret",
"agentId": 1000001,
"token": "Bot1 回调 Token",
"encodingAesKey": "Bot1 回调 EncodingAESKey"
},
"webhooks": {
"ops-group": "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx"
}
},
"bot2": {
"token": "Bot2 的 Token",
"encodingAesKey": "Bot2 的 EncodingAESKey",
"agent": {
"corpId": "企业 CorpID",
"corpSecret": "Bot2 应用 Secret",
"agentId": 1000002
}
}
}
}
}
```
### 4. 多账号环境变量配置(Docker Compose)
现在支持直接在 [`.env.example`](.env.example) / `.env` 中通过 `WECOM_BOTS_JSON` 配置多账号,并由 [`docker-compose.yml`](docker-compose.yml) 自动透传到容器。
示例(单行 JSON):
```bash
WECOM_BOTS_JSON={"bot1":{"token":"t1","encodingAesKey":"k1","agent":{"corpId":"wwxxx","corpSecret":"s1","agentId":1000001}},"bot2":{"token":"t2","encodingAesKey":"k2","agent":{"corpId":"wwxxx","corpSecret":"s2","agentId":1000002}}}
```
说明:
- `WECOM_BOTS_JSON` 会与现有 [`channels.wecom`](openclaw.json.example:154) 做深度合并,不会粗暴覆盖整个对象
- 若同时配置了 `WECOM_TOKEN` / `WECOM_ENCODING_AES_KEY`,会写入 `default` 账号
- 若 `WECOM_BOTS_JSON` 中也包含 `default`,其字段会覆盖同名字段
### 5. 多账号规则与回调路径
- 账号 ID 仅支持小写字母、数字、`-`、`_`
- 旧单账号结构(`token` 直接写在 `wecom` 下)会自动识别并迁移为 `default` 账号
- WeCom 机器人回调路径按账号分配:`/webhooks/wecom/{accountId}`,例如 `bot1` 对应 `/webhooks/wecom/bot1`
- Agent 回调路径按账号分配:`/webhooks/app/{accountId}`,例如 `bot2` 对应 `/webhooks/app/bot2`
- 动态会话 ID 按账号隔离:`wecom-{accountId}-dm-{userId}`、`wecom-{accountId}-group-{chatId}`
- 启动时会自动检测重复 Token / Agent ID,避免消息路由冲突
⚠️ 多账号模式下,需要在企业微信后台为每个账号分别配置对应 URL(例如 `/webhooks/wecom/bot1`)。
> 💡 **参考项目**:[openclaw-plugin-wecom](https://github.com/sunnoy/openclaw-plugin-wecom) - 企业微信插件完整实现示例
点击展开 AIClient-2-API 配置说明
本项目已支持 OpenAI 和 Claude 两种协议,可直接对接 [AIClient-2-API](https://github.com/justlovemaki/AIClient-2-API) 服务。
### 前置准备
1. 启动 AIClient-2-API 服务
2. 在 Web UI (`http://localhost:3000`) 配置至少一个提供商
3. 记录配置文件中的 API Key
### 配置方式一:OpenAI 协议(推荐用于 Gemini)
在 `.env` 文件中配置:
```bash
MODEL_ID=gemini-3-flash-preview
BASE_URL=http://localhost:3000/v1
API_KEY=your-api-key
API_PROTOCOL=openai-completions
CONTEXT_WINDOW=1000000
MAX_TOKENS=8192
```
### 配置方式二:Claude 协议(推荐用于 Claude)
在 `.env` 文件中配置:
```bash
MODEL_ID=claude-sonnet-4-5
BASE_URL=http://localhost:3000
API_KEY=your-api-key
API_PROTOCOL=anthropic-messages
CONTEXT_WINDOW=200000
MAX_TOKENS=8192
```
### 指定特定提供商(可选)
如需指定特定提供商,可修改 Base URL:
```bash
# Kiro 提供的 Claude (OpenAI 协议)
BASE_URL=http://localhost:3000/claude-kiro-oauth/v1
# Kiro 提供的 Claude (Claude 协议)
BASE_URL=http://localhost:3000/claude-kiro-oauth
# Gemini CLI (OpenAI 协议)
BASE_URL=http://localhost:3000/gemini-cli-oauth/v1
# Antigravity (OpenAI 协议)
BASE_URL=http://localhost:3000/gemini-antigravity/v1
```
使用 Docker 命令运行
如果不使用 Docker Compose,可以直接使用 Docker 命令:
```bash
docker run -d \
--name openclaw-gateway \
--cap-add=CHOWN \
--cap-add=SETUID \
--cap-add=SETGID \
--cap-add=DAC_OVERRIDE \
-e MODEL_ID=model id \
-e BASE_URL=http://xxxxx/v1 \
-e API_KEY=123456 \
-e API_PROTOCOL=openai-completions \
-e CONTEXT_WINDOW=200000 \
-e MAX_TOKENS=8192 \
-e FEISHU_APP_ID=your-app-id \
-e FEISHU_APP_SECRET=your-app-secret \
-e DINGTALK_CLIENT_ID=your-dingtalk-client-id \
-e DINGTALK_CLIENT_SECRET=your-dingtalk-client-secret \
-e DINGTALK_ROBOT_CODE=your-dingtalk-robot-code \
-e DINGTALK_CORP_ID=your-dingtalk-corp-id \
-e DINGTALK_AGENT_ID=your-dingtalk-agent-id \
-e QQBOT_APP_ID=your-qqbot-app-id \
-e QQBOT_CLIENT_SECRET=your-qqbot-client-secret \
-e WECOM_TOKEN=your-token \
-e WECOM_ENCODING_AES_KEY=your-aes-key \
-e OPENCLAW_GATEWAY_TOKEN=123456 \
-e OPENCLAW_GATEWAY_BIND=lan \
-e OPENCLAW_GATEWAY_PORT=18789 \
-v ~/.openclaw:/home/node/.openclaw \
-v ~/.openclaw/workspace:/home/node/.openclaw/workspace \
-p 18789:18789 \
-p 18790:18790 \
--restart unless-stopped \
justlikemaki/openclaw-docker-cn-im:latest
```
数据持久化
容器使用以下卷进行数据持久化:
- `/home/node/.openclaw` - OpenClaw 配置和数据目录
- `/home/node/.openclaw/workspace` - 工作空间目录
端口说明
- `18789` - OpenClaw Gateway 端口
- `18790` - OpenClaw Bridge 端口
自定义配置文件
如果需要完全自定义配置文件,可以:
1. 在宿主机创建配置文件 `~/.openclaw/openclaw.json`
2. 挂载该目录到容器:`-v ~/.openclaw:/home/node/.openclaw`
3. 容器启动时会检测到已存在的配置文件,跳过自动生成
项目文件说明
- [`Dockerfile`](Dockerfile) - Docker 镜像构建文件
- [`init.sh`](init.sh) - 容器初始化脚本(作为主程序运行)
- [`docker-compose.yml`](docker-compose.yml) - Docker Compose 配置文件
- [`.env.example`](.env.example) - 环境变量配置模板
- [`.dockerignore`](.dockerignore) - Docker 构建忽略文件
- [`openclaw.json.example`](openclaw.json.example) - OpenClaw 默认配置文件示例
构建镜像
```bash
docker build -t justlikemaki/openclaw-docker-cn-im:latest .
```
初始化脚本功能
[`init.sh`](init.sh) 脚本在容器启动时执行以下操作:
1. 创建必要的目录结构
2. 根据环境变量动态生成配置文件(如果不存在)
3. 设置正确的文件权限
4. 启动 OpenClaw Gateway 服务(verbose 模式)
配置文件生成
容器首次启动时,如果 `/home/node/.openclaw/openclaw.json` 不存在,初始化脚本会根据环境变量自动生成配置文件,包括:
- **模型配置**:使用指定的模型和 Provider
- **通道配置**:根据提供的环境变量启用相应的 IM 平台
- **Gateway 配置**:端口、绑定地址、认证令牌
- **插件配置**:自动启用相应的通道插件
安装的包
镜像中已全局安装以下 npm 包:
- `openclaw@latest` - OpenClaw 主程序
- `opencode-ai@latest` - OpenCode AI
- `playwright` - Playwright 浏览器自动化工具
- `@openclaw/feishu` - 飞书插件
- `clawdbot-channel-dingtalk` - 钉钉插件(从 GitHub 安装)
- `qqbot` - QQ 机器人插件(先克隆到 `/tmp/qqbot`,然后从本地目录安装)
- `openclaw-plugin-wecom` - 企业微信插件(从 GitHub 安装)
启动命令
容器使用以下命令启动 OpenClaw:
```bash
openclaw gateway --verbose
```
这将以详细日志模式启动 Gateway 服务。