一句话定位
一个网页版的微信 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 版——因为浏览器哪都有。