资讯动态

wechatferry Nuxt 模块实战:用 skills、middleware 与定时任务在 Nuxt 中构建微信机器人

发布时间:2026/10/14 16:58:41 来源:尧图企业网站定制
即时通讯后端AI 应用【免费下载链接】wechatferry-项目地址https://gitcode.com/gh_mirrors/wec/wechatferry点击查看免费下载wechatferry 的 Nuxt 模块wechatferry/nuxt让你只需在nuxt.config.ts中注册模块、在server/wcferry/目录下编写技能与中间件文件即可把一个基于 Wechaty 协议的微信机器人嵌入 Nuxt 3 服务本文以官方文档 Nuxt 集成指南 为主线结合packages/nuxt的模块实现源码完整讲清安装配置、defineBotCommandHandler命令技能的编写与自动导入机制、全局/局部中间件、定时任务以及开发态 DevTools 调试面板的落地方式。模块安装按照官方文档 docs/integrations/nuxt.md 给出的安装方式在 Nuxt 项目根目录执行pnpx nuxi module add wechatferry/nuxt该命令通过nuxi module add将wechatferry/nuxt添加到依赖并写入nuxt.config.ts的modules数组在 pnpm 项目中等价于pnpm dlx nuxi module add wechatferry/nuxt或使用npx前缀。模块包信息可在 packages/nuxt/package.json 中确认包名为wechatferry/nuxt当前版本 0.0.26其核心依赖为nuxt/kit、nuxt/devtools-kit以及同仓库的wechatferry/puppet、wechatferry/plugins均为workspace:*依赖最终产物的入口为dist/module.mjs/dist/module.cjs。仓库内的 playground 由于直接引用本地模块源码其 playground/nuxt.config.ts 写的是modules: [../src/module]正式使用 npm 包时对应写成wechatferry/nuxt即可。模块配置debug、safeMode 与 keepalive模块通过defineNuxtModule声明了三个配置项配置键为wcferry见 packages/nuxt/src/module.tsexport default defineNuxtConfig({ modules: [wechatferry/nuxt], wcferry: { debug: false, // 开启 debug 模式默认 false safeMode: false, // 为 puppet 启用安全模式默认 false keepalive: false, // 为 agent 启用 keepalive默认 false可为秒数 }, })debug开启调试模式。源码中options.debug || nuxt.options.dev时才注册开发态资源见 module.ts#L48-L54也就是说Nuxt 开发环境下调试面板自动启用生产构建不会携带 DevTools 相关逻辑。safeMode开启后 puppet 会被createSafeModePuppet包裹实现节流风控对应文档 安全模式。keepalive透传给底层WechatferryAgent用于登录后存活检查详见 useBotAgent.ts 与 agent 包 types.ts 中keepalive选项说明。模块 setup 阶段还会做两件事把runtime/server目录加入 Nitro 服务扫描目录addServerScanDir并把整个wcferry配置写入runtimeConfig见 module.ts#L37-L55同时强制打开 Nitro 实验特性nitro.experimental.tasks true这是后面定时任务defineCronTask能运行的前提。playground 中的实际配置示例为// packages/nuxt/playground/nuxt.config.ts export default defineNuxtConfig({ modules: [../src/module], wcferry: { keepalive: true, }, devtools: { enabled: true }, compatibilityDate: 2024-08-25, })第一个技能defineBotCommandHandler文档中最核心的使用示例是在server/wcferry/skills/*.ts中定义一个群聊命令技能摘自 docs/integrations/nuxt.md// server/wcferry/skills/*.ts /** * 在群里说机器人 ping * 机器人回复pong */ export default defineBotCommandHandler({ command: ping, handler({ message, _command, _args }) { message.say(pong) }, })效果是群内机器人 ping后机器人回复pong。其选项类型定义在 defineBotCommandHandler.tsexport interface CommandHandlerPayload { message: Message // wechaty 的 Message 对象 command: string // 匹配到的命令名 args: string // 命令后的剩余参数 } export interface BotCommandHandlerOptions { command: string | RegExp handler: (payload: CommandHandlerPayload) unknown middleware?: BotHandlermessage | string | (string | BotHandlermessage)[] }从源码实现看当command传字符串时会被编译为正则/.*?\s(ping)(?:\s([\S\s]*))?/并注册到message:room:mention钩子上触发后从消息文本中解析出command与args再交给handler见 defineBotCommandHandler.ts#L20-L43。也就是说命令只会在群聊中 机器人的消息上尝试匹配该钩子由mentionSelf()判定后才触发见 wcferry.ts#L13-L25args会捕获命令之后的所有剩余文本可用于实现带参数的子命令也支持直接传RegExp作为command跳过自动正则构造。仓库 playground 中的真实技能文件 ping.ts 与文档示例一致并额外演示了middleware: local写法export default defineBotCommandHandler({ command: ping, handler({ message }) { message.say(pong) }, middleware: local, })skills 的自动导入机制文档强调“server/wcferry/skills文件夹下的技能和机器人命令将自动导入” 这句话背后的实现位于 packages/nuxt/src/virtual.ts。模块在 Nitro 初始化时nitro:init钩子见 module.ts#L44-L46调用setupVirtual完成以下工作定位目录遍历 Nitro 的scanDirs在每个扫描目录下拼接出wcferry子目录对应项目的server/wcferry并加入 Nuxt watch 列表扫描技能文件对wcferry/skills目录用 fast-glob 匹配**/*.{js,mjs,cjs,ts,mts,cts,tsx,jsx}GLOB_SCAN_PATTERN见 virtual.ts#L8生成虚拟模块#internal/wcferry/skills把每个技能文件转成一行import(...)语句拼接导出技能名取文件基名的 camelCase 形式延迟触发真正的 import 发生在机器人ready事件之后见 wcferry.ts#L10-L12——import(#internal/wcferry/skills)会在 bot 就绪后动态加载避免在 puppet 尚未启动时注册钩子热更新监听builder:watch当wcferry目录下文件发生增删event ! change时触发rollup:reload重载见 virtual.ts#L66-L73。同时扫描结果会写入nitro.scannedSkills供 DevTools 面板通过 RPC 拉取展示见 types.ts 中ScannedWcferrySkill定义与 server-rpc/index.ts。因此你只需要在server/wcferry/skills/下按文件新增技能每个文件export default一个defineBot*Handler即可无需任何手工注册或import语句。中间件全局与局部与技能同级的还有server/wcferry/middleware/目录用于编写可复用的前置处理逻辑。defineBotMiddleware定义在 defineBotMiddleware.ts本质是返回一个{ hook, handler }对象由虚拟模块#internal/wcferry/middleware统一收集并导出为$global与$local两个数组见 virtual.ts#L44-L64。命名约定决定作用域从源码结构看文件名包含.global的进入全局中间件否则为局部中间件// server/wcferry/middleware/global.global.ts —— 全局对所有匹配 hook 的 handler 生效 export default defineBotMiddleware({ hook: message, async handler(msg) { console.error(${msg.talker().name()}: ${msg.text()}) }, })// server/wcferry/middleware/local.ts —— 局部需显式在 handler 的 middleware 选项中引用 export default defineBotMiddleware({ hook: message:room:mention, async handler(msg) { if (msg.text().includes(测试)) { msg.say(测试成功) return true // 返回非 undefined 时短路后续 handler 不再执行 } }, })两个示例分别对应仓库中的 global.global.ts打印所有消息的群成员与文本和 local.ts群内被 且文本含“测试”时直接应答并拦截。装配逻辑在 defineBotHandler.ts 中全局中间件按hook.startsWith(middleware.hook)过滤后自动注入所有匹配的 handler局部中间件只有在middleware选项中以字符串名引用时才被查找装配在$local中按hook前缀匹配中间件按“全局在前、局部在后”的顺序串行执行任一中间件返回非undefined值即短路不再执行主 handler——这就是local.ts中return true能拦截消息的原因。defineBotHandler还支持when条件正则、布尔值或异步函数只有条件命中才执行handlerdefineBotCommandHandler内部正是利用该机制以正则匹配命令文本的。更多处理器与定时任务除了命令技能模块在runtime/server/utils下提供了整套处理器工具均可通过 Nuxt 的自动导入在server/wcferry/下直接使用工具函数文件作用defineBotHandlerdefineBotHandler.ts通用钩子处理器可指定hook、when、middlewaredefineBotMessageHandlerdefineBotMessageHandler.ts消息类钩子message、message:room、message:room:mention、message:contactdefineBotRoomHandlerdefineBotRoomHandler.ts群事件钩子room:join、room:leave、room:topic、room:invite等defineBotMiddlewaredefineBotMiddleware.ts定义可复用中间件defineCronTaskdefineCronTask.ts基于 Nitro Tasks 的定时任务可用钩子清单定义在 useBot.ts 的BotHooks接口中包括message、message:room、message:room:mention、message:contact、room、room:join、room:leave、room:topic、room:invite。这些钩子由 Nitro 插件 wcferry.ts 在bot.on(message/room-join/...)事件中逐一callHook分发实现了 wechaty 原生事件到模块自定义钩子体系的桥接。定时任务方面defineCronTask基于nitropack的defineTask加croner实现传入patterncron 表达式或Date即按表达式周期触发应用关闭Nitroclose钩子时自动cron.stop()不传pattern则只注册为一个可手动调用的 Task见 defineCronTask.ts#L9-L24。playground 中的示例 sayHi.ts 演示了任务内直接useBot()获取当前登录用户export default defineCronTask({ // pattern: * * * * *, async run() { const bot useBot() console.error(Hi, I am ${bot.currentUser.name()}, now is ${new Date()}) return { result: true } }, })运行时调用链puppet、agent 与安全模式理解各define*工具如何生效需要看服务启动链路。Nitro 插件 wcferry.ts 的执行顺序为useBotPuppet()创建 puppet单例见 useBotPuppet.tsuseBot()用WechatyBuilder.build({ puppet })构建 bot 并挂载hookable钩子集见 useBot.ts#L24-L33bot.start()启动ready后动态加载 skills 虚拟模块、绑定消息/群事件分发Nitro 应用close时调用bot.stop()保证进程退出时干净停止。其中useBotPuppet与配置项的关联是const agent useBotAgent() // 读取 runtimeConfig.wcferry.keepalive const { wcferry: { safeMode } } useRuntimeConfig() puppet new WechatferryPuppet({ agent }) // 封装 wechatferry/agent wechatferry/core if (safeMode) puppet createSafeModePuppet(puppet)keepalive最终传入 WechatferryAgent 的keepalive选项用于登录存活检查safeMode生效时createSafeModePuppet会返回一个 Proxy 包裹的原生 puppet拦截所有messageSend*方法并施加三层节流默认参数见 safe-mode.ts全局 40 条/分钟、同一会话 1 秒/条、不同会话之间 35 秒随机间隔参数均可通过插件选项覆盖。官方文档 安全模式 也特别提醒安全模式只限制发送频率不能替代养号等风控规避手段。开发态 DevTools 面板在开发环境nuxi dev或显式设置wcferry.debug: true时模块会额外做三件事见 module.ts#L48-L54把runtime/nitro目录也加入 Nitro 扫描从而注册调试路由SSE 事件流__wcferry__/sse.ts实时推送 bot 的start/login/ready/message/error等事件见 sse.ts以及数据库浏览接口database.get.ts/database.post.ts通过setupDevToolsUI在 Nuxt DevTools 中注入一个名为 “Wcferry” 的自定义 Tab微信图标、iframe 视图见 devtools.ts。生产构建时通过sirv静态服务内置的client/面板含 skills.ts 中通过 RPCgetServerSkills()拉取技能列表的逻辑源码仓库开发时则代理到本地localhost:3300的独立面板进程DevTools 初始化后经extendServerRpc(wcferry, ...)暴露服务端 RPC 函数见 server-rpc/index.ts。这意味着开发时可以直观查看当前被自动导入的技能清单与实时消息流而不必逐条console.error调试。小结与适用边界完整体验的最低配置就是文档中的两步安装模块 在server/wcferry/skills/放一个defineBotCommandHandler文件群命令、消息钩子、群事件、定时任务分别对应defineBotCommandHandler/defineBotMessageHandler/defineBotRoomHandler/defineCronTask均支持when条件与中间件全局自动、局部按名引用中间件返回值非undefined即短路debug/safeMode/keepalive三个模块配置项分别控制 DevTools 调试面板、发送节流风控、登录存活检查默认均为false适用前提该模块依赖 wechatferry 的 PC Hook 协议栈wechatferry/core调用sdk.dll即机器人运行于 Windows 微信客户端之上Nuxt 侧代码本身与平台无关而 puppet 实际连通的 agent 所在环境决定了最终可行性。赞分享即时通讯后端AI 应用【免费下载链接】wechatferry-项目地址https://gitcode.com/gh_mirrors/wec/wechatferry点击查看免费下载相关推荐用 Nuxt、Nuxt UI 与 Vercel AI SDK 构建全功能 AI 聊天机器人用 Nuxt、Nuxt UI 与 Vercel AI SDK 构建全功能 AI 聊天机器人 本文是一份完整的实战指南讲解如何使用 Nuxt、Nuxt UI本前端UI组件Nuxt content/ 目录实战使用 nuxt/content 模块构建基于文件的 CMSNuxt content/ 目录实战使用 nuxt/content 模块构建基于文件的 CMS 本文以 Nuxt 仓库中 content/ 目录文档 htt前端后端Web框架SSRwechatferry 微信机器人框架快速上手环境准备、Agent/Nuxt/Wechaty 三种集成与源码架构解析wechatferry 微信机器人框架快速上手环境准备、Agent/Nuxt/Wechaty 三种集成与源码架构解析 wechatferry 是 Node 生即时通讯后端AI 应用创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑