OpenClaw插件开发:为Qwen3-14b_int4_awq添加钉钉通道支持

张开发
2026/4/10 1:11:27 15 分钟阅读

分享文章

OpenClaw插件开发:为Qwen3-14b_int4_awq添加钉钉通道支持
OpenClaw插件开发为Qwen3-14b_int4_awq添加钉钉通道支持1. 为什么需要钉钉插件上周三凌晨2点我被手机震动惊醒——服务器监控报警触发了钉钉机器人通知。半梦半醒间突然想到既然钉钉能主动推送告警为什么不能让OpenClaw通过钉钉接收指令并执行自动化任务这个想法让我彻底清醒当即打开电脑开始验证。在个人自动化工作流中钉钉作为国内主流办公IM其机器人接口比飞书更开放稳定。特别是当我们使用Qwen3-14b_int4_awq这类本地化模型时通过钉钉通道可以直接在手机端用自然语言触发AI任务比如帮我整理昨天会议录音的重点或生成本周技术周报初稿。2. 开发环境准备2.1 基础工具链我的开发环境是macOS Ventura Node.js 18.x建议读者至少准备# 验证Node环境 node -v # 需≥18.0.0 npm -v # 需≥9.0.0 # 安装OpenClaw CLI工具 npm install -g openclaw/clilatest2.2 钉钉开发者账号登录钉钉开放平台创建企业内部应用记录三项关键凭证AppKey类似dingxxxxxxAppSecret32位字符串AgentId企业应用ID特别注意需要开启机器人能力并设置IP白名单后续部署服务器的公网IP。3. 插件工程初始化3.1 创建插件骨架使用OpenClaw官方模板初始化项目claw plugin init dingtalk-adapter --templatechannel cd dingtalk-adapter生成的核心文件结构├── package.json ├── src │ ├── adapter.ts # 通道协议适配器 │ ├── crypto.ts # 加解密处理 │ └── types.ts # 类型定义 ├── test │ └── integration.spec.ts └── config └── default.json # 默认配置3.2 关键依赖安装需要特别关注这些核心依赖npm install dingtalk-robot-sdk crypto-js openclaw/channel-protocol其中dingtalk-robot-sdk封装了钉钉消息API而openclaw/channel-protocol包含通道交互的标准接口定义。4. 实现消息加解密钉钉要求企业应用启用加密传输这部分最容易踩坑。我在首次实现时因为时间戳校验失败调试了整整三小时。4.1 配置加解密密钥在config/default.json中添加{ dingtalk: { aesKey: 随机生成的43位Base64编码字符串, token: 自定义的签名Token } }这些参数需要与钉钉后台配置完全一致否则会导致消息无法解密。4.2 实现Crypto工具类src/crypto.ts的核心逻辑import * as CryptoJS from crypto-js; import { createDecipheriv } from crypto; export class DingTalkCrypto { private aesKey: string; private token: string; constructor(aesKey: string, token: string) { this.aesKey aesKey; this.token token; } decrypt(encrypted: string): string { const key Buffer.from(this.aesKey , base64); const iv key.slice(0, 16); const decipher createDecipheriv(aes-256-cbc, key, iv); let decrypted decipher.update(encrypted, base64, utf8); decrypted decipher.final(utf8); // 移除随机填充字符 return decrypted.replace(/[\x00-\x1F\x7F-\x9F]/g, ); } verifySignature(timestamp: string, nonce: string, signature: string): boolean { const str [timestamp, nonce, this.token].sort().join(); const hash CryptoJS.SHA1(str).toString(); return hash signature; } }5. 适配OpenClaw通道协议5.1 实现消息转换器OpenClaw使用标准化消息格式需要将钉钉的原始消息转换为通用结构// src/adapter.ts import { ChannelMessage, ChannelUser } from openclaw/channel-protocol; export function transformDingMessage(dingMsg: any): ChannelMessage { return { id: dingMsg.msgId, timestamp: new Date(dingMsg.createAt).getTime(), text: dingMsg.text.content.trim(), sender: { id: dingMsg.senderStaffId, name: dingMsg.senderNick } as ChannelUser, raw: dingMsg // 保留原始数据 }; }5.2 核心适配器实现完整的通道适配器需要处理三类关键事件export class DingTalkAdapter implements ChannelAdapter { private crypto: DingTalkCrypto; async initialize(config: any) { this.crypto new DingTalkCrypto(config.aesKey, config.token); } async handleIncoming(req: Request): PromiseChannelMessage[] { // 验证签名 const { timestamp, nonce, signature } req.query; if (!this.crypto.verifySignature(timestamp, nonce, signature)) { throw new Error(Invalid signature); } // 解密消息 const encrypted req.body.encrypt; const rawMsg JSON.parse(this.crypto.decrypt(encrypted)); return [transformDingMessage(rawMsg)]; } async sendOutgoing(message: ChannelMessage): Promisevoid { // 调用钉钉机器人API发送消息 const robot new DingTalkRobot(this.config.accessToken); await robot.sendMarkdown({ title: OpenClaw通知, text: message.text }); } }6. 插件打包与安全发布6.1 本地测试验证开发阶段可以通过ngrok建立临时隧道ngrok http 3000将生成的https地址配置到钉钉后台的消息接收URL然后发送测试消息验证。6.2 正式打包发布使用官方推荐方式打包插件claw plugin pack --sign --key你的私钥这会生成一个.claw后缀的签名包可以通过以下方式安装claw plugin install ./dingtalk-adapter-1.0.0.claw安全提示私钥文件务必妥善保管建议使用硬件加密设备存储。7. 与Qwen3-14b_int4_awq模型集成在OpenClaw配置文件中添加模型绑定{ channels: { dingtalk: { enabled: true, appKey: 你的AppKey, appSecret: 你的AppSecret, model: qwen3-14b-int4-awq } } }现在当你在钉钉群里机器人提问时问题会通过OpenClaw路由到本地部署的Qwen3模型处理响应结果将自动返回对话流。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。

更多文章