说实话,把 OpenClaw 这种可以跑规则的智能体接到 iMessage 里,是我最近折腾完觉得最值的一次部署。以前我处理消息全靠手动:看到待办转去提醒自己,收到通知再去查一遍,群里的链接还得复制到别处。现在这套配置跑起来之后,iMessage 就像有了一条自动流水线,消息进来会被解析、分类、触发任务,甚至还能替我回一些固定格式的回复。
这篇教程的主角包括三个关键词:OpenClaw、iMessage、Mac 云实例。OpenClaw 负责理解消息内容、匹配规则、执行动作;iMessage 是苹果生态里最难替代的消息入口;Mac 云实例则让这套自动化可以长时间挂在云端,而不是占用我自己的 Mac 当实验品。整套部署的思路是:在云端 macOS 里把 iMessage 登录好,再让 OpenClaw 通过桥接方式读取新消息、决定要不要响应、最后把结果发回 iMessage。适合谁看?如果你已经有一点命令行基础,想给苹果生态里的消息加自动化,或者你打算搞一个个人助理型机器人但不想碰微信这类封闭平台,那这篇教程就是给你准备的。
下面我按照实际部署顺序把完整过程拆开讲,从架构思路、物料准备,到具体命令、配置文件和踩坑记录,全部摊开。
1. 为什么值得把 OpenClaw 接入 iMessage
1.1 iMessage 是苹果生态里最难替代的自动化入口
苹果生态内,很多通知、验证码、家人消息、工作消息最终都会汇到 iMessage 里。和邮件、日历通知不同,iMessage 更实时、更私密,而且原生附带在系统里,不需要额外装第三方客户端。你想在 macOS 上做“消息触发型”自动化,iMessage 几乎是第一优先级。
但问题也在这里:iMessage 没有公开的官方开放 API,你没法像调用网页接口那样直接收发消息。想在 iMessage 上做自动化,通常只能走两条路——读本地消息数据库,或者用 AppleScript/JXA 调用“信息”应用。这正是 OpenClaw 这类智能体框架派上用场的地方:框架本身不绑定某个具体平台,它只负责规则引擎、任务编排和外部工具调用,接入 iMessage 的部分则交给桥接脚本完成。两边一配合,消息入口和逻辑大脑就能解耦,后续想加邮件、RSS、日历等渠道也不用推翻重来。
1.2 为什么需要一台常驻的 Mac 云实例
我知道会有人问:用自己的 Mac 不是更省事吗?我的回答是:能跑通,但非常不方便。iMessage 的桥接脚本必须在登录了苹果账号、并且有图形会话的 macOS 环境里运行,Linux 和 Windows 直接没戏。如果你用自己电脑,意味着这台电脑得 24 小时开机、不能休眠、不能锁屏锁得太死,偶尔还要担心系统更新把进程打断。更现实的问题是,你不可能为了一套自动化把主力工作电脑的稳定性赌上。
Mac 云实例解决了这个痛点。它就是一台跑在云主机上的 macOS 虚拟机,可以远程连接,能登录 iMessage,也能长期挂机。我自己的体会是,云实例像一间“无人值守的值班室”,家里电脑断网了、重启了,都不影响云端那条消息流水线。代价是每个月要付一点租用成本,但换来的是 7×24 小时的自动化能力,这笔账是划算的。
本机 Mac 和 Mac 云实例到底怎么选,我列个对比:
| 对比项 | 本机 Mac | Mac 云实例 |
|---|---|---|
| 是否需要长期开机 | 需要,很费电也很占资源 | 不需要,只管远程登录配置 |
| 休眠策略 | 要手动改节能设置,常被系统更新影响 | 可以在云端控制台或系统中统一设置 |
| 网络环境依赖 | 依赖家中或办公室网络 | 依赖云服务商的基础网络 |
| 成本 | 无额外资金成本,但有隐性维护成本 | 按月付费 |
| 隐私边界 | 消息直接留在本地 | 消息在云端处理,需要额外做脱敏和访问控制 |
| 适合人群 | 尝试性使用、短期跑通 demo | 想长期稳定跑自动化、做定时任务 |
如果你只是跑通 Demo、验证一下能不能收消息,用自己的 Mac 完全够用。但如果你想让这套东西成为日常习惯,建议直接上云实例,后面省心很多。
1.3 整条消息流水线长什么样
在动手之前,先在心里建立一条清晰的流水线模型,后面配置的时候就不会乱。我这里用文字描述一下完整流程:
- 对方向你的 iMessage 账号发来一条消息。
- “信息”应用把消息写入本机的消息数据库 chat.db。
- OpenClaw 里的轮询任务每隔几秒读取一次 chat.db 中新增的未读消息。
- OpenClaw 把消息文本与预置规则做匹配,判断是否响应、调用什么动作。
- 如果需要回复,OpenClaw 通过 AppleScript 调用“信息”应用,把回复内容发送回对应对话。
- 所有处理事件、判定结果、回复内容写入本地日志文件,方便回溯。
这条流水线的关键点在于:读取用数据库方式,发送用 AppleScript 方式。因为读取数据库非常快、且不会打扰正在运行的信息界面;而发送消息时,AppleScript 是原生路径,几乎不会出现系统拦截问题。理解了这一点,后面的配置步骤其实都是在为这条流水线服务。
2. 部署前的物料清单与踩坑预判
2.1 你需要准备的东西
先列一份清单,避免配置到一半到处找东西:
- 一个可用的苹果账号(Apple ID),建议是专用账号,而不是你日常绑定了支付、家庭共享的主账号。
- 一台 Mac 云实例,建议 2 核 CPU、4GB 内存、64GB 磁盘起步。
- 一台能访问该云实例的电脑或手机,用来做首次远程连接和配置。
- 开发者工具 Xcode Command Line Tools,后面跑桥接脚本会用到。
- 基本的命令行操作能力,不要求精通,但至少会执行命令、看懂路径。
这里我要特别强调账号问题。云实例登录 iMessage 后,系统会把它看作一台“新设备”,通常需要二次验证。你手上要能正常收到验证码,否则连登录这一步都过不去。另外,如果你平时习惯用同一个苹果账号接收重要私聊,我不建议直接把它挂在自动化上。因为 OpenClaw 一旦被配置成“自动回复消息”,所有经手的消息都可能被处理,隐私边界就很难控制了。专门的自动化账号,就算出了幺蛾子,损失也不会蔓延到主账号。
2.2 账号与授权策略怎么定
我见过不少人在配置 iMessage 桥接时,随手就用自己的主账号登录,结果出现两个问题:第一,自动回复误伤了现实生活中的联系人,非常尴尬;第二,消息数据库里塞满了敏感聊天记录,日志一旦泄露就是灾难。
更合理的做法是:把自动化账号和应用场景严格分离。比如自动化账号只用于接收特定渠道的通知、订阅服务提醒、测试消息;真正重要的私人聊天不进入这个账号的会话列表。然后,在 OpenClaw 的规则里加白名单,只允许处理白名单内联系人发来的消息,其他一律只读不响应。这样把风险面积控制在可接受范围。
如果你还是想用自己的主账号,至少要做一个动作:把“自动回复”功能从默认开启改成显式触发。也就是回复前必须满足关键词或联系人条件,且每条回复都会加上固定前缀,比如“(自动回复)”。这样对方一看就知道是机器人,而不是你在冒充真人对话。
2.3 实例规格与系统版本怎么选
选择 Mac 云实例时,不要光看价格,还要看系统版本能不能满足你的需求。macOS 系统版本决定了消息数据库路径是否变化、完全磁盘访问权限如何配置、AppleScript 是否还能正常调用信息应用。大体上,建议选择当前主流的大版本,不要追最新尝鲜版,也不要选太老的版本。最稳妥的做法是选已经发布半年以上、社区反馈比较好的版本。因为桥接脚本往往是民间方案,系统版本太新可能导致路径或权限策略变化,脚本还没来得及适配。
硬件规格上,CPU 2 核起步,内存 4GB 起步,磁盘 64GB 起步。很多人会低估磁盘占用:Xcode Command Line Tools 就占掉几个 GB,日志文件、消息数据库、OpenClaw 依赖库再加起来,64GB 是底线而不是宽裕线。如果你打算长期跑并有日志积累,直接上 80GB 或者 128GB 更好,省得后面扩容折腾。
还有一个容易被忽略的坑:实例规格越高,成本越高,但自动化任务本身很轻量,不需要大内存。我建议把多余预算放在磁盘上而不是 CPU 上,因为消息轮询脚本本质上是一堆轻量级 IO,CPU 压力很小。
3. 云实例基础环境部署
3.1 先拿到图形界面再说
很多人以为买了 Mac 云实例就能直接 SSH 进去敲命令行,结果发现 iMessage 根本登录不了。原因很简单:iMessage 首次登录、二次验证、权限弹窗,全都要在图形界面下完成。没有图形会话,你就卡死在第一步。
Mac 云实例的连接方式通常靠云服务商控制台提供的远程访问通道,或者系统自带的屏幕共享功能。我的建议是,先通过厂商控制台的远程访问页面或 VNC 客户端连上实例,看到完整桌面再继续操作。操作步骤如下:
- 登录云服务商控制台,找到这台 macOS 实例的概览页。
- 复制实例的连接地址和端口,通常是 IP 加端口号的形式。
- 用 VNC 客户端(比如系统自带的“屏幕共享”工具)连接地址。
- 输入实例的用户名和初始密码,进入桌面环境。
首次进入桌面后,建议先做三件事:设置一个新密码、校准系统时间、确认 App Store 可以正常访问。这三个都是后续登录 iMessage 和安装工具链的先决条件。系统时间不准会直接导致苹果账号验证失败,我当时就踩过这个坑,排查了很久才发现是虚拟机的时钟漂移了。
3.2 把系统工具链铺好
图形界面连上之后,再打开终端,把基础工具链装好。顺序很重要,不然 Xcode Command Line Tools 和 Homebrew 之间可能出现路径冲突。
首先安装 Xcode Command Line Tools,终端里执行:
xcode-select --install执行后系统会弹出安装界面,等它跑完即可。然后安装 Homebrew:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"Homebrew 安装完成后,再装几个基础工具,后面 OpenClaw 和桥接脚本都要用:
brew install git jq python3 sqlite3这里要注意,python3 在某些旧版 macOS 上可能指向系统的 /usr/bin/python3,版本偏旧。建议用 Homebrew 装完以后,检查一下路径:
which python3 /opt/homebrew/bin/python3确保你后续调用的 python3 是 Homebrew 版本。否则安装 OpenClaw 依赖时可能因为 Python 版本过旧报错,排查起来很烦。
3.3 消息应用登录与验证
工具链装完,接下来是最核心的一步:登录“信息”应用。
在图形界面里启动“信息”应用,点击菜单栏的“信息”->“设置”,切换到你准备用作自动化的苹果账号,然后登录。此时系统会要求验证。验证方式可能是输入短信验证码,或者在已登录的苹果设备上弹窗确认。你要确保能收到验证码,把它输进去。
登录成功后,“信息”应用会进入正常界面。此时先在命令行里验证一下聊天数据库能不能被系统正常识别:
ls -la ~/Library/Messages/chat.db如果这个文件存在,说明 iMessage 已经完成初始化。如果文件不存在,很可能是账号尚未真正激活,或者登录过程中被二次验证打断了。这时候别急着往下配置,先把账号退了重新登录,确认信息界面里可以看到“短信/彩信”转发开关再继续。
3.4 防止云实例休眠打断服务
云 macOS 实例即使看起来在运行,系统节能设置也可能让它在“无操作”时进入睡眠状态,而睡眠之后,消息进程和 OpenClaw 轮询脚本都会断掉。最粗暴也最有效的方法是用系统自带命令强制阻止睡眠:
caffeinate -s &这条命令会让系统在接电状态下持续运行。不过单独执行一次只能管当前会话,重启之后还得重新跑。更推荐的做法是把它做成一个服务,让系统每次登录后自动拉起。这里我不展开 launchd 细节,后面第 6 章会讲怎么做成常驻服务。先确保当前会话用 caffeinate 挂住,让后面的配置过程不会被休眠打断。
4. OpenClaw 安装与 iMessage 桥接
4.1 安装 OpenClaw 本体
先把 OpenClaw 代码克隆到工作目录。我这里用一个通用路径,你可以按自己习惯调整:
cd ~/workspace git clone <OpenClaw 的代码仓库地址> cd openclawOpenClaw 本身通常需要安装依赖,不同版本用的技术栈不一样,有的是 Python 为主,有的是 Node.js 为主。安装前先查看项目里说明文件的要求。我自己的环境是以 Python 为主,安装方式大致是:
pip3 install -r requirements.txt装完后,通常会有命令行入口,也可能需要配置一个规则文件。我先给一个抽象概念:OpenClaw 的核心能力是“事件监听 + 规则匹配 + 工具调用”。它可以监听文件、定时任务、HTTP 回调等事件源,也可以执行外部命令。我们要做的,就是把 iMessage 桥接脚本变成 OpenClaw 的一个“动作”,在监听规则中调用。
4.2 桥接方案的选型对比
接入 iMessage 没有官方 API,所以必须从几种民间方案里选一种。我把它们放在一起对比:
| 方案 | 原理 | 优点 | 缺点 | 推荐程度 |
|---|---|---|---|---|
| 读取 chat.db 数据库 | 直接用 SQLite 查询消息表 | 速度快、可批量处理、不打扰界面 | 需要完全磁盘访问权限,数据是冷读,不能处理状态 | 高 |
| AppleScript / JXA | 调用“信息”应用收发消息 | 可以发消息、是原生接口 | 必须依赖 GUI 会话,速度慢 | 高(发送时必备) |
| 模拟键盘点击 | 通过系统辅助功能模拟人操作 | 能操作任意界面元素 | 极脆弱,界面一变就崩 | 低 |
| 第三方桥接库 | 封装好的开源工具 | 省事,社区在维护 | 依赖第三方,macOS 升级可能失效 | 中 |
我的做法是组合使用:读取新消息用 chat.db 数据库,往外发消息用 AppleScript。原因很简单,读取数据库在批量场景下性能碾压其他方案,而发送消息时 AppleScript 是系统原生路径,可靠性最高。两条路组合起来,覆盖了“收”和“发”两个环节。
4.3 chat.db 只读读取的正确姿势
消息数据库的完整路径是~/Library/Messages/chat.db。它内部是一张 SQLite 表,核心表结构大约是:message 表存消息内容,handle 表存联系人标识,chat 表存会话。查询最近未回复的新消息,可以用类似下面的 SQL:
SELECT message.rowid, handle.id, message.text, message.date, message.is_from_me FROM message LEFT JOIN handle ON message.handle_id = handle.rowid WHERE message.rowid > 12345 AND message.is_from_me = 0 ORDER BY message.date DESC LIMIT 10;这里有两个关键点。
第一,message.date字段不是 Unix 时间戳,而是苹果的 Cocoa 时间戳,基准时间是 2001 年 1 月 1 日。转换公式大约是:真实时间 = 苹果时间戳 + 978307200。你在 Python 里转换时可以这样写:
import time apple_timestamp = 757890000 unix_timestamp = apple_timestamp + 978307200 local_time = time.localtime(unix_timestamp) print(time.strftime("%Y-%m-%d %H:%M:%S", local_time))第二,查询条件里的message.rowid > 12345是用来做增量读取的。你要把上一次已经处理过的最大 rowid 记下来,每次查询只取比它大的消息,避免重复处理。关于怎么长期保存这个游标,我在第 5 章会讲。
4.4 能直接改来用的消息收发脚本
先给一份读取最新消息的 Python 脚本,逻辑很简单,就是查询数据库并打印新增消息:
import sqlite3 import os DB_PATH = os.path.expanduser("~/Library/Messages/chat.db") LAST_ROWID_FILE = os.path.expanduser("~/.openclaw/msg_cursor.txt") def get_last_rowid(): if os.path.exists(LAST_ROWID_FILE): with open(LAST_ROWID_FILE, "r") as f: return int(f.read().strip()) return 0 def save_last_rowid(rowid): os.makedirs(os.path.dirname(LAST_ROWID_FILE), exist_ok=True) with open(LAST_ROWID_FILE, "w") as f: f.write(str(rowid)) def fetch_new_messages(): last_id = get_last_rowid() conn = sqlite3.connect(f"file:{DB_PATH}?mode=ro", uri=True) cur = conn.cursor() sql = """ SELECT message.rowid, handle.id, message.text, message.date, message.is_from_me FROM message LEFT JOIN handle ON message.handle_id = handle.rowid WHERE message.rowid > ? AND message.is_from_me = 0 ORDER BY message.rowid ASC """ cur.execute(sql, (last_id,)) rows = cur.fetchall() conn.close() if rows: save_last_rowid(rows[-1][0]) return rows if __name__ == "__main__": for row in fetch_new_messages(): print(row)再给一份通过 AppleScript 发送 iMessage 的脚本。这里我用 Shell 调用 osascript,便于在 OpenClaw 里当成外部命令执行:
osascript <<EOF tell application "Messages" set targetChat to a reference to chat id "你的chat_id" send "这是自动回复的内容" to targetChat end tell EOF那 chat_id 从哪来?通常可以从聊天数据库中查:
SELECT chat.rowid, chat.chat_identifier FROM chat把查询结果填到脚本里即可。要注意的是,AppleScript 发送消息必须在登录了 iMessage 的 GUI 会话下运行,如果用 SSH 会话直接执行,大概率会报权限错误。这个问题我在第 6 章还会专门讲。
5. 自动化规则配置
5.1 先定好规则边界
OpenClaw 接入 iMessage 之后,最容易翻车的不是技术,而是规则定得太宽。消息流水线一旦跑起来,它就像一个全天候值班实习生,你给它什么权限,它就执行什么动作。所以配置规则之前先想清楚三个边界:
- 联系人边界:只处理白名单里的联系人,还是处理所有人?
- 内容边界:哪些关键词值得触发动作?哪些内容只是闲聊,不该被回应?
- 动作边界:允许自动回复?允许转发?还是只做日志记录?
我的建议是,第一版配置全部从严。只允许白名单联系人触发,非白名单消息只落日志,不对外动作。跑一段时间看效果,再逐步放开,这样既能验证流程,又不会给现实中的联系人带来困惑。
5.2 一个最小可运行的配置示例
假设你已经有了桥接脚本,接下来把它接到 OpenClaw 的规则配置里。这里我给一个通用 YAML 风格的配置示例,结构上遵循常见的智能体框架习惯,但具体字段名要按你安装的 OpenClaw 版本的 schema 调整:
imessage: enabled: true cursor_file: ~/.openclaw/msg_cursor.txt check_interval: 10 read_command: python3 ~/workspace/bridges/imessage_read.py send_command: osascript contacts_whitelist: - "某人@icloud.com" auto_reply_prefix: "(自动回复)" rules: - trigger: "收到验证码" action: notify channel: "openclaw_log" - trigger: "提醒我" action: run_task task: "create_todo" target: "备忘" - trigger: "查天气" action: run_command command: "date && openclaw weather"这段配置做的事情是:每 10 秒执行一次读取脚本,发现新消息后,先判断联系人是否在白名单里,再匹配关键词。匹配到“收到验证码”就只记录日志,匹配到“提醒我”就调用待办工具,匹配到“查天气”就跑一次天气查询。整个配置非常克制,不会乱回复。
5.3 回复逻辑怎么做才不容易翻车
回复逻辑是最需要小心的地方,因为一旦形成自动回复,消息一旦发出去,就没有后悔药。根据我的经验,有三个原则非常管用。
原则一:回复前必须确认消息不是自己发的。这个看似废话,但很多新手在测试时自己给自己发消息,结果机器人回了一堆,还以为系统坏了。
原则二:所有回复必须带固定前缀。比如“(自动回复)”,让对方明白这不是真人即时聊天。这一点既是礼貌,也是防止自动化消息冒充真人的基本防护。
原则三:同一对话内做节流。比如一分钟内最多自动回复一次,即使对方连发十条“在吗”,也只回应一条。否则一旦触发循环,双方消息刷屏,体验极差。节流实现很简单,用一个字典记录每个 chat_id 的最后回复时间,只有间隔超过阈值才继续动作。
5.4 消息处理日志与去重
没有日志的自动化等于裸奔。消息处理记录至少要包含:消息 rowid、联系人、接收时间、触发规则、执行结果、回复内容。我建议全部写成 JSON 行格式,每条处理记录一行,方便后续统计和排查。
另外,去重机制绝对不能省。如果 OpenClaw 中途崩溃重启,消息游标文件可能没有及时更新,重启后会重新读取已经处理过的消息,导致重复回复。解决办法是把游标更新时机放在“读取并处理完一批消息之后”,而不是“读取到消息就更新”。这样即使处理中崩溃,重启后还能重新处理未完成批次,虽然可能重复处理,但至少不会漏。为了彻底去重,可以在日志里记录已响应的消息 rowid 集合,每次回复前先查一下这个集合。
我自己用的策略是双保险:游标文件管增量,已响应集合管去重。两份数据各司其职。
6. 常见问题与排查实录
6.1 chat.db 无权限读取
症状:Python 脚本在终端里手动执行没问题,但放到 OpenClaw 里跑就报Permission denied或unable to open database file。
原因:macOS 的完全磁盘访问权限是针对进程的。终端没有获得权限时,你手动执行也可能正常,因为终端本身已经被授权;但 OpenClaw 是另一个进程,它没有被授权读取~/Library/Messages目录。
解决:打开“系统设置”->“隐私与安全性”->“完全磁盘访问权限”,把你的终端程序加进去,同时把 OpenClaw 的进程或运行它的解释器加进去,然后重启 OpenClaw。这一步做完,读取权限就通了。
6.2 iMessage 一直“等待激活”
症状:信息界面显示“正在等待激活”,消息发不出去也收不到。
原因:最常见的是系统时间不准,其次是账号二次验证中途取消过,导致激活状态异常。
解决:先打开“系统设置”校准时间,最好开启自动设置。然后注销账号重新登录。如果还是不行,重启云实例再试一次。这一套下来,绝大多数“等待激活”都能解决。
6.3 AppleScript 外发消息失败
症状:发送脚本单独在桌面上跑没问题,但由 OpenClaw 调用时就报错,错误信息类似The operation couldn’t be completed。
原因:AppleScript 发消息依赖 GUI 会话,也就是用户登录到桌面环境后的会话。OpenClaw 如果是通过 SSH 后台拉起,或者做成系统级服务(Daemon),它就不在 GUI 会话里,Messages 应用无法响应它的调用。
解决:把 OpenClaw 及其桥接脚本做成“用户级启动项”(LaunchAgent),放在~/Library/LaunchAgents/下,而不是系统级服务。这样它就能随用户登录进入 GUI 会话运行。
6.4 服务重启后无法自动恢复
症状:云实例重启后,OpenClaw 和 caffeinate 都没有自动跑起来,消息流水线直接断掉。
原因:没有做启动自恢复。手动执行的进程,重启之后当然不会自己回来。
解决:用 launchd 来做自启。下面是一个 LaunchAgent 的最小 plist 示例,放在~/Library/LaunchAgents/下,名为com.example.openclaw.plist:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Label</key> <string>com.example.openclaw</string> <key>ProgramArguments</key> <array> <string>/usr/bin/python3</string> <string>/Users/yourname/workspace/openclaw/main.py</string> </array> <key>RunAtLoad</key> <true/> <key>KeepAlive</key> <true/> </dict> </plist>加载命令:
launchctl load ~/Library/LaunchAgents/com.example.openclaw.plist同理,caffeinate 也做成一个 LaunchAgent,或者干脆在 OpenClaw 启动时用 Python 调用 subprocess 拉起 caffeinate。总之目标只有一个:重启后,不需要人工干预,消息流水线自动恢复。
6.5 重复回复同一消息
症状:对方只发一条消息,OpenClaw 却回了两次甚至更多次。
原因:游标更新时机不对。如果游标在读取后立刻更新,但处理过程比较慢,OpenClaw 又被重启,就可能重复消费。
解决:采用前面说的“处理完再更新游标”策略,并加已响应集合。已响应集合可以持久化在文件里或小数据库里。处理前查集合,处理后写集合,两个步骤保证同一 rowid 只会被处理一次。
7. 安全边界与隐私防护
7.1 消息权限是一把双刃剑
OpenClaw 接入 iMessage 后,这台云端设备事实上拥有了一份“消息钥匙”。它能看到进入该账号的实时消息,能调起信息应用发送消息,能记录完整对话文本。这个权限的敏感程度不亚于你的邮箱权限。所以,别把自动化账号和主账号混用,这是我反复强调的第一原则。一旦自动化账号泄露,你损失的是自动化消息流,可如果主账号泄露,损失的就是真实人际关系和隐私数据。
7.2 落地这些防护措施
我给自己定的防护基线是四条,你可以直接抄:
- 使用专用自动化账号,不绑支付、不开家庭共享,联系人和聊天记录都是独立的。
- 只允许白名单联系人触发自动动作,其余联系人一律只写日志、不回复。
- 自动回复内容必须带固定前缀,比如“(自动回复)”,防止机器人对话被误认为真人。
- 不把验证码、密码、地址等敏感会话内容交给 OpenClaw 做任何处理,宁可在规则里写死“包含这些关键词的消息直接跳过”,也不把它纳入自动化流程。
7.3 日志脱敏,存储收敛
日志是排查问题的好帮手,但也是隐私泄露的重灾区。默认情况下,日志会记录完整消息文本,这非常危险。建议在写入日志时做两层处理:第一层,用正则把手机号、邮箱、验证码等敏感信息替换成掩码;第二层,保留固定时长,只留最近 30 天日志,定期清理。
简单说,日志里要记录的消息文本是“被脱敏后的摘要”,而不是全文。这样即使日志文件被其他人看到,也不会直接泄露原始消息内容。自动化能跑多久,取决于你有多尊重数据的边界,这一点越早想清楚,后面返工越少。
我自己折腾这套配置用了大概一个周末,最花时间的不是装环境,而是理解 iMessage 的权限模型。说句实在话,配置过程的成就感很强,尤其当第一条消息被自动响应、转发、记录一气呵成地处理完时,你会觉得之前的踩坑都值了。
最后一件事,建议你先在测试环境跑一周。所谓测试环境,就是只拿自己的小号或者直接给自己发消息,把所有规则的触发条件都过一遍,确认没有误回复、没有重复回复、没有权限报错之后,再把通信录里的白名单加进去。按这个节奏来,基本上不会被现实世界里的突发状况打脸。