继《Moltbot 接入飞书》和《Moltbot 接入企业微信》后,本文将详细介绍如何将 Moltbot 接入钉钉,实现智能 AI 助手功能。钉钉官方已开源 Moltbot 连接器,让接入变得更加简单!


一、前期准备

1.1 所需资源清单

在开始部署之前,请确保准备好以下资源:

  • ✅ 钉钉企业账号:需要企业管理员或子管理员权限

  • ✅ 腾讯 CloudStudio 账号:用于部署 Moltbot 服务

  • ✅ AI 模型 API:如 OpenAI、Claude、通义千问等

  • ✅ 基础开发知识:了解 Node.js 或 Python 基本操作

1.2 技术架构概览


┌─────────────────┐      ┌──────────────────┐      ┌─────────────────┐

│   钉钉客户端      │ ───▶ │  钉钉 Stream 服务器 │ ───▶ │  CloudStudio    │

│  (用户发送消息)   │      │  (WebSocket 推送)  │      │  (Moltbot 服务) │

└─────────────────┘      └──────────────────┘      └─────────────────┘

                                                            │

                                                            ▼

                                                    ┌─────────────────┐

                                                    │   AI 模型 API    │

                                                    │  (生成回复内容)  │

                                                    └─────────────────┘

Stream 模式的优势:

  • 🚀 零公网 IP:无需公网服务器和域名

  • 🔒 零加解密:无需处理签名和 TLS 证书

  • 🛡️ 零防火墙:无需开放端口和配置白名单

  • 🌐 零内网穿透:本地开发即可接收回调

  • ⚡ 实时推送:通过 WebSocket 长连接实时接收消息


二、钉钉机器人应用配置

2.1 创建钉钉企业内部应用

步骤 1:进入钉钉开放平台
  1. 访问 钉钉开放平台[https://open-dev.dingtalk.com/]

  2. 使用钉钉扫码登录(需要管理员或子管理员权限)

  3. 进入 应用开发 → 企业内部开发

步骤 2:创建机器人应用
  1. 点击 创建应用 按钮

  2. 选择应用类型:机器人

  3. 填写应用基本信息:

   - 应用名称:Moltbot AI 助手(可自定义)

   - 应用图标:上传机器人头像

   - 应用描述:基于 Moltbot 的智能 AI 助手

步骤 3:获取应用凭证

创建完成后,在应用详情页 凭证与基础信息 中记录以下参数:

| 参数名称 | 获取位置 | 示例值 | 说明 |

|---------|---------|--------|------|

Client ID (AppKey) | 凭证与基础信息 | dingxxxxxxxxx | 应用唯一标识 |

Client Secret (AppSecret) | 凭证与基础信息(点击查看) | xxxxxxxxxxxxxxxx | 应用密钥(务必保密) |

Agent ID | 凭证与基础信息 | 123456789 | 应用代理 ID |

⚠️ 重要提示:Client Secret 只显示一次,请妥善保存!

2.2 配置机器人消息接收模式

步骤 1:进入消息推送设置
  1. 在应用详情页左侧导航,点击 消息推送

  2. 打开 机器人能力 开关

  3. 设置机器人基本信息:

   - 机器人名称:Moltbot

   - 消息接收模式:选择 Stream 模式(重要!)

   - 机器人描述:智能 AI 助手,可以帮你完成各种任务

💡 为什么选择 Stream 模式?

  • 传统 HTTP 模式需要公网服务器、域名、SSL 证书

  • Stream 模式通过 WebSocket 反向连接,无需任何公网资源

  • 开发调试更方便,本地环境即可接收消息

步骤 2:配置机器人权限

在应用详情页左侧导航,点击 权限管理,搜索并开通以下权限:

| 权限名称 | 权限代码 | 说明 |

|---------|---------|------|

| 卡片流式写入 | Card.Streaming.Write | 发送互动卡片消息 |

| 卡片实例写入 | Card.Instance.Write | 创建和更新卡片实例 |

| 企业内机器人发送消息 | qyapi_robot_sendmsg | 发送文本、图片等消息 |

📌 注意:非管理员用户需要管理员审批权限申请

2.3 发布应用

步骤 1:设置可见范围
  1. 在应用详情页左侧导航,点击 版本管理与发布

  2. 点击 确认发布 按钮

  3. 设置可见范围:

   - 全部员工(推荐用于测试)

   - 部分员工(按需选择部门或成员)

步骤 2:创建测试群
  1. 在 消息推送 页面,点击 点击调试 按钮

  2. 系统会自动创建一个测试群,机器人会自动加入

  3. 在测试群中可以直接 @机器人 进行测试


三、CloudStudio 环境搭建

3.1 创建工作空间

步骤 1:登录 CloudStudio

访问 腾讯 CloudStudio[https://cloudstudio.net/],使用微信或 QQ 登录

步骤 2:创建新工作空间
  1. 点击 新建工作空间

  2. 选择模板:Node.js(Moltbot 官方推荐)

  3. 配置参数:

   - 工作空间名称:moltbot-dingtalk

   - 运行环境:Ubuntu 20.04

   - 规格:选择 2核4G(免费版足够)

复制已经部署好的moltbot模板

https://cloudstudio.net/a/33091989687595008?channel=share&sharetype=URL

步骤 3:等待环境初始化

初始化完成后,会自动打开 VS Code 在线编辑器

3.2 安装 Moltbot 核心服务

在 CloudStudio 终端执行以下命令:


# 更新系统包

sudo apt update

  

# 安装 Node.js 18.x

curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -

sudo apt install -y nodejs

  

# 验证安装

node -v  # 应显示 v18.x.x

npm -v   # 应显示 9.x.x

  

# 安装 Moltbot CLI(全局安装)

npm install -g clawdbot

  

# 验证 Moltbot 安装

clawdbot --version

  

# 初始化 Moltbot 配置

clawdbot init

初始化配置交互式问答:


? 选择 AI 模型提供商: OpenAI / Claude / 通义千问 / 其他

? 输入 API Key: sk-xxxxxxxxxxxxxxxx

? 输入 API Base URL (可选): https://api.openai.com/v1

? 选择默认模型: gpt-3.5-turbo / gpt-4 / claude-3-sonnet

? 是否启用对话历史记录? Yes

? 设置会话超时时间(分钟): 30

初始化完成后,会在 ~/.moltbot/ 目录生成配置文件 moltbot.json


四、Moltbot 部署与配置

4.1 安装钉钉连接器插件

Moltbot 官方已开源钉钉连接器,可以直接安装:


# 远程安装钉钉连接器插件

clawdbot plugins install https://github.com/DingTalk-Real-AI/dingtalk-moltbot-connector.git

  

# 查看已安装插件

clawdbot plugins list

  

# 后续插件升级

clawdbot plugins update dingtalk-connector

插件安装成功标志:


✅ Plugin 'dingtalk-connector' installed successfully

📦 Version: 1.0.0

📝 Description: DingTalk Stream Mode Connector for Moltbot

4.2 配置钉钉连接器

编辑 Moltbot 配置文件 ~/.moltbot/moltbot.json:


# 使用 vim 或 nano 编辑配置文件

vim ~/.moltbot/moltbot.json

在配置文件中添加钉钉通道配置:


{

  "channels": {

    "dingtalk": {

      "enabled": true,

      "clientId": "dingxxxxxxxxx",           // 替换为你的 Client ID (AppKey)

      "clientSecret": "your_secret_here",    // 替换为你的 Client Secret (AppSecret)

      "sessionTimeout": 1800000,             // 会话超时时间(毫秒),默认 30 分钟

      // 可选:Gateway 认证配置(高级功能)

      "gatewayToken": "",                    // Gateway 认证 token

      "gatewayPassword": ""                  // Gateway 认证 password(与 token 二选一)

    }

  },

  // AI 模型配置

  "model": {

    "provider": "openai",                    // 模型提供商

    "apiKey": "sk-xxxxxxxxxxxxxxxx",         // API Key

    "baseURL": "https://api.openai.com/v1", // API Base URL

    "model": "gpt-3.5-turbo",                // 默认模型

    "temperature": 0.7,                      // 温度参数

    "maxTokens": 2000                        // 最大 token 数

  },

  // 对话配置

  "conversation": {

    "maxHistory": 10,                        // 最大历史消息数

    "systemPrompt": "你是 Moltbot,一个智能 AI 助手,可以帮助用户完成各种任务。"

  },

  // 日志配置

  "logging": {

    "level": "info",                         // 日志级别: debug / info / warn / error

    "file": "~/.moltbot/logs/moltbot.log"   // 日志文件路径

  }

}

配置参数说明:

| 参数名称 | 类型 | 必填 | 说明 |

|---------|------|------|------|

enabled | Boolean | ✅ | 是否启用钉钉通道 |

clientId | String | ✅ | 钉钉应用的 Client ID (AppKey) |

clientSecret | String | ✅ | 钉钉应用的 Client Secret (AppSecret) |

sessionTimeout | Number | ❌ | 会话超时时间(毫秒),默认 1800000 (30分钟) |

gatewayToken | String | ❌ | Gateway 认证 token(高级功能) |

gatewayPassword | String | ❌ | Gateway 认证 password(高级功能) |

4.3 配置环境变量(可选)

如果不想在配置文件中明文存储敏感信息,可以使用环境变量:


# 创建 .env 文件

cat > ~/.moltbot/.env << EOF

# 钉钉配置

DINGTALK_CLIENT_ID=dingxxxxxxxxx

DINGTALK_CLIENT_SECRET=your_secret_here

  

# AI 模型配置

AI_MODEL_API_KEY=sk-xxxxxxxxxxxxxxxx

AI_MODEL_BASE_URL=https://api.openai.com/v1

AI_MODEL_NAME=gpt-3.5-turbo

  

# 日志配置

LOG_LEVEL=info

EOF

  

# 设置环境变量权限

chmod 600 ~/.moltbot/.env

修改 moltbot.json 配置文件,使用环境变量:


{

  "channels": {

    "dingtalk": {

      "enabled": true,

      "clientId": "${DINGTALK_CLIENT_ID}",

      "clientSecret": "${DINGTALK_CLIENT_SECRET}"

    }

  },

  "model": {

    "apiKey": "${AI_MODEL_API_KEY}",

    "baseURL": "${AI_MODEL_BASE_URL}",

    "model": "${AI_MODEL_NAME}"

  }

}

4.4 启动 Moltbot 服务


# 启动 Moltbot 服务

clawdbot start

  

# 或者使用后台运行模式

clawdbot start --daemon

  

# 查看服务状态

clawdbot status

  

# 查看实时日志

clawdbot logs --follow

启动成功标志:


🚀 Moltbot 服务启动成功!

📡 钉钉 Stream 连接已建立

🤖 机器人已就绪,等待消息...

  

[INFO] DingTalk Stream client connected

[INFO] Listening for messages on channel: dingtalk

[INFO] Session timeout: 30 minutes

五、Stream 模式配置与验证

5.1 验证 Stream 连接

步骤 1:在钉钉开发者后台验证
  1. 返回钉钉开发者后台,进入应用详情页

  2. 点击左侧导航 开发配置 → 事件订阅

  3. 选择 Stream 模式推送

  4. 点击 验证 Stream 模式通道 按钮

验证成功标志:

  • ✅ 页面显示 "Stream 连接验证成功"

  • ✅ 连接状态显示为 "在线"

  • ✅ CloudStudio 终端输出验证日志

验证失败排查:

  • ❌ 检查 Moltbot 服务是否正常运行(clawdbot status)

  • ❌ 检查 Client ID 和 Client Secret 是否正确

  • ❌ 查看 Moltbot 日志文件排查错误(clawdbot logs)

步骤 2:配置事件订阅(可选)

如果需要接收更多事件通知(如员工入职、审批变更等),可以配置事件订阅:

  1. 在 事件订阅 页面,点击 添加订阅

  2. 勾选需要订阅的事件类型:

   - 通讯录事件:员工入职、离职、部门变更

   - 审批事件:审批任务状态变化

   - 群聊事件:用户加入/退出群聊

  1. 点击 确认 保存

5.2 测试消息收发

测试场景 1:单聊消息
  1. 在钉钉客户端,找到 Moltbot AI 助手 应用

  2. 点击进入应用,发送测试消息:你好

预期结果:


用户: 你好

Moltbot: 你好!我是 Moltbot AI 助手,有什么可以帮助你的吗?
测试场景 2:群聊消息
  1. 在测试群中,@机器人 发送消息:@Moltbot 介绍一下你自己

预期结果:


用户: @Moltbot 介绍一下你自己

Moltbot: 我是 Moltbot,一个基于大语言模型的智能 AI 助手。我可以帮你:

- 回答各种问题

- 生成文本内容

- 编写代码

- 数据分析

- 任务自动化

...
测试场景 3:多轮对话

用户: 帮我写一个 Python 快速排序算法

Moltbot: [返回代码示例]

  

用户: 能解释一下这个算法的时间复杂度吗?

Moltbot: [解释时间复杂度,并引用上一轮对话中的代码]

六、测试与验证

6.1 功能测试清单

| 测试项 | 测试内容 | 预期结果 | 状态 |

|-------|---------|---------|------|

| 基础对话 | 发送简单问候消息 | 机器人正常回复 | ✅ |

| 多轮对话 | 连续发送多条相关消息 | 机器人能记住上下文 | ✅ |

| 代码生成 | 请求生成代码示例 | 返回格式化的代码块 | ✅ |

| 长文本处理 | 发送超过 500 字的文本 | 正常处理并回复 | ✅ |

| 特殊字符 | 发送包含特殊字符的消息 | 正常处理特殊字符 | ✅ |

| 群聊 @机器人 | 在群聊中 @机器人 | 机器人正常响应 | ✅ |

| 并发消息 | 多人同时发送消息 | 所有消息都能正常处理 | ✅ |

| 会话超时 | 超过 30 分钟后再发消息 | 开启新会话,不记住历史 | ✅ |

6.2 性能测试

测试 1:响应时间

# 使用 curl 测试 API 响应时间

time curl -X POST https://your-moltbot-api.com/chat \

  -H "Content-Type: application/json" \

  -d '{"message": "你好"}'

性能指标:

  • ⚡ 平均响应时间:< 3 秒

  • ⚡ P95 响应时间:< 5 秒

  • ⚡ P99 响应时间:< 10 秒

测试 2:并发处理能力

# 使用 Apache Bench 进行压力测试

ab -n 100 -c 10 -p request.json -T application/json \

  https://your-moltbot-api.com/chat

性能指标:

  • 🚀 并发用户数:10

  • 🚀 总请求数:100

  • 🚀 成功率:> 99%

6.3 日志监控

查看实时日志

# 查看 Moltbot 实时日志

clawdbot logs --follow

  

# 过滤特定级别的日志

clawdbot logs --level error

  

# 查看最近 100 条日志

clawdbot logs --tail 100
日志示例

[2026-02-06 10:30:15] [INFO] DingTalk message received

[2026-02-06 10:30:15] [DEBUG] Message content: "你好"

[2026-02-06 10:30:15] [INFO] Calling AI model API

[2026-02-06 10:30:17] [INFO] AI response received

[2026-02-06 10:30:17] [INFO] Sending reply to DingTalk

[2026-02-06 10:30:18] [INFO] Message sent successfully

七、常见问题排查

7.1 Stream 连接失败

问题现象:


[ERROR] Failed to establish Stream connection

[ERROR] Connection refused or timeout

解决方案:

  1. 检查网络连接:

   ```bash

   # 测试是否能访问钉钉 API

   curl -I https://oapi.dingtalk.com

   # 测试 DNS 解析

   nslookup oapi.dingtalk.com

   ```

  1. 检查 Client ID 和 Secret:

   ```bash

   # 验证凭证是否正确

   clawdbot config show

   # 重新设置凭证

   clawdbot config set dingtalk.clientId "dingxxxxxxxxx"

   clawdbot config set dingtalk.clientSecret "your_secret_here"

   ```

  1. 检查防火墙设置:

   ```bash

   # CloudStudio 默认允许所有出站连接,无需配置

   # 如果是本地部署,需要确保防火墙允许 WebSocket 连接

   ```

  1. 重启 Moltbot 服务:

   ```bash

   clawdbot restart

   ```

7.2 消息发送失败

问题现象:


[ERROR] Failed to send message to DingTalk

[ERROR] API error: 40014 - invalid access_token

解决方案:

  1. 检查权限配置:

   - 确认已开通 qyapi_robot_sendmsg 权限

   - 确认权限审批已通过(非管理员用户)

  1. 手动测试 API:

   ```bash

   # 获取 access_token

   curl -X GET "https://oapi.dingtalk.com/gettoken?appkey=YOUR_CLIENT_ID&appsecret=YOUR_CLIENT_SECRET[https://oapi.dingtalk.com/gettoken?appkey=YOUR_CLIENT_ID&appsecret=YOUR_CLIENT_SECRET]"

   # 使用 access_token 发送消息

   curl -X POST "https://oapi.dingtalk.com/robot/send?access_token=YOUR_ACCESS_TOKEN" \

     -H "Content-Type: application/json" \

     -d '{"msgtype":"text","text":{"content":"测试消息"}}'

   ```

  1. 检查 access_token 缓存:

   ```bash

   # 清除 access_token 缓存

   clawdbot cache clear

   # 重新获取 access_token

   clawdbot restart

   ```

7.3 AI 模型调用超时

问题现象:


[ERROR] AI model API timeout after 30000ms

[ERROR] Request aborted

解决方案:

  1. 增加超时时间:

   ```json

   // 编辑 ~/.moltbot/moltbot.json

   {

     "model": {

       "timeout": 60000  // 增加到 60 秒

     }

   }

   ```

  1. 使用国内模型 API(推荐):

   ```json

   {

     "model": {

       "provider": "tongyi",  // 阿里云通义千问

       "apiKey": "sk-xxxxxxxx",

       "baseURL": "https://dashscope.aliyuncs.com/api/v1",

       "model": "qwen-turbo"

     }

   }

   ```

  1. 添加重试机制:

   ```json

   {

     "model": {

       "maxRetries": 3,      // 最大重试次数

       "retryDelay": 1000    // 重试延迟(毫秒)

     }

   }

   ```

7.4 会话上下文丢失

问题现象:

机器人无法记住之前的对话内容

解决方案:

  1. 检查会话配置:

   ```json

   {

     "conversation": {

       "maxHistory": 10,           // 增加历史消息数

       "enableMemory": true,       // 启用记忆功能

       "memoryType": "redis"       // 使用 Redis 存储(可选)

     }

   }

   ```

  1. 检查会话超时设置:

   ```json

   {

     "channels": {

       "dingtalk": {

         "sessionTimeout": 3600000  // 增加到 60 分钟

       }

     }

   }

   ```

  1. 使用持久化存储:

   ```bash

   # 安装 Redis(可选)

   sudo apt install redis-server

   # 配置 Moltbot 使用 Redis

   clawdbot config set conversation.memoryType "redis"

   clawdbot config set conversation.redisUrl "redis://localhost:6379"

   ```

7.5 CloudStudio 服务自动停止

问题现象:

服务运行一段时间后自动停止

解决方案:

  1. 使用 PM2 守护进程:

   ```bash

   # 安装 PM2

   npm install -g pm2

   # 使用 PM2 启动 Moltbot

   pm2 start clawdbot --name moltbot -- start

   # 设置开机自启

   pm2 startup

   pm2 save

   # 查看服务状态

   pm2 status

   pm2 logs moltbot

   ```

  1. 配置日志轮转:

   ```bash

   # 安装 PM2 日志轮转模块

   pm2 install pm2-logrotate

   # 配置日志大小限制

   pm2 set pm2-logrotate:max_size 10M

   pm2 set pm2-logrotate:retain 7

   ```

  1. 监控服务健康状态:

   ```bash

   # 配置 PM2 自动重启

   pm2 start clawdbot --name moltbot --max-restarts 10 --min-uptime 5000

   ```


八、总结

8.1 部署要点回顾

通过本教程,我们完成了以下关键步骤:

  1. ✅ 在钉钉开放平台创建机器人应用并获取凭证

  2. ✅ 配置 Stream 模式消息接收和权限管理

  3. ✅ 在 CloudStudio 搭建 Node.js 运行环境

  4. ✅ 安装 Moltbot 核心服务和钉钉连接器插件

  5. ✅ 配置钉钉通道和 AI 模型参数

  6. ✅ 验证 Stream 连接并测试消息收发功能

8.2 Stream 模式 vs HTTP 模式对比

| 对比项 | Stream 模式 | HTTP 模式 |

|-------|------------|-----------|

| 公网 IP | ❌ 不需要 | ✅ 需要 |

| 域名/SSL | ❌ 不需要 | ✅ 需要 |

| 防火墙配置 | ❌ 不需要 | ✅ 需要 |

| 内网穿透 | ❌ 不需要 | ✅ 需要(本地开发) |

| 消息加解密 | ❌ 自动处理 | ✅ 需要手动实现 |

| 实时性 | ⚡ 实时推送 | ⏱️ 轮询或 Webhook |

| 部署难度 | 🟢 简单 | 🔴 复杂 |

| 维护成本 | 🟢 低 | 🔴 高 |

结论:Stream 模式是钉钉官方推荐的接入方式,极大降低了开发和运维成本!

8.3 进阶功能扩展

1. 互动卡片消息

Moltbot 支持发送钉钉互动卡片,实现更丰富的交互体验:


// 发送互动卡片示例

const card = {

  msgtype: 'interactive',

  interactive: {

    title: '任务提醒',

    text: '您有一个新的待办任务',

    buttons: [

      {

        title: '查看详情',

        actionURL: 'https://your-app.com/task/123'

      },

      {

        title: '标记完成',

        actionURL: 'dingtalk://dingtalkclient/action/sendmsg?content=已完成'

      }

    ]

  }

};

  

await moltbot.sendCard(conversationId, card);
2. 文件上传与处理

支持接收和处理用户上传的文件:


// 处理文件消息

moltbot.on('file', async (message) => {

  const { fileUrl, fileName, fileSize } = message;

  // 下载文件

  const fileContent = await downloadFile(fileUrl);

  // 处理文件(如 PDF 解析、图片识别等)

  const result = await processFile(fileContent, fileName);

  // 回复处理结果

  await moltbot.reply(message, `文件 ${fileName} 处理完成:\n${result}`);

});
3. 群聊管理功能

实现群聊管理自动化:


// 监听群成员变更事件

moltbot.on('group.member.join', async (event) => {

  const { groupId, newMembers } = event;

  // 发送欢迎消息

  const welcomeMsg = `欢迎 ${newMembers.map(m => `@${m.name}`).join(' ')} 加入群聊!`;

  await moltbot.sendGroupMessage(groupId, welcomeMsg);

});

  

// 监听群消息

moltbot.on('group.message', async (message) => {

  // 实现群聊关键词自动回复

  if (message.content.includes('帮助')) {

    await moltbot.reply(message, '可用命令:\n/help - 查看帮助\n/status - 查看状态\n/settings - 设置');

  }

});
4. 定时任务与提醒

配置定时任务,主动发送消息:


// 使用 node-cron 实现定时任务

const cron = require('node-cron');

  

// 每天早上 9 点发送日报提醒

cron.schedule('0 9 * * *', async () => {

  const groups = await moltbot.getGroups();

  for (const group of groups) {

    await moltbot.sendGroupMessage(

      group.id,

      '早上好!请各位同学提交今日工作计划 📝'

    );

  }

});

  

// 每周五下午 5 点发送周报提醒

cron.schedule('0 17 * * 5', async () => {

  // 发送周报提醒逻辑

});
5. 多模型切换

根据不同场景自动切换 AI 模型:


{

  "model": {

    "default": "gpt-3.5-turbo",

    "models": {

      "fast": {

        "provider": "openai",

        "model": "gpt-3.5-turbo",

        "temperature": 0.7

      },

      "smart": {

        "provider": "openai",

        "model": "gpt-4",

        "temperature": 0.5

      },

      "creative": {

        "provider": "anthropic",

        "model": "claude-3-opus",

        "temperature": 0.9

      }

    },

    "autoSwitch": {

      "enabled": true,

      "rules": [

        {

          "condition": "message.length > 1000",

          "model": "smart"

        },

        {

          "condition": "message.includes('创作') || message.includes('写作')",

          "model": "creative"

        }

      ]

    }

  }

}
6. 插件系统扩展

Moltbot 支持插件系统,可以自定义功能:


// 创建自定义插件 ~/.moltbot/plugins/weather.js

module.exports = {

  name: 'weather',

  description: '天气查询插件',

  // 插件初始化

  async init(moltbot) {

    console.log('Weather plugin initialized');

  },

  // 处理消息

  async handle(message) {

    if (message.content.includes('天气')) {

      const city = extractCity(message.content);

      const weather = await getWeather(city);

      return `${city}今天天气: ${weather.description}, 温度: ${weather.temp}°C`;

    }

  }

};

注册插件:


{

  "plugins": {

    "enabled": ["weather", "translate", "calculator"],

    "weather": {

      "apiKey": "your-weather-api-key"

    }

  }

}

8.4 性能优化建议

1. 使用连接池

// 配置 HTTP 连接池

const axios = require('axios');

const http = require('http');

const https = require('https');

  

const httpAgent = new http.Agent({

  keepAlive: true,

  maxSockets: 50

});

  

const httpsAgent = new https.Agent({

  keepAlive: true,

  maxSockets: 50

});

  

axios.defaults.httpAgent = httpAgent;

axios.defaults.httpsAgent = httpsAgent;
2. 缓存 Access Token

// Access Token 缓存策略

let cachedToken = null;

let tokenExpireTime = 0;

  

async function getAccessToken() {

  // 如果 token 未过期,直接返回缓存

  if (cachedToken && Date.now() < tokenExpireTime) {

    return cachedToken;

  }

  // 获取新 token

  const response = await axios.get(

    `https://oapi.dingtalk.com/gettoken?appkey=${clientId}&appsecret=${clientSecret}`

  );

  cachedToken = response.data.access_token;

  // 提前 5 分钟过期,避免边界情况

  tokenExpireTime = Date.now() + (7200 - 300) * 1000;

  return cachedToken;

}
3. 消息队列处理

// 使用 Bull 队列处理消息

const Queue = require('bull');

const messageQueue = new Queue('dingtalk-messages', {

  redis: {

    host: 'localhost',

    port: 6379

  }

});

  

// 生产者:接收消息后加入队列

moltbot.on('message', async (message) => {

  await messageQueue.add(message, {

    attempts: 3,

    backoff: {

      type: 'exponential',

      delay: 2000

    }

  });

});

  

// 消费者:从队列中处理消息

messageQueue.process(async (job) => {

  const message = job.data;

  const reply = await processMessage(message);

  await moltbot.reply(message, reply);

});
4. 并发控制

// 使用 p-limit 控制并发数

const pLimit = require('p-limit');

const limit = pLimit(10);  // 最多 10 个并发请求

  

async function processMessages(messages) {

  const promises = messages.map(message =>

    limit(() => processMessage(message))

  );

  return Promise.all(promises);

}

8.5 安全加固措施

1. 消息签名验证

// 验证钉钉消息签名

const crypto = require('crypto');

  

function verifySignature(timestamp, sign, secret) {

  const stringToSign = `${timestamp}\n${secret}`;

  const hmac = crypto.createHmac('sha256', secret);

  const computedSign = hmac.update(stringToSign).digest('base64');

  return computedSign === sign;

}

  

// 在消息处理前验证

moltbot.use(async (message, next) => {

  const { timestamp, sign } = message.headers;

  if (!verifySignature(timestamp, sign, clientSecret)) {

    throw new Error('Invalid signature');

  }

  await next();

});
2. 敏感信息脱敏

// 日志脱敏处理

function maskSensitiveData(log) {

  return log

    .replace(/clientSecret=[\w]+/g, 'clientSecret=***')

    .replace(/apiKey=[\w-]+/g, 'apiKey=***')

    .replace(/access_token=[\w]+/g, 'access_token=***');

}

  

// 自定义日志记录器

const logger = {

  info: (msg) => console.log(maskSensitiveData(msg)),

  error: (msg) => console.error(maskSensitiveData(msg))

};
3. 速率限制

// 使用 express-rate-limit 限制请求频率

const rateLimit = require('express-rate-limit');

  

const limiter = rateLimit({

  windowMs: 60 * 1000,  // 1 分钟

  max: 60,              // 最多 60 次请求

  message: '请求过于频繁,请稍后再试'

});

  

app.use('/api/', limiter);

8.6 监控与告警

1. 健康检查端点

// 添加健康检查 API

app.get('/health', (req, res) => {

  const health = {

    status: 'ok',

    timestamp: new Date().toISOString(),

    uptime: process.uptime(),

    services: {

      dingtalk: moltbot.isConnected() ? 'connected' : 'disconnected',

      ai: await checkAIService(),

      redis: await checkRedis()

    }

  };

  res.json(health);

});
2. Prometheus 指标

const promClient = require('prom-client');

  

// 创建指标

const messageCounter = new promClient.Counter({

  name: 'dingtalk_messages_total',

  help: 'Total number of messages received',

  labelNames: ['type', 'status']

});

  

const responseTime = new promClient.Histogram({

  name: 'dingtalk_response_duration_seconds',

  help: 'Response time in seconds',

  buckets: [0.1, 0.5, 1, 2, 5, 10]

});

  

// 记录指标

moltbot.on('message', (message) => {

  messageCounter.inc({ type: message.msgtype, status: 'received' });

});

  

// 暴露指标端点

app.get('/metrics', async (req, res) => {

  res.set('Content-Type', promClient.register.contentType);

  res.end(await promClient.register.metrics());

});
3. 错误告警

// 使用钉钉群机器人发送告警

async function sendAlert(error) {

  const webhook = 'https://oapi.dingtalk.com/robot/send?access_token=xxx';

  await axios.post(webhook, {

    msgtype: 'markdown',

    markdown: {

      title: '🚨 Moltbot 错误告警',

      text: `### 错误详情\n\n` +

            `- **时间**: ${new Date().toLocaleString()}\n` +

            `- **错误**: ${error.message}\n` +

            `- **堆栈**: \`\`\`\n${error.stack}\n\`\`\``

    }

  });

}

  

// 捕获未处理的错误

process.on('unhandledRejection', async (error) => {

  console.error('Unhandled rejection:', error);

  await sendAlert(error);

});

参考资料

  • 钉钉开放平台官方文档[https://open.dingtalk.com/]

  • 钉钉 Stream 模式介绍[https://open.dingtalk.com/document/development/introduction-to-stream-mode]

  • Moltbot 官方网站[https://www.molt.bot/]

  • Moltbot 配置文档[https://docs.molt.bot/start/getting-started]

  • 钉钉 Moltbot 连接器 GitHub[https://github.com/DingTalk-Real-AI/dingtalk-moltbot-connector]

  • 腾讯 CloudStudio 官方文档[https://cloudstudio.net/docs]

  • 钉钉开发者百科[https://opensource.dingtalk.com/developerpedia/]


附录:完整配置文件示例

moltbot.json


{

  "channels": {

    "dingtalk": {

      "enabled": true,

      "clientId": "dingxxxxxxxxx",

      "clientSecret": "your_secret_here",

      "sessionTimeout": 1800000,

      "gatewayToken": "",

      "gatewayPassword": ""

    }

  },

  "model": {

    "provider": "openai",

    "apiKey": "sk-xxxxxxxxxxxxxxxx",

    "baseURL": "https://api.openai.com/v1",

    "model": "gpt-3.5-turbo",

    "temperature": 0.7,

    "maxTokens": 2000,

    "timeout": 30000,

    "maxRetries": 3,

    "retryDelay": 1000

  },

  "conversation": {

    "maxHistory": 10,

    "enableMemory": true,

    "memoryType": "local",

    "systemPrompt": "你是 Moltbot,一个智能 AI 助手,可以帮助用户完成各种任务。"

  },

  "logging": {

    "level": "info",

    "file": "~/.moltbot/logs/moltbot.log",

    "maxSize": "10M",

    "maxFiles": 7

  },

  "plugins": {

    "enabled": [],

    "directory": "~/.moltbot/plugins"

  },

  "security": {

    "enableSignatureVerification": true,

    "enableRateLimit": true,

    "rateLimitWindow": 60000,

    "rateLimitMax": 60

  },

  "monitoring": {

    "enableHealthCheck": true,

    "enableMetrics": true,

    "metricsPort": 9090

  }

}

.env 文件


# 钉钉配置

DINGTALK_CLIENT_ID=dingxxxxxxxxx

DINGTALK_CLIENT_SECRET=your_secret_here

  

# AI 模型配置

AI_MODEL_PROVIDER=openai

AI_MODEL_API_KEY=sk-xxxxxxxxxxxxxxxx

AI_MODEL_BASE_URL=https://api.openai.com/v1

AI_MODEL_NAME=gpt-3.5-turbo

  

# Redis 配置(可选)

REDIS_HOST=localhost

REDIS_PORT=6379

REDIS_PASSWORD=

  

# 日志配置

LOG_LEVEL=info

LOG_FILE=~/.moltbot/logs/moltbot.log

  

# 监控配置

ENABLE_METRICS=true

METRICS_PORT=9090

PM2 配置文件 (ecosystem.config.js)


module.exports = {

  apps: [{

    name: 'moltbot-dingtalk',

    script: 'clawdbot',

    args: 'start',

    instances: 1,

    autorestart: true,

    watch: false,

    max_memory_restart: '1G',

    env: {

      NODE_ENV: 'production'

    },

    error_file: '~/.moltbot/logs/pm2-error.log',

    out_file: '~/.moltbot/logs/pm2-out.log',

    log_date_format: 'YYYY-MM-DD HH:mm:ss Z',

    merge_logs: true,

    min_uptime: '10s',

    max_restarts: 10,

    restart_delay: 4000

  }]

};

启动命令:


pm2 start ecosystem.config.js

pm2 save

pm2 startup


系列教程:

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐