2.8 KiB
2.8 KiB
WeChat 消息自动点击器
自动点击微信桌面端未读消息中的图片和文件,触发原始文件下载到本地目录。
项目背景
配合另一个信息收集项目使用:信息收集脚本负责将微信消息入库,但图片和文件需要被点击预览后微信才会下载原始文件到本地。本工具自动完成这个"点击"操作。
技术架构
- 语言: Python 3.11+
- 核心技术: macOS Accessibility API (AXUIElement) via pyobjc
- 目标应用: 微信桌面端 v4.1.9+ (bundle ID: com.tencent.xinWeChat)
- 运行平台: macOS Sonoma 14+
模块结构
wechat_clicker/
├── ax_bridge.py # AXUIElement 底层封装(属性读取、鼠标点击、键盘事件、滚动)
├── wechat_ui.py # 微信 UI 导航(聊天列表、消息列表、预览界面元素查找)
├── state_machine.py # UI 状态机(窗口状态检测、恢复、Preview.app 管理)
├── automator.py # 主自动化逻辑(扫描→进入聊天→滚动→点击图片/文件→循环)
├── human_like.py # 拟人行为(高斯分布延迟、长休息、工作时间)
├── config.py # YAML 配置加载
└── logger_setup.py # 日志配置
关键设计决策
- 微信 v4.1.9 点击聊天会打开独立窗口(非页内导航),状态检测基于窗口计数
- 聊天列表项为 AXStaticText(无 AXPress),使用 CGEvent 鼠标坐标点击
- AXValue 位置/尺寸需用 AXValueGetValue 解包 CGPoint/CGSize
- 消息类型通过 title 内容判断:
"图片"→ 图片,"文件\n..."→ 文件 - 图片处理:点击缩略图 → 点击"..." → 点击"使用预览打开" → 关闭 Preview.app
- 文件处理:直接点击触发下载
- 进入聊天后先滚到底部(最新消息),再向上滚动 5 轮加载历史消息
- 滚动使用 kCGEventMouseMoved + ScrollWheel(不触发点击),避免误点 UI 元素
- "..."按钮搜索限制在预览区域(独立窗口或主窗口 x>200),排除侧边栏
使用方法
# 前置条件
pip install -r requirements.txt
# 系统设置 > 隐私与安全 > 辅助功能 → 添加终端/Python
# 复制配置
cp config.example.yaml config.yaml
# 运行
python main.py # 持续运行
python main.py --once # 单次扫描
python main.py --dry-run # 只扫描不点击
python main.py --dump-ui # 输出 UI 元素树
python main.py --debug # 详细日志
配置重点
config.yaml中可设置扫描间隔、延迟范围、白/黑名单、工作时间、媒体类型开关- 默认不处理视频(
media.click_videos: false) - 默认黑名单包含微信系统账号
注意事项
- 微信窗口需要保持可见(不能最小化)
- 运行时会占用微信前台操作
- 建议在专用电脑上运行