核心用法
该技能提供了一套分层的 macOS 桌面自动化控制方案,将语义控制与视觉控制明确分离:
应用与窗口层(AppleScript):通过 applescript_app.py 和 applescript_window.py 实现应用激活、启动检测、前台应用识别、窗口标题读取与计数等功能。这部分依赖 macOS 原生的 AppleScript 支持,适合获取稳定的系统级状态信息。
视觉控制层(Screenshot + OCR/OpenCV + PyAutoGUI):
1. 坐标映射初始化:针对 Retina 显示屏的像素/点坐标差异,通过 init_coordinate_mapping.py 建立换算关系,结果持久化至 /tmp/macos_desktop_control/calibration.json
2. 屏幕捕获:capture_screen.py 输出逻辑坐标系截图,与 PyAutoGUI 的坐标系统保持一致
3. 目标定位:支持 Apple Vision OCR 文本定位(locate_text_ocr.py)和 OpenCV 模板匹配(locate_image_opencv.py)
4. 区域裁剪:crop_image.py 可从截图中提取指定矩形区域
5. 鼠标控制:mouse.py 支持移动、单击、双击、右击、拖拽等操作,支持从定位脚本管道接收坐标
6. 键盘控制:keyboard.py 默认使用剪贴板粘贴(规避输入法问题),支持单键、组合键、按键保持/释放
典型工作流:激活应用 → 读取窗口状态 → 初始化坐标映射 → 截图 → OCR/图像定位 → 鼠标点击 → 键盘输入 → 结果验证
显著优点
- 架构清晰:明确划分 AppleScript 语义层与 PyAutoGUI 视觉层,避免 AppleScript UI 脚本的不可靠性
- Retina 适配:内置像素-点坐标换算,解决 macOS 高分屏下的坐标不一致问题
- 双定位策略:OCR 适合文本按钮,OpenCV 适合图标图像,覆盖多数 UI 场景
- 安全设计:保留 PyAutoGUI 的 FAILSAFE 机制(鼠标移至左上角可中断),防止失控循环
- 剪贴板优先:所有文本输入默认使用粘贴而非模拟按键,避免中英文输入法切换问题
- 可组合性:各脚本支持标准输入输出,便于 shell 管道串联形成自动化流程
潜在缺点与局限性
- 单屏限制:V1 仅支持单主屏幕,多显示器、非 Retina 屏、缩放显示需后续扩展
- 权限门槛:需要用户授予"屏幕录制"和"辅助功能"权限,首次配置门槛较高
- 视觉依赖:OCR/OpenCV 定位受界面主题、分辨率、缩放比例影响,可能需要阈值调优
- 无深度 Accessibility:不支持通过 accessibility API 遍历 UI 元素树,复杂自定义控件可能无法识别
- 性能开销:截图+OCR/图像匹配相比直接 accessibility 查询延迟更高(通常数百毫秒)
- 坐标漂移风险:若应用窗口移动或界面动态变化,定位结果可能失效
适合人群
- 自动化测试工程师:需要跨应用 UI 自动化但不想依赖复杂 accessibility 框架
- 效率工具开发者:构建 macOS 上的 RPA(机器人流程自动化)工作流
- 技术型高级用户:熟悉 shell/Python,愿意配置权限并调试坐标映射
- 中文环境用户:剪贴板粘贴策略对中英文混合输入场景特别友好
- 单屏 Mac 用户:使用 MacBook 或单显示器 iMac 的 Retina 设备持有者
常规风险
| 风险类别 | 具体说明 | 缓解建议 |
|---------|---------|---------|
| **权限滥用** | 屏幕录制和辅助功能权限可捕获全屏内容 | 仅向可信终端应用授予权限,使用后可在系统设置中撤销 |
| **失控自动化** | 鼠标循环可能抢占用户控制 | 保持 FAILSAFE 开启,设计可中断的循环条件,避免过短延迟 |
| **隐私泄露** | 截图可能包含敏感信息(密码、聊天记录) | 及时清理 `/tmp/macos_desktop_control/` 目录,避免持久化敏感截图 |
| **应用状态干扰** | 自动化操作可能意外触发应用内功能(如发送消息) | 每个关键操作后添加视觉验证步骤,必要时人工确认 |
| **坐标误匹配** | OCR/OpenCV 可能定位到错误目标 | 设置合理的匹配阈值,对关键操作执行二次验证截图 |
| **系统兼容性** | 未来 macOS 版本可能调整 screenshot/screencapture 行为 | 关注系统更新日志,保留手动降级能力 |