无公网 IP 远程调用本地 Claude Code:微信消息 + iLink 中转 + clawbot 桥接实战
一、要解决的问题Claude Code、Codex 这类本地 AI 编程工具默认只能在电脑前用。出门在外想让它跑个脚本、改份文件、排个版传统思路是买公网 IP / 域名做内网穿透frp、ngrok、cloudflare tunnel在本地起服务把端口暴露出去这三条路都能走通但都在解决同一个问题外部如何主动访问我的电脑。而我真正需要的只是让电脑里的 Agent 收到一条任务指令。这篇文章分享一种更轻的实现用微信消息做触发器电脑主动连出去轮询消息本地执行后再把结果送回来。整条链路不存在由外部主动发起的入站连接也不需要公网 IP。二、方案总览整个链路可以拆成 6 段阶段组件职责触发端手机微信发送指令如「把这篇文章排个版」协议层微信消息中转服务我用的 iLink接收微信消息提供可轮询的 API渠道桥clawbot自研轮询中转服务接入消息并归一化回发结果路由/权限bot_core检查白名单、路由命令、管理上下文执行端ClaudeRunner调用本地 Agent 的 CLI读取文件、跑命令、生成结果回流clawbot / lark-cliclawbot 直接把文本/图片/文件回传微信lark-cli 把长结果写进飞书文档再回传链接架构图示手机微信 │ │ 发送消息 ▼ iLink 中转服务 ▲ │ 主动轮询 │ clawbot本地 │ │ IncomingMessage / TurnRequest ▼ bot_core │ │ 路由命令 ▼ ClaudeRunner │ │ 启动本地 Agent ▼ 本地 AgentClaude Code / Codex 等 │ │ 文本 / 图片 / 文件 ▼ clawbot ───────────▶ 微信 │ │ 长结果 / 文档 ▼ lark-cli → 飞书文档 → 链接回微信三、关键设计一不另起 Agent只借微信协议层腾讯开源了openclaw-weixin插件做的是「用微信操控 OpenClaw 这个 AI Agent」。我本地使用的是 Claude Code 和 Codex所以并不能完全照搬过来。我只复用了它的通信协议这一层接入、归一化、回发这些逻辑用标准库自己实现整个桥梁叫 clawbot。它只做三件事接入通过 iLink Bot API 把微信私聊消息收进来归一化把 iLink 消息格式转成平台无关的IncomingMessage回发把bot_core处理后的结果发回微信。clawbot不实现 AI 对话逻辑。意图识别、命令路由、模型调用、工具执行全部委托给bot_core与ClaudeRunner。真正的执行仍然交给已有的 bot_core它检查身份、路由命令再调用 ClaudeRunner 启动我电脑里的 Agent。四、关键设计二利用出站连接绕过 NAT家庭宽带的 NAT默认阻断的是外部发起的入站连接。外部请求无法直接定位到内网中的某台设备。但由内网主动发起的出站连接是畅通的浏览器、微信、SSH 出去都是电脑自己连出去。所以我没有让手机直接连电脑而是让电脑主动连 iLink电脑 ──出站──▶ iLink ◀──微信── 手机这条链路里手机把消息发给微信服务器微信把消息同步到 iLink电脑上的 clawbot 主动轮询 iLink问一句「有新消息吗」有新消息就拉下来处理没消息就空转消息经 bot_core 路由由 ClaudeRunner 执行本地 AgentAgent 在本地执行任务结果经 bot_core 交回 clawbot再通过 iLink 回到微信手机到电脑的数据流向看起来是「反向」的但网络连接方向始终是电脑主动出站。因此不需要公网 IP、不需要端口映射、不需要内网穿透。整条链路中不存在由外部主动发起的入站连接。五、关键设计三任务执行与结果闭环一开始我以为「能触发、能收到完成通知」就够了。实际用下来发现还差半步任务结果还躺在电脑里人在外面只能收到一句「写完了」。clawbot 本身就能把 Agent 的输出文本、图片、文件回传到微信。但对于写文章、跑数据这类长结果直接发在微信里并不方便阅读和批注。所以我把lark-cli接进了链路Agent 跑完后调用lark-cli把结果写进飞书文档再把文档链接回给我。完整调用链以写入飞书文档为例手机微信 ↓ iLink ↓ clawbot ↓ bot_core ↓ ClaudeRunner → 本地 Agent ↓ lark-cli create-doc --content ... ↓ 飞书文档链接 → 回传微信如果只是返回简短文本或图片Agent 输出经 bot_core 直接由 clawbot 回传微信即可不需要经过飞书。手机上点开链接就是可阅读、可批注、可转发的内容而不只是「完成」两个字。六、安全设计三道闸远程触发本地高权限工具风险很直接。电脑里的 Agent 能读文件、跑脚本、改代码手机远程发来的已经不只是一条聊天消息而是一条可能在本机执行的指令。我给自己留了三道闸第一道身份白名单bot_core 只响应预先配置的微信身份。没在白名单里的消息直接丢弃避免任何人都能往你的电脑发指令。第二道按项目指定工作目录每个任务默认在指定项目目录下启动 Agent避免日常任务一上来就在整个家目录里找文件。但这里必须说清楚工作目录只是默认活动范围不是安全隔离。尤其开了 Agent 的--dangerously-skip-permissions后它仍然可以访问目录外的文件。这个参数的名字已经把风险写明白了。第三道系统级隔离对于高风险任务用受限账户、沙箱或容器运行 Agent。白名单解决「谁能发」工作目录解决「默认从哪开始」真正的隔离才解决「出事时能碰到哪里」。七、踩坑与选型建议1. 微信消息中转必须走 iLink 吗我用的是 iLinkilinkai.weixin.qq.com这是腾讯内部的微信 Bot 网关通过 openclaw-weixin 扫码登录接入。理论上换成其他方案也能实现同样思路——Wechaty 的多协议 Puppet、Windows 上的 wxhelper / WeChatFerryHook 注入个人微信进程、企业微信官方 APIwechatpy都能提供可轮询/可推送的消息通道。但每种方案在协议稳定性、封号风险、平台限制上差别很大clawbot 的protocol.py也需要相应改写。如果只是想跑通这套思路我推荐直接沿用 iLink 路径换协议前先评估账号风险。2. 为什么不直接用飞书/钉钉机器人也可以。我选微信是因为手机里最常打开的就是它发起任务的摩擦最小。飞书更适合看工具调用和执行状态微信第一版只给结果。3. 轮询会不会很费资源clawbot 轮询间隔可以配置平时 5-10 秒一次只发一个 HTTP 请求资源消耗极低。也可以配合 iLink 的长轮询或 webhook 做优化但第一版先保证简单可靠。4. 为什么不直接内网穿透内网穿透解决的是「从外面访问本地服务」而我需要的是「让本地任务被触发」。如果只是为了发一条指令让电脑主动出站比暴露端口到公网安全得多。5. Agent 的权限提示怎么处理远程运行时建议先在本地把常用操作跑一遍让 Agent 记住权限选择或者给 bot_core 配置一个固定的允许列表。不要每次远程任务都弹权限确认否则体验会崩。八、总结这套方案的核心不是「怎么从外面控制电脑」而是「怎么让电脑主动建立出站连接来接任务」。它的价值在于无需公网 IP 或内网穿透不引入第二套 Agent 框架复用已有的 bot_core Agent lark-cli 工具链通勤、外出时也能把短任务发出去回来直接看结果如果你也在用本地 Agent 做工作流不妨先问问自己我真的需要让外部连进电脑吗与其研究怎么让外部连入电脑不如让电脑主动建立出站连接。我是 RestartHuaC 老兵现在用 Python 和 AI 做工具、写文章。