一句话定位
把微信变成你 PC 的远程控制台 + 智能入口 —— 出门用手机发消息,本地 AI 决定"直接回 / 调插件 / 操控电脑 / 改博客"。
核心功能
| 能力 | 体现 |
|---|---|
| 📨 微信收发 | 文本/图片/文件/语音/视频,CDN + AES-128 解密 |
| 🤖 本地 AI 路由 | unified_chat 一次调用判断意图 + 回复,不双跳 |
| 🧩 插件系统 | 14 个插件分被动/命令/自动三类,丢 .py 进 plugins/ 自动加载 |
| 🛡️ 安全监控 | watchdog 24h 扫外联 IP + 进程;rdp_bruteforce 看爆破 |
| 📊 数据查询 | 股市、汇率、天气、GPU、号码、文件搜索 |
| 📅 自动化 | 每日总结、早报、收盘播报、定时任务 |
| 📝 博客编辑 | /blog <需求> 直转 Claude Code,自动 pull → 改 → push,出门也能写 |
设计思路(5 条核心原则)
1. 微信 = 入口,不是核心
整套架构里微信 iLink API 是最薄的一层(client.py 一千多行搞完收发)。所有"值钱"的能力(AI、插件、安全)都和微信解耦 —— 哪天想换 Telegram/钉钉,改 200 行就够了。
2. AI 路由"一次到位"
老设计是 classify_intent → 调插件(两次 AI 调用)。新版 unified_chat 一次返回,AI 自己决定:
- 直接回(闲聊、能力询问)
- 带
[TOOL:xxx]标记(明确请求) - 复用历史(同主题缩窄追问 / 回忆)
省了一次往返,体感快一倍。
3. 插件声明式 + 热加载
- 插件只继承
PluginBase,不用注册到任何中心 poller每 30s 扫plugins/,新增自动import + register- 每个插件声明
freshness_seconds(数据时效),历史里过期回复自动打[stale]标记,AI 看到会主动重跑而不是引用旧数据 - 三个钩子:
on_start/on_interval/on_message|on_query
4. Bridge 模式解耦
bridge.py单例观察者中心poller后台线程和customtkinterGUI 不直接通信- 五个信号:
message_received/message_sent/log/plugin_update/polling_status - 换 GUI 框架(Qt/Web)只要重写监听器
5. 本地优先 + 训练就绪
- 账号 JSON 存
~/.openclaw/openclaw-weixin/ - 聊天记录
chat_logs/chat_YYYY-MM-DD.json,OpenAI Chat Completions 兼容格式,图片消息保留多模态结构 - 任何下游训练/分析工具直接能吃
- AI 走 MiniMax(Anthropic 兼容协议),不绑死云厂商
一张图说清数据流
微信消息
↓ get_updates (长轮询)
worker/poller ←——— hot-reload 每 30s
↓
统一判断:
- "/" 命令? → 插件
- 其他 → unified_chat
↓
[TOOL:xxx]? → 对应插件
无标记 → 直接回复
↓
send_message → 微信 API → 用户
↓
log_message → chat_logs/*.json (训练用)
特殊分支:`/blog ...` → blog_editor 插件
↓
subprocess 拉起 `claude -p <需求>`
↓
Claude Code 在 plugins/blog/ 目录里:
pull 远端 → 读 README → 改 notes.json → 自检 → push
↓
stdout 流回微信,用户手机上看完整过程
适用场景
我自己 (owner) 日常用得最多的:
/screenshot— 看电脑屏幕(远程办公)/ps//kill//shutdown— 控进程/file xxx— 搜文件发到手机- 问"今天热不热"/"纳指多少" —— 自然语言直答
/blog 加一篇关于 X 的文章— 出门在手机上写博客,回家看上线/blog 把第二篇的核心功能表更新一下— 随手改老文章- 每天 0 点自动安全巡检、20 点自动聊天总结
微信编辑博客:把 AI 写手装进口袋
这是后来新加的场景 —— 之前博客只能在 opencode Web 里改,
现在从微信发一句/blog ...,Claude Code 自己接过去跑完整个流程。
它怎么工作
/blog <任意需求> 走 blog_editor.py 插件,干的事非常薄:
- 收到
/blog开头 → 截掉命令,得到原始需求字符串 - 在
plugins/blog/目录里subprocess.Popen起一个claude -p <需求> - Claude Code 自己读
README.md→ 知道blog.py pull/push怎么用 - pull 远端 → 改
notes.json→ 自检(JSON 合法 / LF 换行 / id 不冲突)→ push - 过程中所有 stdout 流回微信,我能在手机上看到完整 diff
这插件本体 100 行不到 —— 不构造 prompt、不读 README、不挡 Claude 输出,
相信 Claude Code 自己会处理。
典型对话
我(地铁上,微信):
/blog 加一篇博客,主题是"用 Claude Code 重构我司的内部 wiki",
category=ai, tags=[claude, wiki, refactor]
(几分钟后)
微信回:
[blog] 已 pull 远端 notes.json (21,980 字节)
[blog] 新增 id=5,标题「用 Claude Code 重构我司的内部 wiki」
[blog] 6 字段齐,JSON 合法,无 \r\n,id 唯一
[blog] 已 push 远端 (远端备份 .bak.20260612-201530)
[blog] 完成,刷新博客可见
(我继续补一句)
/blog 第二段的例子换成 docker 部署那个
(继续,几分钟后)
[blog] 已更新 id=5,改 1 处
[blog] push 完成
AI 路由兜底:不打 /blog 也能命中
blog_editor 同时挂了 on_query —— 就算我手滑说"帮我加篇博客",
AI 路由层也会把它送过来。不强制要求命令前缀。
跟 opencode Web 编辑对比
| 维度 | opencode Web | 微信 /blog |
|---|---|---|
| 设备 | 浏览器(桌面/平板) | 任意能装微信的设备 |
| 网络 | 要能访问 opencode Web | 只走微信 |
| 改什么 | 模板/样式/数据/代码全能 | 只针对 notes.json(博客内容) |
| 调试能力 | 强(terminal + 文件树) | 弱(只能看 stdout) |
| AI 协助 | 内联 | 独立 sub-process |
| 适合 | 大改、整站重构、调试 | 出门随手写、改个标题、补段文字 |
| 速度 | 改完浏览器刷新看 | 改完博客自动热重载 |
两个互补,不是取代。复杂改动走 Web,简单需求走微信。
安全护栏
/blog 给 Claude Code 的权限是 bypassPermissions —— 但目录锁死在 plugins/blog/,Claude 跑不出去。改个 notes.json 行,想改 ~/.ssh/ 是不可能的。
blog.py push 默认先在远端留 .bak.<ts>,改炸了手动回滚:
ssh myserver 'cp /opt/agent_pgsql/data/notes.json.bak.<ts> /opt/agent_pgsql/data/notes.json'
不适合的场景(坦诚说)
- ❌ 群聊管理(iLink API 对群支持弱)
- ❌ 高频消息(长轮询有 1s 间隔,撑不住 IM 量级)
- ❌ 多账号(架构只支持单账号)
- ❌ 改博客模板/CSS/JS ——
/blog只动notes.json,模板改动仍要走 opencode Web