wechat_msg_clicker/project.md
2026-04-23 12:22:37 +08:00

4.6 KiB
Raw Blame History

项目规划WeChat 消息自动点击器

项目目标

创建一个长期稳定运行的自动化工具,自动点击微信桌面端中未读消息的图片和文件,触发微信下载原始文件到本地目录,配合信息收集系统完成数据入库流程。

项目状态

已完成 (v0.1.0 - 2026/04/22)

  • 项目结构搭建
  • 配置系统YAML 配置文件、默认值、白/黑名单)
  • AXUIElement 底层封装ax_bridge.py
  • 微信 UI 导航wechat_ui.py— 聊天列表解析、消息类型分类
  • UI 状态机state_machine.py— 基于窗口计数的状态检测与恢复
  • 拟人行为引擎human_like.py— 高斯分布延迟、长休息、工作时间
  • 主自动化逻辑automator.py— 完整扫描-点击-关闭循环
  • 入口脚本main.py— 参数解析、信号处理
  • 调试工具(--dump-ui, --dry-run

v0.2.0 修复与增强 (2026/04/22)

  • 修复: 聊天项点击失败 — AXStaticText 无 AXPress 动作,改用 CGEvent 鼠标坐标点击
  • 修复: AXValue 位置解包 — get_position/get_size 改用 AXValueGetValue 正确提取 CGPoint/CGSize
  • 新增: 消息列表滚动 — 进入聊天后向上滚动 5 轮,加载更多历史媒体消息
  • 新增: 图片"使用预览打开"流程 — 点击大图 → 点"..." → "使用预览打开" → 关闭 Preview.app确保原始文件保存到本地
  • 新增: 文件直接点击下载 — 点击文件气泡触发微信下载
  • 新增: Preview.app 管理 — state_machine 添加检测与关闭 macOS Preview.app 的能力
  • 新增: 鼠标双击、滚轮滚动 — ax_bridge 扩展 CGEvent 操作

v0.3.0 修复与调试增强 (2026/04/23)

  • 修复: 滚动误点击_scroll_at() 原先用 mouseDown/mouseUp 聚焦导致误点侧边栏按钮,改用 kCGEventMouseMoved 仅移动鼠标不触发点击
  • 修复: 未跳转最新消息 — 进入聊天后先 scroll_to_bottom() 滚到消息列表底部(最新消息),再向上滚动加载历史
  • 修复: "..."按钮误匹配_find_more_button_in_preview() 限制搜索范围,主窗口中只搜索 x>200 区域(排除左侧侧边栏),增加位置日志
  • 增强: 全链路调试日志 — click_at_element 记录坐标/角色/标题get_media_messages 输出每个媒体详情find_menu_item 记录搜索过程,状态检测记录所有窗口标题

待验证

  • 验证 CGEvent 鼠标点击能否正确打开聊天会话
  • 验证 scroll_to_bottom 是否能到达最新消息
  • 验证图片预览中"..."按钮和"使用预览打开"菜单项的查找
  • 验证滚动不再触发误点击
  • 验证消息列表滚动能否加载历史消息
  • 验证 Preview.app 的检测与关闭
  • 长时间运行稳定性测试

未来可能的改进

  • 聊天列表滚动支持(处理不在可见区域的聊天)
  • 已处理消息去重(记录已点击的媒体,避免重复)
  • 微信版本适配(检测 UI 结构变化并自动调整)
  • 运行状态 Web 面板(远程监控)
  • 与信息收集系统直接集成

技术细节

微信 UI 结构 (v4.1.9)

  • 主窗口 "微信" 包含侧边栏 + 聊天列表
  • 聊天列表:AXList name="会话",子元素为 AXStaticText(无 AXPress 动作)
  • 聊天项 AXIdentifier 格式:session_item_聊天名
  • AXStaticText 的 AXPosition/AXSize 需通过 AXValueGetValue 解包
  • 点击聊天项打开独立会话窗口
  • 消息列表:AXList name="消息"
  • 图片消息 title = "图片",文件消息 title 以 "文件\n" 开头

点击策略

  • 聊天项和消息元素均使用 CGEvent 鼠标坐标点击AXStaticText 不支持 AXPress
  • 计算元素中心坐标 = position + size/2
  • 图片预览中的按钮优先尝试 click_at_element后备 AXPress

图片下载流程

  1. 点击图片缩略图 → 打开大图预览(微信内窗口)
  2. 在预览窗口找到 "..." (更多) 按钮并点击
  3. 在弹出菜单中找到 "使用'预览'打开" 并点击
  4. 等待 macOS Preview.app 打开(此时原始文件已保存到本地)
  5. 关闭 Preview.app 窗口
  6. 回到微信,关闭大图预览

防封策略

  • 高斯分布随机延迟(非均匀)
  • ±20% 扫描间隔抖动
  • 5% 概率长休息30-120 秒)
  • 工作时间限制
  • 每次最多 5 个聊天

依赖

  • pyobjc-framework-Quartz
  • pyobjc-framework-ApplicationServices
  • pyobjc-framework-Cocoa
  • PyYAML

系统要求

  • macOS Sonoma 14+
  • Python 3.11+
  • 辅助功能权限(终端/Python 需要授权)
  • 微信桌面端 v4.1.9+