一句话定位

把微信变成你 PC 的远程控制台 + 智能入口 —— 出门用手机发消息,本地 AI 决定"直接回 / 调插件 / 操控电脑 / 改博客"。

核心功能

能力 体现
📨 微信收发 文本/图片/文件/语音/视频,CDN + AES-128 解密
🤖 本地 AI 路由 unified_chat 一次调用判断意图 + 回复,不双跳
🧩 插件系统 14 个插件分被动/命令/自动三类,丢 .pyplugins/ 自动加载
🛡️ 安全监控 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 后台线程和 customtkinter GUI 不直接通信
  • 五个信号: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 插件,干的事非常薄:

  1. 收到 /blog 开头 → 截掉命令,得到原始需求字符串
  2. plugins/blog/ 目录里 subprocess.Popen 起一个 claude -p <需求>
  3. Claude Code 自己读 README.md → 知道 blog.py pull/push 怎么用
  4. pull 远端 → 改 notes.json → 自检(JSON 合法 / LF 换行 / id 不冲突)→ push
  5. 过程中所有 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