乐于分享
好东西不私藏

微信接入原版 OpenClaw,我在服务器上踩完的坑

微信接入原版 OpenClaw,我在服务器上踩完的坑

微信接入原版 OpenClaw,我在服务器上踩完的坑

最近微信可以直接接入原版 OpenClaw,这件事本身很有吸引力。命令看起来也很简单:

npx -y @tencent-weixin/openclaw-weixin-cli@latest install

看起来像是一条命令就能收工,但真把它放到服务器环境里跑,问题会一层一层冒出来。

这篇文章不讲营销,只讲我实际踩到的坑,以及每一步到底该怎么排查。

先说结论

如果你是在服务器上接微信版 OpenClaw,真正的关键点不是“有没有桌面窗口”,而是下面这几件事:

1.微信插件本身支持终端二维码,不依赖 GUI 弹窗。

2.你的 openclaw 版本必须足够新,否则插件根本加载不起来。

3.openclaw 升级后,Node 版本也要跟上。

4.如果你用 fnm 管理 Node,全局 npm 包是按 Node 版本隔离的,切版本后要重新装一次 openclaw

5.服务器上没有 systemd --user 也不是致命问题,别被这个次要报错带偏。

第一坑:以为服务器没窗口,就没法扫码

最开始我担心的是二维码怎么显示。

因为安装命令的说明里写的是“自动跳出一个二维码”,而服务器通常没有桌面环境,所以第一反应会觉得这件事可能做不了。

但把 npm 包拆开看后,结论很明确:安装器本身不负责画二维码,它只是调用:

openclaw plugins install "@tencent-weixin/openclaw-weixin"openclaw channels login --channel openclaw-weixinopenclaw gateway restart

真正的二维码逻辑在微信插件里。

这个插件的实现是:

1.优先用 qrcode-terminal 在终端直接打印 ASCII 二维码。

2.如果终端二维码打印失败,就退化成输出二维码链接。

也就是说,服务器环境不是问题。只要插件能正常加载,扫码这一步本来就是为终端场景准备的。

第二坑:不是二维码问题,而是插件根本没加载成功

第一次跑安装命令时,表面上像是已经安装完了,但真正执行登录时,报错是这样的:

openclaw-weixin failed to load ... TypeError: resolvePreferredOpenClawTmpDir is not a functionChannel login failed: Error: Unsupported channel: openclaw-weixin

这类报错有个很容易误判的地方。

很多人看到 Unsupported channel,会以为是插件没装好,或者命令写错了。实际上这只是结果,不是根因。

真正的根因是:

微信插件依赖了较新的 openclaw/plugin-sdk

本机全局 openclaw 版本太老

插件加载阶段就炸了

所以后面根本没有成功注册 openclaw-weixin 这个 channel

我当时机器上的版本是:

openclaw 2026.2.9

npm 最新是 2026.3.13

这个问题的修复也很直接:

npm install -g openclaw@latest

不要在“二维码拿不到”“channel 不支持”这些表象上浪费时间,先确认插件有没有真正 load 成功。

第三坑:升级 OpenClaw 后,Node 版本又不够了

把 openclaw 升级后,下一步立刻撞上新的错误:

openclaw requires Node >=22.16.0.Detected: node 22.14.0

这一步很常见。

很多人只盯着 npm install -g 成没成功,却忘了 CLI 自身还有 Node 版本要求。结果就是:

包是新的

命令也是新的

但运行时环境还是旧的

如果你用 fnm,最短修复路径就是:

fnm install 22.16.0fnm use 22.16.0node -v

确认 Node 版本切对之后,再继续跑 openclaw

第四坑:npm 安装失败,但问题不在 npm

升级 openclaw 时,我还遇到过一次特别像 npm 自身抽风的报错。实际输出是:

git ls-remote ssh://git@github.com/whiskeysockets/libsignal-node.gitWARNING: UNPROTECTED PRIVATE KEY FILE!Permissions 0644 for '/home/lijunjie/.ssh/autodl_linux.key' are too open.git@github.com: Permission denied (publickey).

表面看是 npm 报错,实际根因是 GitHub 依赖下载时走了 SSH,而本机 SSH key 配置有问题。

这里真正要看的是两件事:

1.下游依赖是不是从 GitHub git 地址拉包

2.你的机器是不是把 GitHub 访问导向了 SSH key

我的处理方式是直接强制这次安装走 HTTPS:

git config --global url."https://github.com/".insteadOf ssh://git@github.com/git config --global --add url."https://github.com/".insteadOf git@github.com:

这样做的好处是,不需要先修 SSH key,也不依赖这把 key 真的有 GitHub 权限。

如果你确定要继续走 SSH,再去修:

chmod 600 ~/.ssh/autodl_linux.key

但这只是修复权限过宽,不代表这把 key 一定能访问对应仓库。

第五坑:Node 切对了,openclaw 却突然没了

把 Node 切到 22.16.0 后,我还遇到过一个更迷惑的现象:

openclaw: command not found

或者更早一点,会出现它还指向旧的 fnm_multishells/.../bin/openclaw 临时路径,结果文件已经不存在了。

这个坑的本质是两层:

1.fnm 切 Node 版本后,当前 shell 里缓存的命令路径可能已经失效。

2.更重要的是,全局 npm 包是按 Node 版本隔离的。

也就是说:

你在 Node 22.14.0 下装过 openclaw

不代表切到 Node 22.16.0 后还能直接用

正确动作不是继续怀疑 PATH,而是先意识到要在新 Node 版本下面重新装一次全局包:

npm install -g openclaw@latesthash -ropenclaw --version

如果只是 shell 缓存问题,hash -r 有用。

但如果新版本 Node 下面根本没装 openclaw,那就必须重新安装。

第六坑:gateway restart 报错,不代表主流程失败

安装流程里还有一个很容易把人带偏的输出:

Gateway service check failed: systemctl --user unavailable

这个报错在服务器、容器或者没有 systemd --user 的环境里很常见。

它表示的是:

openclaw gateway restart 这种依赖用户态 systemd 的方式不可用

它不表示:

微信插件不能装

二维码不能扫

OpenClaw 不能跑

如果你本来就有自己的进程管理方式,直接用你自己的脚本起 gateway 就行。

例如我这里最终是直接用仓库里的脚本来启动:

./openclaw-gatewayctl.sh start

对于服务器环境,这种方式通常比强依赖 systemd --user 更稳。

最短可执行路径

如果你也在服务器上做这件事,我建议直接按下面这条顺序走,不要来回试:

1. 先把 Node 切到满足要求的版本

fnm install 22.16.0fnm use 22.16.0

2. 在这个 Node 版本下面重新安装 OpenClaw

npm install -g openclaw@latest

如果中途遇到 GitHub SSH 拉包问题,先执行:

git config --global url."https://github.com/".insteadOf ssh://git@github.com/git config --global --add url."https://github.com/".insteadOf git@github.com:

3. 安装微信插件

npx -y @tencent-weixin/openclaw-weixin-cli@latest install

4. 如果安装器中途没完成,手动执行登录

openclaw channels login --channel openclaw-weixin

这一步如果插件加载正常:

优先在终端打印二维码

打印失败就输出二维码链接

5. 不依赖 systemd,自己把 gateway 跑起来

./openclaw-gatewayctl.sh start

最后一句

这次接微信版 OpenClaw,表面上看是一个“扫码登录”的问题,实际上真正容易卡住的全是环境问题:

插件和核心版本不匹配

Node 版本不够

npm 下游依赖走 Git SSH

fnm 切版本后全局包隔离

服务器上没有用户态 systemd

把这些分开看,整个过程并不复杂。

真正复杂的不是接入本身,而是你有没有把每一层报错都当成“根因”去误判。

如果你也在服务器上折腾这条链路,希望这篇复盘能帮你少走一点弯路。