一句话定位

一个网页版的微信 AI Bot 管理台——扫码绑定、启停 Bot、查聊天记录、插件市场,一个页面全搞定。

我把这几个月在折腾的微信 ClawBot 收拢成了一个私有 Web 版
代码开源在 GitHub:letmego2022/wechat_lite
线上实例就跑在这个站点的兄弟域 uiauto.flowtest.icu

跟之前那篇「把微信变成 PC 远程控制台」不同——那套是命令行 / GUI 绑在 PC 上,
这套是独立部署在服务器上的 Web 控制台,只要浏览器就能管。

它解决什么问题

之前的微信 Bot 要么跑在命令行里,要么依赖本地 GUI,
换个设备就管不了。这套「lite」版把它重构成一个 Web 应用:

  • 扫码即绑定——基于 iLink 协议,扫码一次凭证加密入库,重启不用重扫
  • AI 自动回复——对接 MiniMax / Anthropic 兼容 API,多轮上下文,消息即发即回
  • 插件市场——内置 6+ 插件,开关即用,支持「立即测试」预览输出
  • 主动推送——天气、股市、汇率、每日总结,Bot 按节奏自动发
  • 自动拉起——勾选后容器重启自动恢复 Bot,不用人工介入
  • 多用户隔离——凭证、聊天记录、插件配置各自独立

一句话:把 Bot 从「跑在我电脑上」变成「跑在服务器上,浏览器随时能管」。

部署到 uiauto.flowtest.icu

线上实例用的是 Docker 部署:

git clone https://github.com/letmego2022/wechat_lite.git
cd wechat_lite
cp .env.example .env
# 编辑 .env,填入 ANTHROPIC_API_KEY、WEB_SECRET_KEY
docker compose up -d --build
# docker-compose.yml 关键部分
services:
  web:
    build: .
    ports:
      - "8001:5000"
    volumes:
      - ./data:/app/data      # SQLite + 凭证持久化
      - ./plugins:/app/plugins # 插件目录挂载
    env_file: .env
    restart: unless-stopped

数据目录 ./data 挂载出来,SQLite、加密凭证都持久化,
容器重建不丢配置。域名那边 Nginx 反代一下,HTTPS 走标准证书。

内置插件一览

插件 分类 节奏 触发方式
🌧️ 天气预警 主动推送 每 3h 查一次,降雨推送 问「天气」
📈 股市早报 主动推送 每日 07:30 问「行情」
💱 汇率换算 信息查询 每日 8:00 推牌价 问「汇率」
📋 每日总结 主动推送 每日 20:00 发「总结」
🔗 链接摘要 工具类 发带链接的消息
🔍 联网搜索 AI 增强 发「搜索 xxx」

插件分「主动推送」和「即时查询」两类——前者按节奏跑 on_interval
后者命中 triggers 时走 on_query,都不命中就交给 AI 兜底。

怎么扩展一个插件

核心是继承 PluginBase,实现三个钩子:

from .base import PluginBase, PluginContext

class MyPlugin(PluginBase):
    name = "my_plugin"
    display_name = "我的插件"
    emoji = "🔔"
    categories = ["proactive"]
    triggers = ["触发词"]
    interval = 3600          # 每 3600 秒跑一次 on_interval
    config_schema = [
        {"key": "city", "label": "城市", "type": "text", "default": "上海"},
    ]

    def on_start(self, ctx: PluginContext):
        return "Bot 已启动!"

    def on_interval(self, ctx: PluginContext):
        return "这是一条周期推送消息"

    def on_query(self, text: str, ctx: PluginContext):
        return f"你问:{text}"
Hook         触发时机                返回值
--------------------------------------------------------
on_start     Bot 启动时执行一次      str 或 None
on_interval  按 interval 周期执行    str 或 None
on_query     命中 triggers 时        str 或 None
preview      插件市场「立即测试」    str 或 None
--------------------------------------------------------
返回 None = 本次不推送;返回 str = 推送到用户微信

写完丢进 plugins/ 重启服务,插件市场自动出现——声明式热加载,不用注册到任何中心。
这个设计和之前那套 PC 版是一致的思路。

一些值得记录的设计点

1. 凭证加密入库

token / account 加密存在 SQLite,不跟代码一起提交。
iLink token 有效期 24 小时,到期需要重新扫码——
这是协议侧的限制,也顺便保证了不会有一个「永久有效」的凭证躺在服务器上。

2. 多用户物理隔离

每个用户一套数据目录,凭证、聊天记录、插件配置互不可见。
虽然是「私有版」,但结构上已经能扛多租户。

3. 单 worker 跑 gunicorn

gunicorn -w 1——微信长轮询 + 每用户子进程 worker,多 worker 反而会乱。
这是 iLink 这类长连接协议的典型取舍。

4. AI 层可插拔

ANTHROPIC_BASE_URL 指向 MiniMax,MODEL_ID 换模型,
SDK 兼容就不改代码——跟整个站点的 AI 接入思路一致。

跟这个站点的关系

  • 它和博客是同一套世界观——第 2 篇的插件三钩子(on_start / on_interval / on_query),
    在这里原样落地成了 PluginBase 的生命周期
  • 它是第 6 篇「接地气」的又一实例——Bot 主动调天气 API、搜网页、拉行情,
    每一个插件都是一条连向真实世界的通道
  • 它的部署方式就是第 4 篇讲的那套——Docker + Nginx 反代 + 端口映射,
    只不过这次服务的是「人」,不是 LLM API

从 PC 到 Web,从命令行到浏览器——同一个 bot 生态,收拢成了一个页面。


// 越是私有的东西,越值得做成 Web 版——因为浏览器哪都有。