微信群聊 AI 助手 —— 直读微信加密数据库 + 键盘模拟发送,支持 Windows 微信 4.x。
本项目仅供学习交流和个人娱乐使用。
严禁将本项目用于任何违法违规行为,包括但不限于:发送垃圾信息、骚扰他人、诈骗钓鱼、传播虚假信息、侵犯他人隐私、干扰网络秩序等。
使用者应遵守所在地法律法规及微信用户协议,自行承担使用本项目的一切后果与风险。项目作者不对任何滥用行为负责。
webot 是一个运行在 Windows 上的微信群聊机器人。把它加入你的群聊,它会:
- 帮你总结错过的消息 —— 对群里说一句「总结一下」,立刻告诉你前面聊了什么,按话题分类、附关键人物和时间线。
- 回应你的提问 —— @机器人 问任何问题,它会结合群聊上下文和联网搜索来回答。
- 自然参与群聊 —— 感知聊天节奏,在合适的时候自动插话、接梗、吐槽,像个普通群友。
内置 Web 仪表盘(React + Tailwind CSS),实时查看运行状态、处理消息量、AI 延迟。内置暗色/亮色双主题,配置导入导出。可打包为单个 EXE,双击即用。
发送以下关键词即可触发总结:总结一下、前面说了什么、聊天总结、说了啥、发生了什么、summarize 等(可在仪表盘自定义)。
机器人会自动找到你上一条消息的位置,把之后所有群聊内容交给 AI,生成一份结构化摘要:谁说了什么、讨论了哪些话题、有什么决定和趣事。
对话特别长(999+ 条消息)时,会自动分块处理,不会超出 AI 的上下文限制。支持在仪表盘一键开关总结功能、调整回溯时长(1-72 小时)、增删触发关键词。
在群里 @机器人 + 你的问题,即可获得 AI 回复。机器人会:
- 自动附上最近 10 分钟的群聊记录作为上下文,让回答更贴合当前话题。
- 支持 Claude 和 DeepSeek 两种 AI 后端,随时切换。
- 自定义 API 地址:DeepSeek 和 Claude 都支持配置 Base URL,可使用代理、第三方 API 或私有部署。
内置 Prompt Sandbox,无需在真实群里发消息即可测试 AI 回复效果。支持自定义模拟发送人、群聊名称、长期群聊记忆,所见即所得的测试 AI 的表现和延迟。
开启后,机器人会根据群聊消息速率自动判断氛围,在合适的时候插话:
| 模式 | 触发条件(条/分钟) | 行为 |
|---|---|---|
| 😴 沉睡 | < 1.5 | 完全沉默 |
| 🌙 冷清 | 1.5 ~ 4.0 | 偶尔参与,保持克制 |
| 💬 闲聊 | 4.0 ~ 6.5 | 正常聊天节奏 |
| 🔥 热闹 | 6.5 ~ 8.5 | 活跃参与 |
| 💥 炸了 | > 8.5 | 高频插话,极短回复 |
AI 连续多次判断"不应该插话"时,会自动延长沉默时间(最高 16 倍),避免浪费 API 调用。遇到群友讨论重大负面事件(疾病、事故、吵架等),机器人会主动保持沉默。
机器人会自动记录群聊中的重要信息,形成对群的"印象日记":群友的特点习惯、群里的固定梗、聊天氛围等。越聊越懂这个群。
发了 @机器人 但忘了打字?没关系,60 秒内发的下一条消息会自动当作 @了机器人。
群友的微信号(wxid_xxx)自动替换为显示名。你也可以手动给群友设昵称(见下方管理命令)。群名也会自动持久化,下拉框显示人类可读的群名称(如「摸鱼群」)而非 chat_id。
对机器人说「抽签」,随机抽取一支运势签(大吉~凶,5 档加权),附带幽默解读。
仪表盘支持一键导出当前配置为 JSON 文件,也可以通过上传 JSON 备份恢复配置。方便迁移、分享配置、多环境切换。
机器人启动后自动打开 http://127.0.0.1:7327,包含五大模块:
- Dashboard 运行看板:实时指标卡片(已处理消息、运行时长、API 延迟)、SVG 动态波形图、一键诊断(Python 环境 / 依赖 / 微信进程 / DLL 文件 / 数据库连接)
- 系统配置:在线修改 AI 后端、API Key、机器人身份、功能开关、触发关键词等
- 提示词沙箱:模拟群聊场景测试 AI 回复,支持自定义上下文变量
- 群友昵称:管理群友的显示名称映射
- 运行日志:实时查看、按级别筛选(DEBUG/INFO/WARNING/ERROR)、关键词搜索高亮
- Windows:微信 4.x(DRM 补丁偏移
0x6e1f6,微信更新后可能失效) - macOS:实验性支持(
mac_hybrid/mac_ui,WeFlow WCDB 直读 + 辅助功能发送)
微信版本更新后,DRM 补丁偏移可能变化。如遇数据库无法打开,可通过环境变量覆盖:
WCDB_PATCH_RVA=0x6e1f6 # 16 进制,补丁地址的相对虚拟地址
WCDB_PATCH_BYTE=0x02 # 16 进制,补丁前该位置的期望字节值- Windows 10 或 11
- 微信桌面版 已登录
- 希望机器人监控的群聊需手动添加到通讯录:打开群聊 → 点击右上角
···→ 开启「添加到通讯录」。未添加的群聊无法通过搜索名称进入,机器人将无法回复 - Python 3.10+(仅源码运行需要,用 EXE 则不需要)
从 Releases 下载 webot.exe,双击运行。
首次运行弹出配置向导,按提示完成四步即可开始使用:密钥提取 → 机器人身份 → AI 后端 → 功能开关。
Windows:
git clone https://github.com/cancelGuMu/webot.git
cd webot
pip install -r requirements.txt
python desktop.pymacOS 实验版:
git clone https://github.com/cancelGuMu/webot.git
cd webot
python3.12 -m venv .venv
source .venv/bin/activate
pip install -r requirements-macos.txt
cd ui && npm install && npm run build && cd ..
python desktop_mac.pymacOS 路径会使用独立的 .env.macos,默认设置 WECHAT_BACKEND=mac_hybrid,不会覆盖 Windows 使用的 .env。mac_hybrid 内置 WeFlow 的 WCDB 读取链路,直接按稳定的 @chatroom id 读取 macOS 微信数据库,并从 contact 表解析群名,再通过辅助功能发送消息;mac_ui 仍可作为只走界面自动化的兜底模式。
macOS 读消息前需要保证当前微信账号目录中存在 all_keys.json:
# 1. 确认微信已登录,SIP 已关闭;首次提取 key 需要管理员权限
python3 tools/macos_weflow_setup.py diagnose
# 2. 提取当前账号的 all_keys.json(会触发 sudo 密码输入,不会打印 key 明文)
python3 tools/macos_weflow_setup.py extract-keys
# 如果 Mach 扫描没有匹配到 key,可直接走 lldb 内存扫描
python3 tools/macos_weflow_setup.py extract-keys-lldb
# 如果 lldb hex 扫描也没有 key,说明当前 WeChat 可能不保留 x'...' 形式;
# 用 AES hook 模式,并在命令等待期间打开几个有历史消息的聊天。
# 最稳的做法是在 WeChat 刚启动后运行该命令。
python3 tools/macos_weflow_setup.py extract-keys-hook
# 也可以让脚本重启 WeChat 后立刻挂 AES hook,并自动打开“文件传输助手”触发数据库读取;
# 成功提取后会写入 all_keys.json。
python3 tools/macos_weflow_setup.py extract-keys-restart-hook --yes
# 如需指定触发读取的聊天,可重复传 --open-chat:
python3 tools/macos_weflow_setup.py extract-keys-restart-hook --yes --open-chat "文件传输助手" --open-chat "群聊名"
# 如果你已用 wechat-db-decrypt-macos 得到 wechat_keys.json,可导入为 all_keys.json
python3 tools/macos_weflow_setup.py import-keys --keys-file /path/to/wechat_keys.json
# 3. 再次确认 valid_key_entries > 0;open_db_files 用于判断微信是否已加载数据库
python3 tools/macos_weflow_setup.py diagnose正常启动 webot 时不需要再单独运行任何消息读取服务。源码启动
python desktop_mac.py 或打包后的 webot.app 都会在同一个进程内加载
resources/wcdb/macos/universal/libWCDB.dylib 读取本地数据库。
.env.macos 中可显式配置:
WECHAT_BACKEND=mac_hybrid
# 如果自动检测账号目录不准,可指定到包含 db_storage 的 wxid_* 目录
MAC_WEFLOW_DATA_DIR=/Users/you/Library/Containers/com.tencent.xinWeChat/Data/Documents/xwechat_files/wxid_xxx
MAC_WECHAT_SEND_SHORTCUT=enter首次发送消息时,需要在系统设置中给终端或 Python 授权“辅助功能”权限。
如果 extract-keys 返回 scan failed code=-2,说明当前终端没有权限读取
WeChat 进程内存。请确认 SIP 已关闭,并在命令提示时输入本机管理员密码;
Codex/脚本不会也不能代输这个密码。
如果 diagnose 中 open_db_files=0,请先打开微信里任意几个有历史记录的会话,
再重新提取 key;WeChat 4.1.x 会 lazy-open 数据库,刚启动时内存里可能还没有
对应 key。若 open_db_files>0 但 lldb hex 扫描仍为 0,可使用
extract-keys-hook,它会在 AES key schedule 处捕获 raw key 候选并校验后写入
all_keys.json。如果手动 hook 仍然没有 hook_hits,用
extract-keys-restart-hook --yes 让脚本先重启 WeChat 再立刻挂 hook;不加
--yes 时脚本会拒绝重启,避免误关未发送的内容。WeChat 重启或更新后,通常需要
重新执行 key 提取。
参考实现: honker233/WeFlow、 wechat-db-decrypt-macos、 macOS 微信自动化调研。
所有配置在项目根目录的 .env 文件中设置。首次运行会自动创建模板。大部分配置也可以在仪表盘中在线修改。
# AI 后端:deepseek 或 claude
AI_BACKEND=deepseek
# DeepSeek API Key(AI_BACKEND=deepseek 时必填)
# 免费注册获取:https://platform.deepseek.com/api_keys
DEEPSEEK_API_KEY=sk-xxxxxxxxxxxxxxxx
# Claude API Key(AI_BACKEND=claude 时必填)
ANTHROPIC_API_KEY=sk-ant-xxxxxxxxxxxxx# DeepSeek 自定义 API 地址(可选,默认官方地址)
# 可用于 OpenAI-compatible 代理转发、第三方 API、私有部署
DEEPSEEK_BASE_URL=https://api.deepseek.com
# DeepSeek 模型
DEEPSEEK_MODEL=deepseek-v4-flash # v4-flash(推荐):极速低价
# v4-pro:1M 上下文旗舰
# Claude 自定义 API 地址(可选,默认官方地址)
# 可用于 Anthropic-compatible 代理转发、第三方 API、私有部署
ANTHROPIC_BASE_URL=https://api.anthropic.com
# Claude 模型
SUMMARIZE_MODEL=claude-haiku-4-5-20251001 # haiku(推荐):快速廉价
# sonnet:更高质量# 机器人在群里的显示名(用于 @ 检测,填你给机器人设的群昵称)
BOT_DISPLAY_NAME=群聊小助手
# 监控的群聊,逗号分隔多个群。留空或填 * = 监控所有群
WECHAT_GROUPS=
# 管理员 wxid(可执行管理命令,在聊天记录中查看发消息的人就是 wxid)
ADMIN_WXID=# 是否启用总结功能(true/false,也可在仪表盘一键开关)
SUMMARIZE_ENABLED=true
# 兜底总结窗口(小时),找不到请求者的上一条消息时,向前看多少小时
FALLBACK_WINDOW_HOURS=8
# 触发关键词(逗号分隔,不区分大小写,可在仪表盘在线增删)
TRIGGER_KEYWORDS=总结一下,之前发了什么,错过了什么,summarize,what did i miss,聊天总结,帮我总结,前面说了什么,说了啥,发生了什么# 主动发言(机器人在没人 @ 它时也会自动插话)
PROACTIVE_ENABLED=false # true=开启 false=关闭
# 趣味抽签(@机器人说"抽签",返回运势签文)
FUN_ENABLED=true # true=开启 false=关闭
# 粘性提及(空 @ 后下一句话自动算 @)
STICKY_MENTION_ENABLED=true # true=开启 false=关闭以下参数仅在 PROACTIVE_ENABLED=true 时生效:
# 速率计算窗口(秒),用多长的时间窗口来判断群聊节奏
PROACTIVE_RATE_WINDOW_SEC=120
# 各模式的速率阈值(条/分钟),必须从小到大严格递增
PROACTIVE_RATE_QUIET=1.5 # 超过此值 → 冷清模式
PROACTIVE_RATE_CASUAL=4.0 # 超过此值 → 闲聊模式
PROACTIVE_RATE_LIVELY=6.5 # 超过此值 → 热闹模式
PROACTIVE_RATE_BURST=8.5 # 超过此值 → 炸了模式不同群的聊天节奏差异很大,建议先用 python tools/analyze_chat_rhythm.py 分析群聊数据再调。
# 消息轮询间隔(秒),默认 1.0。增大可降低 CPU,但消息响应会变慢
POLL_INTERVAL_SEC=1.0
# 去重窗口(秒),同一群聊两次触发之间的最小间隔
DEDUP_WINDOW_SEC=60
# 总结时最多取多少条消息(适用群聊 999+ 的场景)
MAX_MESSAGES_FOR_SUMMARY=5000
# Map-Reduce 分块大小(每条消息约 3~4 字的中文文本)
CHUNK_SIZE=400LOG_LEVEL=INFO # DEBUG / INFO / WARNING / ERROR
LOG_FILE=data/bot.log # 留空则只输出到控制台在群里发送 @机器人 <命令> 即可(仅 ADMIN_WXID 设定的管理员可用):
| 命令 | 说明 | 示例 |
|---|---|---|
改名 wxid = 昵称 |
给群友设昵称 | 改名 wxid_abc = 张三 |
删除昵称 wxid |
删除已设昵称 | 删除昵称 wxid_abc |
刷新昵称 |
重新加载昵称缓存 | |
帮助 / help |
查看全部命令 |
项目包含完整的测试套件:
# 单元测试(37 个测试用例)
python -m pytest tests/test_trigger.py tests/test_config.py -v
# 全量测试(241 个测试用例,包含 Web API)
python -m pytest tests/ -v
# E2E 功能测试(需 Playwright + Chromium)
python tests/test_functional.py测试覆盖:配置加载、触发词检测、Web API 端点、WebSocket、前端浏览器自动化、消息路由、密钥提取。
首次使用需要安装什么?
什么都不用装。下载 EXE 双击即可。所有需要的 DLL 文件已内置在程序中,密钥提取由程序自动完成。唯一前提是电脑上已登录微信。
会被封号吗?
webot 通过以下方式工作:
- 密钥提取:使用
wx_key.dll注入微信进程,在内存中捕获数据库解密密钥(仅首次配置时需要,之后密钥持久化到.env)。 - 消息读取:通过
wcdb_api.dll配合 DRM 内存补丁,直接解密并读取微信本地的session.db。 - 消息发送:通过 Win32
keybd_event键盘模拟操作微信窗口(Ctrl+F 搜索 → Ctrl+V 粘贴 → Enter 发送)。
支持哪些 AI 模型?费用如何?
- DeepSeek V4 Flash(推荐):极速极低价,约 ¥0.001/千 tokens。普通群一天的总结费用通常不到 ¥0.10。
- DeepSeek V4 Pro:1M 上下文旗舰,稍贵。
- Claude Haiku 4.5:快速廉价,适合总结和简单对话。
- Claude Sonnet 4.6:更高质量,适合复杂分析。
切换模型只需改 .env 中的 AI_BACKEND 和对应 Model 配置,或直接在仪表盘的配置面板里修改。支持自定义 DeepSeek API 地址,可用于代理转发或私有部署。
微信窗口可以最小化吗?
消息读取不受影响。但消息发送需要微信窗口可见——发送时会自动尝试激活微信窗口。建议保持微信窗口打开状态(可以放在其他虚拟桌面)。
支持 macOS 吗?
Windows 仍是正式推荐平台。macOS 推荐实验性的 WECHAT_BACKEND=mac_hybrid 路径:通过内置 WeFlow WCDB 读取链路直读本地微信数据库,发送消息时再通过辅助功能操作微信窗口。它需要当前微信账号目录中存在 all_keys.json,不需要额外启动消息读取服务。WECHAT_BACKEND=mac_ui 仍保留为界面自动化兜底,但不适合稳定读取聊天消息。
支持多个群聊吗?
支持。在 WECHAT_GROUPS 中填入群聊名称(逗号分隔),留空或填 * 则自动监控所有群。
机器人会漏消息吗?
默认每秒轮询一次,每次拉取每个群最近 50 条消息,正常群聊节奏下不会漏。如果担心遗漏,可减小 POLL_INTERVAL_SEC。
如何停止机器人?
在仪表盘点击停止按钮,或在终端按 Ctrl+C。
MIT © cancelGuMu
Made with ❤️ by 孤舟99