微信消息发送(纯桌面自动化 · 加固版)
适用场景
- 把一段现成文本发送到微信的某个联系人 / 群聊。
- 不负责数据怎么来、怎么排版——那是上游(数据采集 / 格式化)的事。本 skill 只管"打开微信 → 搜索导航到目标会话 → 发送"。
- 目标可以是群(如「项目协作群」)或单人联系人。
前置条件
- 微信桌面端已安装(自动探测:
D:\Weixin\Weixin.exe、微信常见安装目录、PATH);最好已登录(未登录会提示先登录)。可用--wechat-path显式指定。 - Python 环境含
pyautogui/pywin32/Pillow/pyperclip。 - OCR(用于定位/回读验证,强烈建议):由
ocr-local-v2skill 提供。 - Node 引擎自动探测:优先用 WorkBuddy 管理的
22.22.2,否则用PATH中的node。可用--node覆盖。 - 务必 Node 22.22.2:旧版本(如 22.12.0 的
NODE_OPTIONS=--use-system-ca)与 OCR 子进程不兼容,会静默exit 9、OCR 返回空,标题/内容验证全部失效。 - OCR 脚本自动探测兄弟 skill
ocr-local-v2/scripts/ocr.js;可用--ocr-script覆盖;node_modules由 node 路径推导,亦可用--node-modules覆盖。 - OCR 缺失时仍会发送,但无法可靠定位目标会话,仅当微信已停在目标会话时稳妥。
三步工作流(实测稳定)
① 打开/恢复微信
- find_main_window(include_hidden=True) 找主窗口(宽>500 且高>400)。
- ⚠️ 微信 4.0 的 Alt+F4 只是把主窗口「隐藏到托盘」,进程和登录态仍在。因此必须枚举隐藏窗口,发现后 ShowWindow(SW_RESTORE/SW_SHOW) 自动恢复——否则会漏检已登录的隐藏窗口,误判"未登录"去点不存在的登录窗,永远点不出。
- 无任何微信窗口 → 启动 Weixin.exe 等待;只找到登录窗(窄窗)→ 先尝试点击「进入微信」并等待(微信登录常需手机端确认授权),仍进不去再明确提示用户先登录后退出。
② 搜索导航到目标会话(关键,替代聊天列表扫描)
- 先 Esc 清理残留状态 → Ctrl+F 打开搜索 → 粘贴完整目标名。
- 逐行 OCR 扫描下拉结果(y 从 t+105 到 t+430,步长 36px),定位"群聊"分区的目标行:命中目标关键词 且 排除搜索建议噪声词(公司/招聘/管理处/公众号/搜一搜/订阅号/添加)。记录最后一个命中行(群聊分区在建议之后)并点击。
- ⚠️ 绝不盲按 Enter:下拉前几条是搜索建议(如"XX有限公司"),Enter 会打开「搜一搜」浏览器窗口,离开微信。必须扫描后点真正的群聊结果行。
- 标题栏 OCR 在微信 4.0 上不可靠(自绘 UI 乱码),不要用它判断是否已在目标会话。
③ 发送信息(带发送前复验)
- 点输入框(x=l+w*0.65, y=t+h*0.92)→ pyperclip.copy + Ctrl+V 粘贴(长中文勿用 typewrite,依赖输入法易乱码)。
- 发送前 OCR 输入框区域,确认消息内容已就位(命中消息头/尾片段);未命中(粘贴失败/在错聊)→ 立即清空并中止,绝不按 Enter。
- Enter 发送 → OCR 聊天区验证气泡出现。
关键避坑(务必遵守,均为真实踩坑)
- OCR 用 Node 22.22.2(见前置条件)。OCR 长期返回空 → 先用
--node指定 22.22.2 并核对版本。 - 微信4.0隐藏到托盘:登录检测必须
include_hidden=True并自动恢复,否则误判未登录。 - 标题 OCR 不可靠:微信4.0 标题栏乱码,不能据此判断是否已在目标会话,否则会误发到当前打开的错聊。改用搜索导航。
- Ctrl+F 盲 Enter 陷阱:下拉首条是搜索建议,Enter 会开搜一搜浏览器。必须逐行 OCR 扫描点群聊行。
- 发送前复验 + 中止:粘贴后先 OCR 输入框,未命中立即清空中止,避免错聊误发。
- 坐标从窗口矩形派生:
l/t/w/h来自GetWindowRect,只固化相对比例与少量固定点,不写死绝对坐标。 - 长消息粘贴发送:
pyperclip.copy+Ctrl+V,不要typewrite。 - 定时/自动化必开
--guard:同日向同一目标发送相同消息会被自动跳过(send_guard_state.json),防止重复触发导致群内重复刷屏。强制重发:删除该 state 文件。 - 登录窗需手机确认:若微信停在登录窗口(非隐藏主窗口),脚本会尝试点击「进入微信」并等待,但仍常需你在手机端确认登录授权;确认后仍进不去,请手动打开微信并停在目标会话再运行。脚本不会因此反复硬跑。
脚本用法
scripts/wechat_message_send.py(通用、参数化,路径全部自动探测):
# 从文件读取消息发给群(路径自动探测)
python wechat_message_send.py --target "目标群名" --file message.txt
# 直接发文本给联系人
python wechat_message_send.py --target "张三" --message "你好"
# 发完隐藏微信到托盘 + 开防重复守卫(定时任务推荐组合)
python wechat_message_send.py --target "群名" --file msg.txt --close --guard
# 显式指定本机专属路径(覆盖自动探测)
python wechat_message_send.py --target "群名" --file msg.txt \
--wechat-path "D:\Weixin\Weixin.exe" \
--node "C:\path\to\node22\node.exe" \
--ocr-script "C:\path\to\ocr.js" \
--node-modules "C:\path\to\node_modules"
参数:--target(必填) / --message / --file(二选一) / --close(隐藏到托盘) / --guard(同日防重复) / --wechat-path / --node / --ocr-script / --node-modules(均可选)。
成功标志
- 输出含
✓ 消息已发送并验证或RESULT: SUCCESS。 - 守卫跳过时输出
RESULT: SKIPPED - already sent today(属正常)。 - 失败:输出
[错误] 定位失败/[错误] 启动后仍未找到微信主窗口/⚠ 验证未通过等,按提示处理(多为未登录、OCR 缺失或目标名偏差)。