微信AI双开方案:HermesClaw实现iLink协议代理与多AI助手集成
1. 项目概述:一个微信账号,两个AI大脑
如果你和我一样,既想体验 Hermes Agent 在代码生成和逻辑推理上的强大能力,又舍不得 OpenClaw 在文件处理和日常对话上的贴心与便捷,那么你肯定也遇到了那个让人头疼的问题:这两个优秀的 AI 助手,它们的微信网关(Gateway)无法在同一个微信账号上和平共处。一旦你同时启动,后启动的那个就会立刻报错,提示403或者连接被占用,因为 iLink 协议要求一个账号在同一时刻只能有一个活跃的轮询连接。
这感觉就像你有一把钥匙,却有两扇都想打开的门,每次只能选一扇。于是,我动手写了HermesClaw。它的目标很简单:成为那把唯一的“钥匙”,然后巧妙地复制出两把“虚拟钥匙”,分别递给 Hermes 和 OpenClaw,让它们都以为自己独占着连接。这样一来,你就能在同一个微信里,用/hermes、/openclaw或/both命令,自由切换或同时启用两个 AI 助手。这篇文章,我就来详细拆解这个项目的设计思路、实现细节,以及我在部署和调试过程中踩过的那些坑,希望能帮你顺利实现“双开”。
2. 核心架构与设计思路拆解
2.1 为什么不能直接双开?理解 iLink 协议的限制
要理解 HermesClaw 的价值,首先得明白问题出在哪。无论是 Hermes Agent 的hermes-gw,还是 OpenClaw 的clawbot(openclaw-weixin),它们与微信服务器通信的核心都是腾讯的 iLink 协议。这个协议本质上是一种长轮询(Long Polling)机制:你的网关程序会持续向ilinkai.weixin.qq.com发送请求,询问“有没有新消息?”。服务器会保持这个连接,直到有消息到达或超时,然后返回消息数据。
这里的关键在于身份令牌(Token)。每个登录的微信账号会获得一个唯一的 iLink Token。这个 Token 是连接的身份凭证。当第一个网关(比如 Hermes)开始轮询时,它就用这个 Token 建立了一个独占的连接会话。如果此时第二个网关(比如 OpenClaw)用同一个 Token 也发起轮询请求,微信服务器会检测到“同一个身份正在从另一个地方连接”,出于安全和管理考虑,它会拒绝后来的请求(返回403错误),或者直接踢掉前一个连接,导致消息丢失。
所以,原生方案的矛盾是结构性的:一个 Token,一个活跃连接。这就像你的手机号只能在一台设备上登录微信一样。
2.2 HermesClaw 的解决方案:扮演“智能路由器”
既然问题的根源是“单点连接”,那么解决方案就是引入一个“中间层”。HermesClaw 的核心思想是让自己成为那个唯一的、官方的 iLink 客户端。它负责与微信服务器进行所有通信,独占那个 Token 和连接。
然后,HermesClaw 在本地启动两个独立的 HTTP 代理服务器(Proxy A 和 Proxy B)。这两个代理服务器对外暴露的 API 接口,与真实的 iLink API 完全一致。接下来,我们“骗”一下原有的两个网关:
- 修改 OpenClaw (
clawbot) 的配置,让它以为 iLink 服务器地址是http://127.0.0.1:19999(Proxy A)。 - 修改 Hermes Agent 的微信网关配置,让它以为 iLink 服务器地址是
http://127.0.0.1:19998(Proxy B)。
这样,两个网关都以为自己直接连上了微信服务器,实际上它们的请求都发到了本地的 HermesClaw。HermesClaw 内部的工作流程如下:
- 消息接收(下行):HermesClaw 作为唯一客户端,从真实的 iLink 服务器拉取到新消息(一个原始的、未解密的 iLink 协议数据包)。
- 消息路由:根据你当前设置的命令模式(
/hermes,/openclaw,/both),HermesClaw 决定将这个原始数据包转发给哪个代理(Proxy A, Proxy B, 或两者)。 - 代理转发:对应的代理服务器收到这个数据包,并转发给正在轮询它的那个网关。网关收到数据包后,会像平常一样进行解密、解析,然后调用后端的 AI 模型(如 OpenAI, Claude, DeepSeek 等)进行处理。
- 消息发送(上行):当某个网关的 AI 生成了回复,它会将回复内容封装成 iLink 协议格式,发送给它所连接的代理服务器(比如 Proxy A)。
- 上行路由:代理服务器将这个消息转发给 HermesClaw 核心。核心程序再使用它持有的那个唯一的 Token,将消息发送到真实的 iLink 服务器,最终抵达你的微信好友或群聊。
这个架构的精妙之处在于“透明转发”。HermesClaw 本身不处理消息内容。它不负责解密图片、不转录语音、不调用 AI 接口、也不存储任何对话记忆。它只做一件事:搬运原始的、加密的 iLink 协议数据包。所有复杂的业务逻辑,仍然由原本的 Hermes 和 OpenClaw 网关原生处理。这极大地简化了 HermesClaw 的代码(核心仅约 500 行 Python),也保证了稳定性和兼容性——只要原网关能处理的,通过 HermesClaw 一样能处理。
3. 环境准备与网关配置检查
在运行一键安装脚本之前,确保你的基础环境是准备好的。HermesClaw 是一个“粘合剂”,它需要至少一个能正常工作的“部件”。
3.1 系统与依赖要求
- 操作系统:推荐 Linux(如 Ubuntu 22.04, Debian 11, CentOS 8 等)或 macOS。理论上 Windows 的 WSL2 也可以,但本文主要基于 Linux 环境讲解。
- Python:需要 Python 3.8 或更高版本。安装脚本会检查。
- 包管理工具:需要
pip3。 - 进程管理:安装脚本会配置
systemd服务以便开机自启,所以你的系统需要支持systemd(绝大多数现代 Linux 发行版都支持)。
你可以用以下命令快速检查:
python3 --version pip3 --version systemctl --version3.2 至少安装并配置一个网关
你必须已经成功安装并登录了以下至少一个 AI 助手的微信网关:
选项一:OpenClaw 的 Clawbot (openclaw-weixin)这是 OpenClaw 项目官方的微信网关。你需要确保:
- 已经按照 OpenClaw 官方文档安装并配置好了
openclaw-weixin。 - 已经成功执行了登录流程,通常是通过扫描二维码。
- 网关正在运行,并且能正常收发微信消息。 关键检查点:找到你的
openclaw-weixin账户配置文件,通常路径像~/openclaw-weixin/accounts/你的微信ID/account.json。这个文件里包含了宝贵的 iLink Token。
选项二:Hermes Agent 的微信网关 (hermes-gw)这是 Hermes Agent 项目官方的微信网关。你需要确保:
- 已经按照 Hermes Agent 文档安装并配置了微信网关(通常通过
hermes gateway命令)。 - 已经成功登录微信。
- 网关服务正常运行。 关键检查点:Hermes 的配置通常存储在
~/.hermes/.env文件中,其中包含WEIXIN_BASE_URL和登录凭证。
重要提示:安装脚本会智能检测你系统中已存在的网关。但为了顺利提取 Token,请确保在运行安装脚本前,目标网关没有正在运行。否则账户文件可能被锁定,导致读取失败。使用
ps aux | grep -E “(openclaw-weixin|hermes-gw)”查看并kill相关进程。
3.3 网络与权限考量
- 网络连通性:你的服务器必须能稳定访问
ilinkai.weixin.qq.com。如果你在国内,这通常没问题;如果在海外,可能需要关注网络延迟。 - 端口占用:HermesClaw 会占用
19999和19998两个端口。请确保这两个端口没有被其他程序使用。 - 文件权限:安装脚本和 HermesClaw 服务需要读取你的网关账户文件(通常在你家目录下),以及写入配置。确保你以正常的用户权限运行脚本,而不是
root(除非你的网关也是以root安装的,但这不推荐)。
4. 一键安装与智能配置解析
一切准备就绪后,安装过程其实非常简单。但理解脚本背后做了什么,能让你在出现问题时快速定位。
4.1 执行安装命令
打开终端,执行以下命令:
curl -fsSL https://raw.githubusercontent.com/AaronWong1999/hermesclaw/main/install.sh | bash这个命令会下载并执行安装脚本。建议你先浏览一下脚本内容(地址同上),做到心中有数。
4.2 安装脚本的“智能”工作流
脚本会按顺序执行以下关键操作,我将其称为“八步检测法”:
- 环境探测:检查
python3,pip3,systemd是否存在。 - 网关发现:在常见的安装路径下搜索
openclaw-weixin和hermes-gw的踪迹。它会检查配置文件、账户文件,判断哪个网关已配置好。 - Token 提取:这是最关键的一步。脚本会从它找到的第一个可用的网关账户文件(无论是 OpenClaw 的
account.json还是 Hermes 的.env)中,提取出ilink_token。这个 Token 将被 HermesClaw 复用,作为连接微信服务器的唯一凭证。 - 配置修补:
- 对于OpenClaw:它会找到
openclaw-weixin的配置文件,将其中的baseUrl(即 iLink 服务器地址)从https://ilinkai.weixin.qq.com修改为http://127.0.0.1:19999,并备份原文件为.bak。 - 对于Hermes Agent:它会修改
~/.hermes/.env文件,设置WEIXIN_BASE_URL=http://127.0.0.1:19998,并备份原文件。 - 这样,两个网关的流量就被导向了本地的代理。
- 对于OpenClaw:它会找到
- 依赖安装:安装 HermesClaw 运行所需的 Python 包,主要是
requests和python-dotenv。 - 媒体路径符号链接(针对 OpenClaw):这是一个重要的兼容性修复。OpenClaw 的
clawbot在处理媒体文件(如图片)时,预期的文件路径模式可能与 HermesClaw 转发的路径略有不同,导致找不到文件错误(ENOENT)。安装脚本会自动创建一个符号链接,将 HermesClaw 使用的临时媒体目录链接到 OpenClaw 期望的目录,完美解决此问题。 - Hermes 消息分割修复(可选但推荐):Hermes Agent 的微信网关默认会将长回复按换行符分割成多条消息发送,这在双开模式下可能影响体验。安装脚本会提示你是否应用一个补丁,修改
weixin.py文件,禁用这个分割行为,让长回复作为单条消息发送。我强烈建议选择“Yes”。 - 系统服务配置:最后,脚本会创建一个
systemd服务单元文件 (hermesclaw.service),设置开机自启,并立即启动 HermesClaw 服务。
4.3 安装后的验证
安装脚本执行完毕后,你需要:
- 重启你的网关:因为它们的配置已经被修改了。重启 OpenClaw 的
clawbot和 Hermes 的hermes-gw服务。 - 发送测试命令:在你的微信里,给绑定的账号发送
/whoami。- 预期返回:你应该收到来自 HermesClaw 的回复,显示当前的路由模式(默认是
hermes),以及检测到的活跃网关状态。
- 预期返回:你应该收到来自 HermesClaw 的回复,显示当前的路由模式(默认是
- 尝试切换:发送
/openclaw,再发送任意消息,应该由 OpenClaw 处理并回复。发送/both,然后问一个问题,你应该会收到两条回复,分别以[Hermes Agent]和[OpenClaw]开头。
如果/whoami没有反应,请按顺序检查:
sudo systemctl status hermesclaw查看 HermesClaw 服务是否运行正常。- 分别检查两个网关的日志,看是否有连接错误。
- 确认防火墙是否放行了
19998和19999端口(本地连接通常没问题)。
5. 核心功能使用与高级技巧
成功安装并验证后,你就可以享受双倍的 AI 生产力了。以下是一些核心使用方法和深度技巧。
5.1 三大路由模式详解
| 命令 | 模式 | 行为 | 适用场景 |
|---|---|---|---|
/hermes | 单 Hermes 模式 | 所有消息仅转发给 Hermes Agent 处理。 | 当你需要编写代码、进行复杂逻辑推理或数学计算时。Hermes 在这些方面通常更强。 |
/openclaw | 单 OpenClaw 模式 | 所有消息仅转发给 OpenClaw 处理。 | 当你需要处理上传的文档(PDF、Word)、总结网页内容,或进行轻松的日常对话时。OpenClaw 的文件处理能力是亮点。 |
/both | 双开模式 | 所有消息同时转发给 Hermes 和 OpenClaw。两者都会处理并回复。 | 对比测试:想看看同一个问题,两个 AI 会给出怎样不同的答案。 互补咨询:复杂问题希望获得双重见解。 趣味互动:体验两个 AI “同时”为你服务的感觉。 |
在/both模式下,两者的回复是并行的,但发送回微信的顺序取决于各自处理的速度。回复前会带有[Hermes Agent]或[OpenClaw]的标签,方便区分。
5.2 媒体消息处理内幕
这是很多用户关心的问题:图片、语音、文件都能正常处理吗?答案是肯定的,这得益于“原始协议转发”的设计。
- 文本消息:最简单,直接转发。
- 语音消息:微信 iLink 协议在发送语音消息时,已经附带了腾讯语音识别引擎转写的文字结果。HermesClaw 转发的是包含这个转录文本的原始数据包。因此,无论是 Hermes 还是 OpenClaw,收到的都是文字,它们直接处理文字即可。这意味着不需要额外的语音识别 API,也避免了语音解密和转码的麻烦。
- 图片、视频、文件:iLink 协议消息里包含一个加密的 CDN 下载链接和一个用于解密的 AES 密钥。HermesClaw 将这个完整的消息包转发给网关。然后,由各自的网关去执行下载、解密、将文件保存到本地临时目录、最后将文件路径或内容传递给后端 AI 模型这一系列操作。这个过程对用户完全透明,和直接使用单个网关时一模一样。
实操心得:如果你发现某个网关无法处理媒体文件,问题大概率出在网关自身的配置上,比如临时目录权限不足、后端 AI 模型不支持多模态等。首先检查单个网关模式下是否正常。
5.3 状态管理与故障恢复
HermesClaw 本身设计为轻量且稳健。它的系统服务会持续运行。如果因为网络波动导致与 iLink 服务器的连接中断,它会自动重试。
- 查看服务状态:
sudo systemctl status hermesclaw - 查看实时日志:
sudo journalctl -u hermesclaw -f - 重启服务:
sudo systemctl restart hermesclaw
如果你的微信账号在手机端被退出登录,或者 Token 过期,iLink 连接会失效。此时需要:
- 停止 HermesClaw 服务:
sudo systemctl stop hermesclaw - 停止两个网关服务。
- 重新运行单个网关(比如
openclaw-weixin)的登录流程,获取新的 Token。 - HermesClaw 的安装脚本设计上是幂等的。你可以再次运行安装脚本。它会检测到现有的配置,并提示你是否要覆盖 Token。选择“是”,它就会用新 Token 更新配置。
- 重新启动 HermesClaw 和两个网关服务。
6. 常见问题排查与解决方案实录
即使有智能安装脚本,在实际部署中也可能遇到各种环境差异导致的问题。这里记录了我遇到和收集的典型问题。
6.1 安装阶段问题
问题1:安装脚本执行失败,提示“Cannot detect any configured gateway”
- 原因:脚本在标准路径下没有找到任何已配置且登录过的网关账户文件。
- 排查:
- 确认你是否真的已经成功安装并登录了一个网关。单独运行它,看能否正常收发消息。
- 确认网关的安装路径是否非常规。安装脚本会搜索
~,/opt,/usr/local等常见路径,但如果你安装在了自定义路径,可能需要手动干预。
- 解决:你可以手动进行安装步骤:
- 从任一网关的账户文件中找到
ilink_token。 - 克隆 HermesClaw 仓库:
git clone https://github.com/AaronWong1999/hermesclaw.git - 复制
.env.example为.env,并填入 Token。 - 手动修改两个网关的配置指向本地代理端口。
- 手动创建 systemd 服务文件。
- 从任一网关的账户文件中找到
问题2:安装后,发送消息无回复,/whoami也不响应
- 排查步骤:
- 检查 HermesClaw 服务:
sudo systemctl status hermesclaw。确保状态是active (running)。查看日志有无错误。 - 检查网关服务:分别确认
openclaw-weixin和hermes-gw是否已重启并运行。 - 检查端口:
netstat -tlnp | grep -E ‘:19999|:19998’。应该看到 Python 进程在监听这两个端口。 - 检查网关配置:确认
openclaw-weixin的baseUrl和 Hermes 的WEIXIN_BASE_URL确实被修改成了127.0.0.1:19999和127.0.0.1:19998。 - 查看网关日志:这是最重要的信息源。查看两个网关的日志输出,看它们是否在成功轮询本地代理,或者是否有连接拒绝、超时等错误。
- 检查 HermesClaw 服务:
6.2 运行阶段问题
问题3:在/both模式下,只有其中一个 AI 回复
- 原因:这通常是因为两个网关的后端 AI 模型响应速度差异很大。慢的那个可能还在处理,而微信对话有上下文,你可能已经进行了下一轮。
- 排查:查看两个网关的日志。确认消息是否都被转发到了(检查 HermesClaw 日志)。确认慢的网关是否正在处理中,或者是否报错(如 API 额度用完、网络超时)。
- 解决:这属于正常现象。你可以通过日志判断是性能问题还是故障。
问题4:OpenClaw 无法下载/解密图片,提示文件不存在
- 原因:这就是安装脚本中“媒体路径符号链接”要解决的问题。两个进程对临时文件路径的预期不一致。
- 解决:确保安装脚本成功执行了创建符号链接的步骤。你可以手动检查:
ls -la /tmp/hermesclaw_media/是否存在,并且是否链接到了 OpenClaw 预期的目录(如/tmp/openclaw_weixin_media/)。如果没有,可以手动创建:mkdir -p /tmp/hermesclaw_media ln -sf /tmp/hermesclaw_media /tmp/openclaw_weixin_media # 请根据实际路径调整
问题5:Hermes 的回复被拆分成多条短消息
- 原因:Hermes Agent 微信网关的默认行为。
- 解决:运行项目根目录下的修复脚本:
bash fix_hermes_splitting.sh。这个脚本会定位并修改 Hermes 的weixin.py文件,注释掉按换行符分割消息的代码段。修改后需要重启 Hermes 网关服务。
6.3 网络与系统问题
问题6:服务运行一段时间后失去连接
- 排查:
- 检查服务器网络是否稳定。
- 检查微信 Token 是否过期(通常在手机端微信退出登录后发生)。可以尝试重新登录单个网关来刷新 Token。
- 查看 HermesClaw 日志是否有大量重连信息。
- 解决:网络问题需要自行解决服务器网络。Token 过期则按前面“状态管理与故障恢复”章节的步骤操作。
问题7:如何升级 HermesClaw?由于核心逻辑简单,升级通常只需更新hermesclaw.py文件并重启服务。
cd ~/hermesclaw git pull origin main sudo systemctl restart hermesclaw如果项目有重大更新(如配置文件格式变化),请关注 GitHub 仓库的 Release 说明。
7. 手动安装与深度自定义指南
对于喜欢掌控一切,或者环境比较特殊的用户,手动安装能让你更清楚每一个环节。
7.1 核心组件手动部署
- 获取代码与配置:
git clone https://github.com/AaronWong1999/hermesclaw.git cd hermesclaw cp .env.example .env - 编辑
.env文件:你需要手动填入从任一网关获取的ILINK_TOKEN。同时可以配置监听端口(非必要不改)。 - 安装 Python 依赖:
pip3 install -r requirements.txt # 通常就是 requests 和 python-dotenv - 手动修改网关配置:
- OpenClaw:找到其配置文件(如
config.yaml或account.json),将baseUrl改为http://127.0.0.1:19999。 - Hermes:编辑
~/.hermes/.env,确保WEIXIN_BASE_URL=http://127.0.0.1:19998。
- OpenClaw:找到其配置文件(如
- 创建媒体目录符号链接(针对 OpenClaw):
mkdir -p /tmp/hermesclaw_media # 假设 OpenClaw 媒体路径是 /tmp/openclaw_weixin_media ln -sf /tmp/hermesclaw_media /tmp/openclaw_weixin_media - 启动 HermesClaw:
python3 hermesclaw.py - 配置 systemd 服务(可选但推荐):参考项目根目录下安装脚本中创建服务文件的部分,手动创建
/etc/systemd/system/hermesclaw.service。
7.2 架构扩展思考
当前的 HermesClaw 是双代理架构。这个模式其实可以扩展。
- 支持更多 AI 助手:理论上,你可以启动第三个代理(如
:19997),然后修改另一个 AI 微信网关的配置指向它,并在 HermesClaw 的路由逻辑中添加第三个选项。但这需要修改hermesclaw.py的源代码,增加代理实例和路由规则。 - 负载均衡与优先级:在
/both模式下,现在是广播。你可以设想更复杂的路由策略,比如根据消息类型(文本、图片)或关键词,将消息路由给不同的 AI 处理。 - 高可用性:目前 HermesClaw 是单点。可以将其设计成主从模式,但这对于个人使用场景来说可能过度设计了。
手动修改代码需要你对 Python 和 HTTP 代理有基本了解。核心文件hermesclaw.py结构清晰,主要包含ProxyServer类、消息队列和主路由循环,阅读起来并不困难。
8. 安全与维护建议
最后,分享一些关于安全性和长期维护的体会。
- Token 安全:
ILINK_TOKEN是你的微信账户在 iLink 协议下的身份凭证。.env文件应妥善保管,避免泄露。HermesClaw 仅在本地网络监听(127.0.0.1),只要服务器本身安全,风险较低。 - 权限最小化:不要以
root用户运行 HermesClaw 或你的 AI 网关。使用一个普通用户,并确保该用户有权限读取网关配置和写入临时文件即可。 - 定期更新:关注 HermesClaw、Hermes Agent 和 OpenClaw 的更新。尤其是原项目的大版本更新,可能会引入协议变更,需要 HermesClaw 同步适配。我的项目仓库通常会及时跟进。
- 日志监控:将
hermesclaw的 systemd 日志 (journalctl) 纳入你的服务器监控体系,便于及时发现连接异常。 - 理解“社区桥接”性质:HermesClaw 是一个非官方的、社区驱动的粘合工具。它依赖于上游项目(Hermes Agent, OpenClaw)的接口稳定性。如果上游项目对微信网关部分进行了不兼容的更新,HermesClaw 可能需要时间适配。遇到问题时,检查 Issues 页面或自己动手排查,是开源社区用户的必备技能。
这个项目诞生于我个人的需求,但看到它在社区中被认可,甚至被 Hermes Agent 官方 README 收录,让我感到开源协作的魅力。它不复杂,但解决了真实痛点。希望这篇详细的拆解,不仅能帮你顺利部署,更能让你理解其背后的设计哲学。如果在使用中遇到新问题,欢迎到项目仓库提出 Issue,我们一起让它更完善。
