当前位置: 首页 > news >正文

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/cli@latest

2.2 钉钉开发者账号

  1. 登录钉钉开放平台
  2. 创建"企业内部应用",记录三项关键凭证:
    • AppKey:类似dingxxxxxx
    • AppSecret:32位字符串
    • AgentId:企业应用ID

特别注意:需要开启"机器人"能力并设置IP白名单(后续部署服务器的公网IP)。

3. 插件工程初始化

3.1 创建插件骨架

使用OpenClaw官方模板初始化项目:

claw plugin init dingtalk-adapter --template=channel 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): Promise<ChannelMessage[]> { // 验证签名 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): Promise<void> { // 调用钉钉机器人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星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

http://www.jsqmd.com/news/615648/

相关文章:

  • 电容是什么?一个“快充快放”的微型充电宝坷
  • 毕业设计实战:基于SSM+MySQL的社区医疗服务预约管理系统设计与实现指南
  • 别再踩坑了!SQL Server数据类型那点事儿,看懂这篇少背三个锅竟
  • 嵌入式系统开发:硬件思维与架构实践
  • 一个进程是 host root vs docker root
  • Linux I/O 演进史:从管道到零拷贝,一篇串起个服务端核心原语纠
  • OpenClaw技能组合策略:Qwen3-32B在复杂工作流中的模块化调用
  • 金融PHP支付配置终极Checklist(2024Q3央行金融科技新规适配版):58项必检条目,漏1项即触发监管通报
  • 绵阳高新区小学晚托自习
  • A Gift from the Integration of Discriminative andDiffusion-based Generative Learning: BoundaryRefi
  • OpenClaw配置备份指南:gemma-3-12b-it环境快速迁移与恢复
  • 嵌入式文件传输协议选型与优化实践
  • OpenClaw备份恢复方案:Qwen3-32B任务历史与技能配置迁移
  • OpenClaw代码审查:Qwen3.5-9B自动化质量检查
  • 2026武汉高评价日常保洁TOP10推荐:武汉物业保洁公司/武汉企业保洁公司/武汉保洁公司/武汉保洁外包公司/武汉保洁托管公司/选择指南 - 优质品牌商家
  • 嵌入式通信协议的状态机接收模块设计与优化
  • 2026年可靠熔体流动速率仪TOP推荐:简支梁冲击试验机/落锤冲击试验机/制样机/差热/差示扫描量热仪/开闭孔率测定仪/选择指南 - 优质品牌商家
  • SpringCloud-Stream + RocketMQ/Kafka
  • Boodskap数字孪生Arduino客户端库深度解析
  • 【Java】通过Mybatis Plus自带的方式,实现公共字段自动填充。
  • Google 修改账户归属地
  • AI编程实战:从零到一搭建全栈项目胺
  • 国内半导体展哪家好?盘点2026年实力半导体展为企业搭建桥梁 - 品牌2026
  • Spring Cloud进阶--分布式权限校验OAuth眯
  • 潘多拉魔盒上的封条:当AI强到连“造物主”都感到恐惧
  • 基于MATLAB/Simulink的纯电动汽车模型( (包括驾驶员模型,电机模型,电池模型,传动模型,纵向动力学模型)
  • 2026膏药公司TOP5推荐:纯中药膏药/老黑膏/热熔胶膏药/黑膏药/膏药/选择指南 - 优质品牌商家
  • AI时代的算法思维:大经典排序学习弥
  • linux文件,IO,缓存,动\静函数库
  • 低代码选型:为什么「开源技术栈」对企业长期发展更有利?