在 Windows 上,通过本地 UI Automation 观察微信新消息,用 Codex CLI 生成回复草稿,并由活动中的 Codex 会话通过 Windows MCP 操作微信 GUI。
不接入微信消息 API,不读取微信私有数据库。模型只在指定联系人有新来信时调用;每2秒的窗口检查在本地执行,不调用模型。
这是脱敏的 Codex 框架。仓库不包含联系人、聊天记录、头像、截图、账户设置或本机路径。监听器本身不会点击、输入或发送,GUI发送需要一个活动中的 Codex 会话及用户对联系人和时间范围的明确授权;仓库没有独立的无人值守发送服务。
flowchart LR
A[微信界面] --> B[本地只读监听]
B --> C[对方新消息 / 最近20条上下文]
C --> D[Codex CLI]
D --> E[结构化草稿]
E --> F[Codex会话核对界面和授权]
F --> G[Windows MCP操作GUI]
- Windows、Python 3.10+、桌面微信。
- 已安装并登录的 Codex CLI;需支持
exec --ephemeral --ignore-user-config --ignore-rules --output-schema,可运行codex exec --help检查。本框架通过已有登录状态调用,不保存账号或密钥。 - 在负责发送的 Codex 会话中安装 Windows MCP。Python监听器使用
windows-mcp的 UIA 包;GUI输入由会话调用 Windows MCP 工具,二者职责不同。 - 当前Reader适配旧版微信的Qt消息列表;其他版本需调整
Reader.find()的AutomationId及头像位置。
python -m pip install -r requirements.txt
Copy-Item config.example.json config.json
Copy-Item style.example.md style.md
New-Item -ItemType Directory -Force .runtime在本地config.json中填写 contact 为准确的联系人备注名;codex 默认从PATH查找,也可填自己的CLI路径;model 留空使用CLI默认值,或填账户可用的模型。
自行从微信界面截取自己的头像,保存为本地36×36 PNG .runtime/self.png,或在 self_avatar 指定本地文件。不要将头像上传Git。自己的头像模板在启动时载入;换头像后重启。对方头像从当前对话左侧自动校准,只保存在内存里。不确定的识别结果跳过。
自定义语气放在本地style.md,默认模板仅规定自然简短、不编造事实;不会套用任何个人聊天风格。
让微信在前台、打开目标单聊并停在消息底部:
python listener.py --probe
python listener.py
# 或后台启动(Python可指定虚拟环境中的pythonw路径)
./start.ps1 -Python pythonw
./stop.ps1
# 动态修改目标
./set-contact.ps1 -Name '目标联系人备注名'--probe只读检查,不调用模型;输出包含本地聊天内容,请勿公开粘贴。--until可指定本地ISO截止时间,后台脚本对应 -Until 参数。截止时间只限制本地监听,不会授予任何发送权限。
本地生成文件全部在 .runtime/:status.json、latest-ready.json、latest-draft.md以及每次调用的job目录。它们含私人聊天数据,已被.gitignore排除,分享前仍应检查实际文件列表。
- 启动时只建立基线,不回复已有历史。
- 自发消息、未知发送者和系统消息不触发;同样文字的两条新消息以UIA消息ID区分。
- 连续来信等待3秒合并;生成前重新读取,取最近最多20条上下文。
- 自己已回复、新来信、切换联系人、翻历史或暂停,使旧草稿失效。
- 读到错误、头像不明确、窗口被切换时暂停。恢复重新基线,暂停期间的消息不会补触发。
参见 CODEX_GUI.md。由用户启动的活动Codex会话读取草稿,发送前必须重新读取微信最新界面,确认仍为授权联系人、最新来信未被用户自行回复且截止时间未到,再通过Windows MCP输入发送。表情从面板中识别真实项目后点击,不用固定坐标,也不把文字建议当成已发送。
模型生成调用使用只读沙箱,忽略用户配置和规则,并要求只输出JSON;这是拟稿进程,不是GUI发送进程。聊天数据不能成为工具操作指令。代码中的拟稿约束不能代替发送会话自己的权限约束。
当前需要微信在前台,切到其他窗口/联系人或翻历史会暂停;不保证全天候后台监听。头像匹配、隐藏滚动条贴底判断和AutomationId都与微信版本、DPI、主题有关。群聊不支持。媒体仅能读到图片、语音、动画表情等标签,不能猜内容。
测试只用合成消息和模拟CLI,不发送真实微信消息,也不调用付费模型:
python test_listener.py本框架保留最小监听和Codex拟稿路径;没有自动唤醒关闭的Codex会话、自动登录或重启微信的功能。依赖分别遵守各自许可证;本仓库源码使用MIT许可。