背景

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 # 如果存在此配置项

Copyright © 2088 2017乒乓球世界杯_世界杯体彩 - uzhiqu.com All Rights Reserved.
友情链接