用途:在 macOS 上以脚本自动化「信息」应用,发送 iMessage 或 SMS,并在需要时读取聊天历史或做消息监控。
主要能力:默认工作流为先解析传输服务(serviceType 选 iMessage 或 SMS),再按 handle(电话/邮箱)筛选 buddy,最后调用 Messages.send() 发送;可与 UI 脚本混用以处理附件。发送失败或附件失败时可回退到 UI scripting。读取历史更可靠的方式是直接访问 ~/Library/Messages/chat.db 的 SQLite 数据库,JXA 的 chat.messages() 在现代 macOS 上不可靠。
使用方式:需要 Automation 与 Accessibility 权限;读取 chat.db 需要完全磁盘访问权限。示例防御式发送:
const Messages = Application('Messages');
Messages.includeStandardAdditions = true;
function safeSend(text, handle, svcType = 'iMessage') {
const svc = Messages.services.whose({ serviceType: svcType })[0];
if (!svc) throw new Error(Service ${svcType} missing);
const buddy = svc.buddies.whose({ handle })[0];
if (!buddy) throw new Error(Buddy ${handle} missing on ${svcType});
Messages.send(text, { to: buddy });
}
建议用 try/catch 包裹并记录日志,混用 UI 时添加小延迟。群组发送应定位已有 chat 的 GUID,或回退到 UI 脚本,数组发送不可靠。
读取示例: sqlite3 ~/Library/Messages/chat.db "SELECT CASE WHEN m.is_from_me = 1 THEN 'Me' ELSE 'Them' END as sender, m.text, datetime(m.date/1000000000 + 978307200, 'unixepoch', 'localtime') as date FROM message m JOIN handle h ON m.handle_id = h.rowid WHERE h.id LIKE '%PHONE_NUMBER%' ORDER BY m.date DESC LIMIT 10;" 注意 Cocoa 纪元转换(自 2001-01-01 起的纳秒)。
适用场景:个人自动化发送、读取历史、通过 launchd 轮询实现机器人或监控。
限制与风险:AppleScript/JXA 对信息应用基本只写不可读,读取需完全磁盘访问权限,会扩大脚本的数据访问范围,是显著的安全取舍;不适用于需要跨平台消息、商业短信自动化(建议用 Twilio 等 API)、批量群发,或在安全策略禁止授予完全磁盘访问时。目标系统不支持 iMessage/SMS 时也不适用。群发有频率限制与安全限制。其他细节资料暂未提供。