背景
OpenClaw(虾酱的底层引擎)在 2026 年 5 月初发布了 2026.5.5 大版本更新。本次更新带来了多项底层改动,包括插件加载机制的架构升级。然而,一个意想不到的副产品是:腾讯官方维护的微信插件 @tencent-weixin/openclaw-weixin 在升级后无法正常工作。
这个问题并非个例。在 APPSO、36Kr 等科技媒体的报道中,大量用户在升级后发现,包括微信公众号(openclaw-weixin)、企业微信(wecom-openclaw-plugin)、QQ Bot 在内的多个腾讯系聊天平台插件均出现了不同程度的故障。微信插件尤为严重——它几乎是每个中国用户接入 OpenClaw 的首选渠道。
问题现象
升级完成后,用户在实际使用中会遇到以下症状:
第一阶段:重启后插件消失
Gateway 重启后,openclaw plugins list 中看不到 openclaw-weixin 的身影——插件没有被自动加载。
第二阶段:扫码登录失败
手动安装插件后,执行 openclaw channels login --channel openclaw-weixin 尝试扫码登录,终端输出:
复制
正在启动...
Failed to start login: TypeError: fetch failed
Channel login failed: Error: Failed to start login: TypeError: fetch failed
二维码弹不出来,登录流程直接中断。
第三阶段:插件加载但无响应
如果绕过了登录问题(已有历史会话),插件状态显示为"已连接",但发送微信消息后完全没有任何响应——AI 收不到消息,也就不会回复。
第四阶段:查看日志发现模块缺失错误
复制
Error: Cannot find module 'openclaw/plugin-sdk'
这条错误信息意味着插件无法找到 OpenClaw 核心提供的 plugin-sdk 模块,导致整个插件初始化失败。
根因分析:三个独立的问题叠加
经过对 GitHub Issues(openclaw #52341、#53403、Tencent/openclaw-weixin #113、#121)、Reddit 技术社区讨论(r/openclaw)以及 OpenClaw 官方文档的交叉验证,这次故障实际上包含 三个相互独立但相互关联的问题。
问题一:npm 升级导致插件运行时依赖路径丢失
触发条件: 任何版本的 OpenClaw 升级操作。
问题描述: OpenClaw 在 2026.4.x ~ 2026.5.x 之间的某个版本更新中,修改了插件运行时依赖的存储路径。升级操作会清理旧的 plugin-runtime-deps 缓存目录,但清理脚本存在缺陷——它没有同时重建外部插件(如 @tencent-weixin/openclaw-weixin)的符号链接。
这导致外部插件虽然代码还在磁盘上,但 Node.js 无法通过模块路径找到它们。require('openclaw/plugin-sdk') 失败,插件直接崩溃。
症状: Error: Cannot find module 'openclaw/plugin-sdk'
官方修复: OpenClaw 官方在后续版本(v2026.5.3+)中通过 PR #76929 修复了这个问题。具体改动是在 postinstall 脚本中添加了 unlink dangling global plugin-runtime symlinks 的清理逻辑,并确保升级时不会误删外部插件的引用。
变通方案: 如果你当前版本较旧,可以手动执行 Reddit 用户 Siref 发现的补救方法:
复制
# 找到 openclaw 的安装路径
which openclaw
pnpm root -g # 或 npm root -g
# 进入目录执行 postinstall 脚本
cd $(pnpm root -g)/openclaw
node scripts/postinstall-bundled-plugins.mjs
执行后等一段时间(没有进度输出),依赖会自动补全,然后运行 openclaw doctor 验证。
问题二:Node.js 24 与手动 Content-Length 头冲突导致扫码登录失败
触发条件: OpenClaw 2026.5.4+,Node.js 24,微信插件 v2.4.0 及以下版本。
问题描述: 微信插件在向腾讯服务器发起 API 请求时,会在 src/api/api.js 的 buildHeaders 函数中手动设置 Content-Length 请求头。然而,Node.js 24 的 fetch 实现底层使用了 undici 网络库,undici 在内部已经根据请求体内容自动计算了 Content-Length 值。当手动设置的值与 undici 自动计算的值不一致时,就会触发 UND_ERR_INVALID_ARG 错误,导致整个 fetch 请求失败。
复制
// 出问题的代码(已在新版本修复)
buildHeaders(body) {
return {
'Content-Type': 'application/json',
'Content-Length': Buffer.byteLength(body) // Node 24 + undici 会重复计算
}
}
错误日志表现为:
复制
apiPostFetch ERROR: fetch failed | cause: invalid content-length header | code: UND_ERR_INVALID_ARG
官方状态: 这个问题在 @tencent-weixin/openclaw-weixin v2.4.1 中已被修复。修复方式为移除 buildHeaders 中手动的 Content-Length 设置,改由 fetch API 自动计算。
临时解决方案: 如果暂时无法更新到 v2.4.1,可以手动修改插件源码:
打开 ~/.openclaw/extensions/openclaw-weixin/src/api/api.js(或对应路径),在 buildHeaders 函数中删除 'Content-Length': Buffer.byteLength(body) 这一行,然后重启 Gateway 即可。
问题三:OpenClaw 2026.5.x 的模块沙箱机制导致插件运行时对象丢失
触发条件: OpenClaw >= 2026.5.x,微信插件任意版本(截至发稿日仍未修复)。
问题描述: 这是三个问题中最严重且最隐蔽的一个。
OpenClaw 2026.5.x 版本的 Gateway 引入了一个新的插件加载策略 preferBuiltPluginArtifacts: true。该策略会将插件的 register() 函数运行在一个经过源码转换(source-transformed)的沙箱模块作用域中。这种设计原本是为了提高安全性和隔离性。
然而,微信插件的架构中有一个模块级变量 pluginRuntime 用于在插件内部共享运行时状态:
复制
// runtime.js
let pluginRuntime = null
function setWeixinRuntime(api) { pluginRuntime = api }
function getWeixinRuntime() { return pluginRuntime }
// register() 中
register({ runtime }) {
setWeixinRuntime(runtime)
}
// monitor.js 中
async function waitForWeixinRuntime() {
// 这里读到的 pluginRuntime 永远是 null
while (pluginRuntime === null) { await sleep(100) }
return pluginRuntime
}
问题在于:preferBuiltPluginArtifacts: true 加载时,register() 在沙箱作用域执行,修改的是沙箱内那份 pluginRuntime 变量。而 monitor.js 中的 waitForWeixinRuntime() 走的是标准 import() 加载,它读的是原始模块作用域中另一份 pluginRuntime——两边的变量不是同一个对象实例。
结果是:setWeixinRuntime() 写入了值,waitForWeixinRuntime() 永远读到 null,最终超时:
复制
Weixin runtime initialization timeout
monitorWeixinProvider: getUpdates repeatedly fails
症状: 插件状态显示正常(OK / Connected),但所有微信消息无法路由到 AI 处理,外部完全看不出问题,只有看 Gateway 日志才能发现 waitForWeixinRuntime() 超时的堆栈。
官方状态: Issue #121(Tencent/openclaw-weixin)已报告此问题,官方已确认根因并提出了修复方案(将 waitForWeixinRuntime() 替换为 resolveWeixinChannelRuntime()),但截至发稿日该修复 尚未合并发布。
变通方案: 目前没有完美的用户侧变通方案。可以尝试:
在 OpenClaw 配置中尝试禁用 preferBuiltPluginArtifacts 特性(如果存在该配置项)
降级 OpenClaw 到 2026.4.x 版本,等待官方发布兼容版本
持续关注 Issue #121 的进展:https://github.com/Tencent/openclaw-weixin/issues/121
快速修复步骤(推荐流程)
针对七总当前的环境(OpenClaw 2026.5.5,WeChat 插件未安装状态),按以下顺序执行:
步骤一:确认 OpenClaw 和 Node.js 版本
复制
openclaw --version
node --version
OpenClaw 应 >= 2026.5.3(包含了 plugin-runtime-deps 清理修复)。Node.js 建议 >= 24。
步骤二:确认插件最新版本
复制
npm view @tencent-weixin/openclaw-weixin version
当前最新稳定版为 2.4.1。如果低于此版本,说明安装源有问题。
步骤三:清理旧插件残留并强制重装
复制
# 清理旧的插件记录
openclaw plugins uninstall "@tencent-weixin/openclaw-weixin" 2>/dev/null
# 强制重装(--force 确保覆盖)
openclaw plugins install "@tencent-weixin/openclaw-weixin" --force
步骤四:启用插件
复制
openclaw config set plugins.entries.openclaw-weixin.enabled true
步骤五:执行 OpenClaw 诊断
复制
openclaw doctor
检查输出中是否有错误或警告。
步骤六:重启 Gateway
复制
openclaw gateway restart
步骤七:尝试扫码登录(需在同一台机器的终端执行)
复制
openclaw channels login --channel openclaw-weixin
如果出现二维码,说明 Bug 1(Content-Length)已修;如果仍然报 TypeError: fetch failed,说明插件版本未更新。
步骤八:验证消息路由
登录成功后,向机器人发送一条测试消息。如果 30 秒内无响应,说明 Bug 3(模块沙箱问题)仍在,此时需要降级 OpenClaw 或等待官方补丁。
OpenClaw 版本兼容性速查表
微信插件版本
OpenClaw 版本要求
备注
1.x
>= 2026.1.0, < 2026.3.22
旧版兼容线,已停止维护
2.x(最新)
>= 2026.3.22
当前稳定版,npm tag: latest
2.4.1
>= 2026.5.x
修复了 Content-Length 问题,模块沙箱问题未修复
如果你需要立即可用——降级方案
如果微信是你使用 OpenClaw 的主要渠道,且上述问题在最新版本中仍未解决,可以选择 降级 OpenClaw 到 2026.4.x:
复制
# 查看可用版本
npm view openclaw versions --json | grep 2026.4
# 安装指定版本(以 2026.4.25 为例)
npm install -g [email protected]
# 重启 Gateway
openclaw gateway restart
降级后,微信插件应该可以正常加载和收发消息。同时建议在 OpenClaw 的 channels.wechat 配置中锁定版本防止自动升级:
复制
openclaw config set channels.wechat.skipUpgrade true # 如果存在此配置项