本项目 OpenClaw IM Manager 是一个开源学习项目,仅供技术研究和学习交流使用。
🚫 严禁商用
本项目采用 CC BY-NC-SA 4.0 许可证,明确禁止任何商业用途,包括但不限于:
- 付费服务、收费机器人、会员制服务
- 出售、转卖、打包售卖
- 任何形式的盈利活动(广告、打赏、会员费等)
⚠️ 使用风险
- 使用第三方客户端登录 /微信 可能违反腾讯服务协议,存在封号风险
- 强烈建议使用小号测试,切勿使用主力账号
- 使用者需 自行承担一切风险和法律责任
🔒 项目性质
- 本项目 未进行任何逆向工程、协议激活成功教程、反编译 等操作
- 仅将已有开源组件(NapCat、wechatbot-webhook、OpenClaw)通过 Docker 整合
- 不包含任何 或微信的协议实现代码
- 作者 未从本项目中获取任何经济收益
📋 知识产权
- 、微信是深圳市腾讯计算机系统有限公司的注册商标
- 本项目与腾讯公司无任何关联
- 所有第三方组件遵循其各自的开源许可证
下载/使用本项目即表示您已阅读并同意 完整免责声明。如不同意,请勿使用。
完整代码已放在https://github.com/zhaoxinyi02/openclaw–plugin,麻烦顺手点个star~
前言:在上一篇教程中,我们实现了 OpenClaw 通过 NapCat 接入 个人号的基础文字聊天功能。但仅仅能发文字显然不够——我们希望 AI 能发送图片、文件、表情包,能理解用户发来的图片,甚至能主动给我们发消息(定时问候、服务器告警、任务进度通知等)。本篇教程将带你一步步实现这些高级功能。
- 功能概览
- 前置条件
- 功能一:文件发送(文档、PDF等)
- 功能二:图片发送与接收
- 功能三:多媒体消息全类型支持
- 功能四:主动发送消息
- 功能五:定时任务与随机问候
- 功能六:服务器事件监听与告警
- 踩坑记录与解决方案
- 完整代码汇总
- 总结
在基础文字聊天的基础上,本教程将实现以下功能:
最终效果:你的 机器人不仅能聊天,还能发文件、发图片、定时问候你、在服务器出问题时主动通知你——就像一个真正的 AI 助手。
本教程假设你已经完成了以下准备工作:
- OpenClaw 已安装并运行(宿主机部署或 Docker 部署均可)
- NapCat 已安装并运行(推荐 Docker 部署)
- 个人号已登录 NapCat
- OpenClaw 已通过 OneBot11 WebSocket 连接到 NapCat
- 基础文字聊天功能正常
关键信息(后续代码中会用到,请替换为你自己的值):
架构回顾:
3.1 问题分析
OpenClaw 的 Agent 在执行任务时会生成文件(如 txt、pdf 等),这些文件保存在 Agent 的工作目录中(如 )。但 NapCat 运行在 Docker 容器中,无法直接访问宿主机的文件系统。
核心思路:在 OpenClaw 的 插件中内置一个 HTTP 文件服务器,将工作目录中的文件通过 HTTP 暴露出来,NapCat 就可以通过 URL 下载并发送给用户。
3.2 实现文件服务器
创建 :
3.3 路径转 URL 函数
在 中添加路径转换函数。这是整个文件发送功能的核心——将本地文件路径转换为 NapCat 可以访问的 HTTP URL:
踩坑提醒:如果你对 使用了 ,会导致路径中的 被编码为 ,最终生成类似 的错误 URL,NapCat 会报 错误。
3.4 文件上传接口
在 中封装 OneBot11 的文件上传 API:
3.5 发送文件的完整流程
在 中实现文件发送逻辑:
3.6 验证文件发送
重启 OpenClaw 后测试:
然后在 中对机器人说:“帮我创建一个 txt 文件并发送给我”。
4.1 图片发送
图片发送使用 OneBot11 的 消息段,原理和文件类似,但不需要走文件上传接口:
关键是根据文件扩展名判断媒体类型:
4.2 接收用户发送的图片
当用户发送图片时, 可能为空。我们需要为媒体消息添加描述性文本,否则 OpenClaw 会回复”没收到文本”:
4.3 在 sendMedia 中统一处理
是 OpenClaw 发送媒体的统一出口,需要根据媒体类型选择不同的发送方式:
5.1 完整的类型定义
在 中定义所有 OneBot11 消息段类型(文本、图片、表情、语音、视频、@、回复、JSON卡片、文件、戳一戳、骰子、猜拳、音乐分享、合并转发等),完整代码见第10节。
5.2 完整的 Client API
在 中封装所有 OneBot11 API,包括:
- openclaw消息接口:发送私聊/群聊消息、撤回消息、获取消息、合并转发
- 好友操作:好友列表、好友赞、处理好友请求
- 群操作:群信息、群成员、踢人、禁言、设置管理员等
- 文件操作:上传群文件、上传私聊文件、获取图片/语音/文件信息
- 系统接口:登录信息、版本信息、运行状态
- NapCat 扩展:戳一戳、设置头像、设置签名、消息表情回复、标记已读、聊天历史、AI语音等
完整代码见第10节。
6.1 为什么需要主动发送?
OpenClaw 的 Agent 是被动响应的——只有收到用户消息时才会回复。但很多场景需要主动发送消息:
- 定时问候(早安、晚安)
- 服务器告警(端口被扫描、磁盘满)
- 新邮件通知
- 任务进度报告
6.2 实现原理
NapCat 的 OneBot11 WebSocket 接口是双向的——不仅可以接收消息事件,还可以主动调用 API 发送消息。我们只需要建立一个独立的 WebSocket 连接,发送 请求即可。
6.3 创建发送工具
首先初始化项目:
创建 :
6.4 测试主动发送
如果一切正常,你会立即在 上收到消息。这条消息完全绕过了 OpenClaw Agent,直接通过 NapCat API 发送。
7.1 方案选择
定时任务有两种实现方式:
推荐使用 Linux crontab,因为更稳定可靠。
7.2 简化版定时任务工具
创建 :
7.3 使用示例
7.4 高级:随机问候(模拟真人)
固定时间的问候太机械了,真人不会每天准时 8:00 说早安。我们可以实现随机问候——每天生成 15-25 个随机时间点,发送不同的问候语。
创建 :
7.5 每天自动刷新随机问候
将随机问候的生成也加入 crontab,每天凌晨自动刷新:
8.1 功能说明
创建一个后台服务,持续监控服务器状态,当检测到异常时自动通过 发送告警:
- 端口监控:检测 SSH、HTTP 等端口的活动连接
- 磁盘监控:磁盘使用率超过阈值时告警
- 内存监控:内存使用率超过阈值时告警
- 文件监控:监听指定文件变化(如新邮件)
8.2 实现代码
创建 :
8.3 部署为系统服务
创建 systemd 服务文件 :
启用服务:
9.1 文件发送报 Invalid URL
现象:OpenClaw 日志中出现 ,URL 类似
原因:对文件路径使用了 ,导致 被编码为
解决:直接拼接路径,不要编码:
9.2 NapCat 无法访问文件服务器
现象:NapCat 日志报连接 失败
原因:NapCat 在 Docker 容器中, 指向容器自身,不是宿主机
解决:使用宿主机的 Docker 网桥 IP:
9.3 发送文件时附带多余消息
现象:AI 发送文件后,还会额外发一条 “I didn’t receive any text in your message”
原因:NapCat 发送文件后会产生一个空的消息回执事件,OpenClaw 将其当作用户消息处理
解决:在消息接收处添加空消息过滤:
9.4 图片消息被当作空消息
现象:用户发送图片后,AI 回复”没收到文本”
原因:图片消息的 为空,OpenClaw 认为没有收到内容
解决:为媒体消息添加描述性文本(见第4.2节)
9.5 base64 编码的文件用户看不懂
现象:AI 发送的文件内容是一堆 base64 编码的字符
原因:使用了 URL 发送文件
解决:在 中拒绝 URL,强制使用 HTTP URL:
10.1 插件文件结构
10.2 工具脚本文件结构
10.3 OpenClaw 配置
中的关键配置:
完整的源代码文件内容较长,建议直接参考本文各章节中的代码片段进行实现。如需完整文件,可以在评论区留言。
通过本教程,我们在基础文字聊天的基础上,实现了以下高级功能:
核心架构要点:
- 文件发送的关键是内置 HTTP 文件服务器,解决 Docker 容器无法访问宿主机文件的问题
- 主动发送的关键是直接连接 NapCat 的 WebSocket API,绕过 OpenClaw Agent 的被动响应限制
- 定时任务的关键是利用 Linux crontab 的稳定性,配合 send-message.js 实现定时发送
- 事件告警的关键是后台轮询 + 频率控制,避免消息轰炸
后续可以继续扩展的方向:
- 接入邮件通知(IMAP 监听新邮件)
- 接入 GitHub Webhooks(代码提交通知)
- 接入天气 API(每天早上发送天气预报)
- 接入 RSS 订阅(新闻推送)
- AI 生成动态问候内容(结合 OpenClaw Agent)
作者说:从最初只能发文字,到现在能发文件、发图片、主动问候、服务器告警……一步步把 机器人打造成了真正的 AI 助手。希望这篇教程对你有帮助!如果有问题欢迎评论区交流。
相关文章:
- 上一篇:《【全网首发!】OpenClaw 接入 个人号完整教程》
- OpenClaw 官方文档
- NapCat OneBot11 API 文档
发布者:Ai探索者,转载请注明出处:https://javaforall.net/249963.html原文链接:https://javaforall.net
