很多人对“iMessage自动回复”的第一反应是去装那些商业软件,或者折腾快捷指令。但我个人用下来,真正自由度最高、最可控的方案,反而是用一个开源机器人框架把Clawdbot和iMessage集成起来。这套东西配好之后,日常消息基本不需要自己动手回,而且整个链路都捏在自己手里——prompt、触发规则、白名单、后台常驻,全都可以按需定制。这篇文章就记录一下我从零开始的完整配置过程,包括最容易被卡住的权限授权、配置文件逐项解释、AppleScript桥接原理、后台运行和排坑记录。适合想在Mac上跑一个私人AI助手、又不想被现成产品绑架的朋友参考。
1. 先搞明白Clawdbot到底在解决什么问题
1.1 没有Clawdbot之前,iMessage自动回复有多痛苦
如果你之前试过在Mac上用快捷指令做iMessage自动回复,应该懂那种憋屈感。快捷指令的自动化触发条件极其有限,而且“收到iMessage”这个触发条件在macOS上本身就不稳定,经常是手机锁屏了、Mac睡眠了就直接失效。就算勉强跑通,你也没法做多轮对话,没法调用外部工具,没法根据消息内容动态判断要不要回复,更别提让AI理解上下文了。
另一条路是用AppleScript直接操作“信息”应用,监听消息、读取内容、调用某个接口、再发回去。这思路本身没问题,但脚本写得越复杂越接近一个真正的应用,消息解析、会话管理、错误重试、并发处理,每一项都是工作量。Clawdbot本质上就是把这件事封装好了:它负责监听iMessage收件箱,把新消息取出来,转发给Claude API生成回复,再把回复通过AppleScript发送回去。你只需要关心配置和prompt,不用从零写那些易碎的消息处理逻辑。
1.2 Clawdbot的工作方式:AppleScript桥接加Claude API
Clawdbot跑起来之后的完整链路是这样的:首先,它通过macOS的Apple Events和“信息”应用通信,可以用AppleScript读取指定聊天会话里的最新消息;然后,把消息内容拼进带上下文的prompt,调用Claude API拿到回复;最后,同样通过AppleScript把回复内容用send命令发回原来的会话。整个过程中,“信息”应用扮演的是一个桥接角色,你的iMessage账号、收发信协议这些底层东西完全不用碰。
这里有个关键点:iMessage没有公开的开发API,所以所有第三方方案最终都必须落在AppleScript这一层。Clawdbot并没有绕过这个限制,它只是把AppleScript这套桥做得很稳,包括会话ID的格式化、错误重试、消息去重(防止把同一条消息重复处理多遍)。明白这一点之后,遇到问题时你就能定位——到底是桥接层的问题,还是API层的问题,还是配置的问题。
1.3 适用场景和不适用场景
先说Clawdbot适合干什么:个人助理、消息过滤、常用问题自动应答、在你不方便回消息的时候帮忙顶一下,或者单纯想给iMessage加一个能聊天的AI,这些都很合适。我目前主要用它处理两类消息:一类是家人朋友发来的“在吗/几点到/晚饭吃啥”这种高频短消息,Claude生成的回复足够自然;另一类是工作群里的一些固定格式通知,我配置了关键词规则,只有命中“明日”“会议室”“安排”这些词才触发AI回复,其余消息一律不碰。
不适用场景也要说清楚:第一,iMessage的端到端加密是保不住的,因为Clawdbot要读取消息内容才能转发给Claude API,这是架构决定的,介意隐私就别用;第二,它依赖“信息”应用保持前台或后台运行,macOS的App Nap和休眠策略会影响机器人响应速度,需要额外配置;第三,苹果对iMessage自动化发送有频率限制,短时间内大量发送还是会触发风控,不适合做营销群发。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备:macOS、Node.js和API密钥一个都不能少
2.1 为什么必须是macOS
这点其实不用多解释,因为iMessage本身就是苹果生态的东西,“信息”应用只存在于macOS和iOS上。Clawdbot要控制“信息”应用收发消息,就只能运行在macOS上,用Linux服务器跑是不行的,除非你另接一台Mac mini或把Mac当服务器常开。我个人建议如果只是个人使用,一台能长期开机的MacBook或Mac mini就够了,不需要专门买设备。
另外要注意macOS版本。有些旧的AppleScript命令在Big Sur之后改了行为,比如会话ID的格式在不同版本上就不完全一样。我是在macOS Ventura上跑的,如果你是用Sonoma或Sequoia,AppleScript的授权弹窗逻辑会有细微差别,但整体流程一致。
2.2 Node.js环境安装
Clawdbot是Node.js写的(这里以当前主流版本为例),所以先装Node.js。推荐用nvm装,别直接用系统自带的Node或者去官网下pkg,版本切换和后续升级都麻烦。
bash复制curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
source ~/.zshrc
nvm install 20
nvm use 20
node -v
装完确认一下node和npm版本正常。Clawdbot对Node版本要求不苛刻,18以上基本就行,20比较稳。这里不推荐用Homebrew直接装node,因为brew node的更新策略在M系列芯片上偶尔会碰到路径问题,nvm更干净。
2.3 申请Claude API Key
Clawdbot的智能回复靠的是Claude API,所以必须有一个有效的API Key。去Anthropic的开发者控制台创建一个API Key,注意几个细节:
- Key只显示一次,创建后立刻复制保存,丢了只能重新生成。
- 如果需要联网搜索功能,注意账号是否有对应权限,否则后续功能扩展会受限。
- 计费是按token算的,个人使用一天几百条短消息,费用完全可以接受,但如果有人恶意跟你聊天刷消息,账单会涨得很快。建议在Clawdbot里设置每日最大调用次数。
拿到Key之后,先手动验证一遍能不能正常调用。用curl或者你喜欢的HTTP客户端发一个最小请求,确认Key有效再往下走,避免后面配置完才发现是Key的问题。
2.4 安装Clawdbot
安装方式很简单,npm全局装就行。如果你是从GitHub拉源码跑,也可以,但全局安装更适合作为常驻服务用。
bash复制npm install -g clawdbot
clawdbot --version
建议装完之后先用clawdbot init生成一个默认配置文件,后面所有修改都在这个文件上做。不同版本的Clawdbot配置项名可能略有差异,但核心逻辑一致:配置文件里声明API Key、模型、系统提示词、允许自动回复的联系人列表、以及一些高级开关。我的做法是先把配置文件生成出来,对照注释一项项改,不要凭记忆乱写。
3. 核心配置:把Clawdbot和iMessage连起来
3.1 config.json逐项解释
这是最核心的步骤。下面是我的完整配置文件,每一项我都加了注释。默认生成的配置文件一般会带更详细的说明,但结构是类似的。
json复制{
"apiKey": "sk-ant-xxxxxxxx",
"model": "claude-sonnet-4-20250514",
"systemPrompt": "你是我的私人iMessage助理。你回复消息时语气自然、简短,像真人发短信一样。不要主动暴露你是AI,不要使用emoji以外的花哨排版。除非用户问起,否则不要解释你的身份。",
"allowedContacts": ["me@icloud.com", "family@icloud.com"],
"blockedKeywords": ["加急", "诈骗", "验证码"],
"replyPrefix": "",
"maxHistory": 20,
"dailyLimit": 100,
"timeoutSeconds": 60,
"autoReplyEnabled": true,
"macOSVersion": "ventura"
}
逐项解释几个容易踩坑的:
allowedContacts:白名单,只有这些iMessage账号发来的消息会触发自动回复。强烈建议配置,否则任何陌生号码发iMessage都会消耗你的API额度,而且可能泄漏隐私。systemPrompt:这个直接决定AI的回复风格,是我花时间最多的地方。注意Claude对“不要暴露身份”这类指令的执行效果很好,但也不要过度要求,否则回消息会显得僵硬。blockedKeywords:黑名单关键词,命中后不回复也不转发给API。这个适合过滤垃圾消息和验证码,能省不少token。replyPrefix:如果要给自动回复加前缀,比如“[Auto]”,在这里配置。我设置为空,追求最大程度的自然。maxHistory:每个会话保留多少条历史消息作为上下文。太少了AI记不住前文,太多了每次请求的token消耗会大增。dailyLimit:每日自动回复上限,防止API预算失控。这个非常重要,别侥幸。
3.2 首次启动与权限授权
配置文件改好之后,直接运行clawdbot run。第一次启动时会弹出一系列权限请求,这里是最多人卡住的地方,我拆开讲:
第一步,macOS会弹窗提示“终端”想要控制“信息”应用。这个必须点“允许”,否则Clawdbot无法通过AppleScript读取和发送消息。如果你误点了“不允许”,去“系统设置-隐私与安全性-自动化”里手动打开对应开关。
第二步,可能还会弹一个“辅助功能”权限请求。Clawdbot在部分macOS版本上需要通过AppleScript发送键盘事件来绕过某些限制,这个也建议直接允许。但如果你对安全性要求极高,且确认自己的macOS版本不需要这个权限,可以跳过。
第三步,确保“信息”应用已经登录了你的iMessage账号,并且处于运行状态。你可以手动打开“信息”应用确认账号正常,再退出到后台。Clawdbot不会帮你登录账号,它只是控制已登录的应用。
授权完成之后,Clawdbot会开始监听。你从另一台设备给自己的iMessage发一条测试消息,等几秒,如果配置正确,你的iPhone和Mac都会收到一条来自同一个账号的自动回复,内容由Claude生成。
3.3 验证集成成功的三个检查点
如果在测试阶段没收到回复,按优先级检查三件事:
第一,看终端日志。Clawdbot会输出详细的调试日志,包括是否监听到了新消息、是否成功调用了API、API返回了什么。如果是API报错,日志里会有HTTP状态码和错误信息。这一条能定位80%的问题。
第二,确认权限。在“系统设置-隐私与安全性”里检查“自动化”和“辅助功能”两个分类下,你的终端或Clawdbot进程是否都被勾选。macOS偶尔会在系统更新后重置权限,需要重新授权。
第三,确认会话ID格式。iMessage的AppleScript引用会话时,会话ID的格式是E:对方账号(iMessage协议)或+1xxx(SMS协议)。Clawdbot一般会自己处理这个格式,但如果你发现日志里有找不到会话的报错,可以手动在AppleScript编辑器里跑一下tell application "Messages" to get id of every chat,看看实际的会话ID长什么样,再和Clawdbot日志里的对比。
4. 自动回复逻辑定制:别让你的机器人像客服
4.1 设定system prompt的学问
很多人配置完就完事了,但我觉得prompt才是这个机器人好不好用的核心。如果直接给Claude一句“你是AI助手”,它回复的每一句话都带着浓浓的客服味,家人一眼就能看出来是机器人。
我的建议是,先用一句定义“你是谁”,再用一句定义“怎么说”,最后用一句定义“不做什么”。比如我的配置:
code复制你是我的私人iMessage助理。回复消息时语气自然、简短,像真人发短信一样。不要主动暴露你是AI,不要使用emoji以外的花哨排版。除非用户问起,否则不要解释你的身份。消息涉及时间安排时,主动询问是否需要补充到日历。
这里面的关键点是“像真人发短信”。Claude对这类风格的要求理解得非常好,但你要说清楚“简短”是什么程度。iMessage场景下,一句话能说清的事别回三句话;但涉及时间确认、地址确认这种场景,宁可多写一句也不能含糊。
另外,不用在prompt里写“你是一个自然语言处理模型”这种话。Claude自己知道自己是什么,你越强调反而越容易在对话中暴露。直接给角色设定就行。
4.2 关键词触发的两种模式
Clawdbot的触发逻辑默认是“白名单内所有消息都自动回复”。但有些场景你并不希望每条消息都触发,比如工作群的通知,家人群里你妈连发十张照片,这些就不该每个都回复。两种模式都支持:
第一种是“关键词白名单”模式:只有消息内容包含指定的词或正则表达式才触发。适合处理特定类型的消息。配置写法大概是:
json复制{
"triggerMode": "keyword",
"triggerPatterns": ["明早|几点|到哪", ".*\\?$"]
}
第二种是“命中即忽略”模式:默认所有消息都回复,但命中黑名单关键词的忽略。这个适合大多数日常场景。我个人用的就是这种,白名单联系人发来的消息默认回,遇到“验证码”“链接”“转账”这种词直接闭嘴。
注意正则表达式里的转义。?在全角半角之间很容易写错,如果你发现某条消息明明该触发却没触发,优先检查触发词是不是被当成正则的一部分了。建议触发词统一用半角字符或用.*包起来,避免歧义。
4.3 多轮对话与上下文记忆
Clawdbot默认会给每次请求带上前若干条历史消息,这就是maxHistory参数的作用。我把它设成20,也就是每个会话会保留最近20条消息(包括你和对方的)作为上下文。
实际操作中这个设计对用户很友好:如果你跟朋友聊“今晚吃什么”,对方说“随便”,你不会希望AI无从接话;带上之前几条消息,AI就能懂你们在讨论什么,回复自然很多。
但要注意token消耗。20条上下文,假设平均每条50个token,一次请求就是1000个token左右,比单条消息贵了不止一倍。不过Clawdbot是在进程内存里保存上下文的,重启后会清空,这既是缺点也是优点——缺点是不能跨天记忆,优点是不会有隐私数据被长期落盘。
4.4 防止自我对话和死循环
自动回复机器人最怕的一件事是:自己回复了自己。比如你和别人在同一个群里,对方发了一条消息,机器人回复了一条,如果机器人把自己发的也当成“新消息”处理,就会无限循环,疯狂消耗API。
Clawdbot在消息去重上做了处理,但我在使用中还是建议你在prompt和配置里双重保险:
- 在白名单里明确排除自己的账号(虽然iMessage一般不会把发件人识别成自己);
- 检查机器人发出的消息是否带有标识,比如默认的
replyPrefix。如果你看到日志里有“processing message”但内容是机器人自己刚发的,说明去重没生效,升级Clawdbot版本或者检查配置。
另一个死循环来源是:对方是另一个iMessage机器人。两个机器人互相回复,你拦都拦不住。这种只能靠时间间隔限制和黑名单去控制。
5. 跑起来之后:后台常驻与异常兜底
5.1 用launchd让Clawdbot开机自启
clawdbot run是前台运行,关掉终端就停了。个人使用的自动回复机器人需要长期在线,所以必须做成后台服务。macOS上最正统的方式是launchd,效果类似Linux的systemd。
写一个plist文件放到~/Library/LaunchAgents/com.clawdbot.imessage.plist:
xml复制<?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.clawdbot.imessage</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/bin/clawdbot</string>
<string>run</string>
<string>--config</string>
<string>/Users/你的用户名/.clawdbot/config.json</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
<key>StandardOutPath</key>
<string>/tmp/clawdbot.log</string>
<key>StandardErrorPath</key>
<string>/tmp/clawdbot.err.log</string>
</dict>
</plist>
然后加载服务:
bash复制launchctl load ~/Library/LaunchAgents/com.clawdbot.imessage.plist
launchctl start com.clawdbot.imessage
检查是否在跑:
bash复制launchctl list | grep clawdbot
注意几个点:
/usr/local/bin/clawdbot这个路径在Apple Silicon Mac上可能是/opt/homebrew/bin/clawdbot,先用which clawdbot查清楚再写进plist,路径写错了服务起不来。KeepAlive设为true会保证进程挂了自动拉起,但也意味着如果Clawdbot反复崩溃,launchd会不断重启它,日志会被刷爆。观察一段时间,如果日志里反复出现启动即退出的报错,先修好问题再保持KeepAlive。- StandardOutPath和StandardErrorPath建议保留,不然出问题的时候你连日志都找不到。
5.2 我遇到过的几个坑和排查链路
配置好之后的这几个月,我先后碰到过几个问题,这里把排查链路写出来,供你参考。
第一个坑是macOS系统更新后权限被重置。有一天机器人突然不回复了,日志里没有任何报错,只是监听不到消息。我折腾了半天才发现是“系统设置-隐私与安全性-自动化”里终端控制“信息”的开关被系统更新重置了。重新打开,重启Clawdbot就好了。这个坑没有技术难度,但特别隐蔽,因为是静默失效。
第二个坑是AppleScript报“connection is invalid”。这个一般发生在“信息”应用被退出、重启或系统睡眠恢复之后。Clawdbot依赖与“信息”应用的Apple Events连接,这个连接在系统休眠后偶尔会失效。解决办法是给Clawdbot加一个自动重连的逻辑,或者在launchd的plist里加定期重启。如果不想改代码,最简单的方案是每天凌晨定时重启一次Clawdbot进程。
第三个坑是API超时。Claude API偶尔会因为网络波动或服务端负载而响应变慢,默认的60秒超时偶尔会触发。如果你发现消息迟迟没回复,去日志里看有没有timeout关键字。我的解决方法是把timeoutSeconds调到90秒,同时给Clawdbot加了API调用失败后的自动重试。但注意重试次数不要太多,否则API限流会更严重。
第四个坑是macOS“信息”应用的通知弹窗。因为Clawdbot是通过AppleScript控制信息应用的,消息到达时Mac上会弹出系统通知。如果你不想每次自动回复都被通知打扰,在“信息-设置-通知”里把提醒样式改成“无”或者直接关闭横幅。这个不影响Clawdbot工作,只影响你被打扰的程度。
5.3 消息频率限制和防滥用
iMessage对自动化发送有隐藏的风控机制,短时间内高频发送会造成账号被临时限制。我的实测感受是:几分钟内发超过10条基本就会触发,发完会被静默限制一段时间,表现为消息发出去但对方一直收不到,或对方发来的消息你也收不到(但这个不一定是因为风控,也可能是因为网络问题)。
防滥用从两个层面做:
- 在Clawdbot配置里加消息间隔,比如每两条自动回复之间至少间隔3秒。
- 在prompt里要求AI聚合回复。如果对方短时间发来多条消息,不要逐条回复,把多条消息合并成一条完整回复。这既省API又省风控风险。
我自己的设置是每天上限100次、每次请求间隔3秒。到目前为止没有触发过风控,日常使用也完全够用。
6. 扩展一下:Clawdbot还能帮你做什么
6.1 把定时提醒接进来
自动回复只是Clawdbot的基础能力。因为它本质上是“收到消息 -> 调Claude -> 发消息”的管道,你可以在中间任意位置插入逻辑。比如定时提醒:你给机器人发“明早8点提醒我开会”,Claude识别出这是一个日程请求,调用内置的日历脚本在提醒事项里创建一条事项,到点后系统自动弹出提醒。Clawdbot目前支持自定义工具调用,功能上相当于给Claude开了iMessage的入口。
不过我这里要提醒一句:增加工具调用意味着prompt和配置复杂度上升,排错的成本也变高。如果你第一次接触这种工具,建议先把自动回复跑稳,再加工具能力。我是用了两周之后才加提醒功能的。
6.2 让人工智能理解附件通知
iMessage里经常会有图片、链接、位置共享这类消息。Clawdbot默认只提取文本内容,遇到纯图片消息会怎么处理其实取决于你的配置。如果图片被忽略,对方可能会觉得机器人不理人。我的做法是在prompt里告诉Claude:“如果收到图片消息,回复一个友好的确认,比如‘收到图片了,我看不了内容,稍后给你回复’。”因为Claude API本身不具备图片读取能力(除非你专门配置多模态模型),与其让AI胡猜图片内容,不如诚实回复,这样体验反而更好。
对于位置共享,Clawdbot会把“位置”这种文本提取出来转给API,Claude会生成类似“收到你的位置了”的确认回复。但如果你希望AI直接响应“距离我还有多远”这种问题,需要在prompt里声明“无法获取位置信息,只做确认”。别指望AI能真的算距离,它只能从文本里提取信息。
6.3 隐私边界和几个安全建议
最后必须认真说一个话题:把AI接进iMessage,本质上是在你的私人通信管道里放了一个第三方处理环节,使用前必须想清楚隐私边界。
我给几条实操层面的建议:第一,白名单必须配置,非白名单消息一律不触发,这是底线。第二,不要让Clawdbot回复你没有授权过的敏感信息,比如验证码、银行通知、密码重置邮件。即使AI不会主动泄露这些信息,消息内容每次都会被发送到Claude API,这本身就是一种数据暴露。第三,如果你的iMessage账号涉及工作保密内容,建议单独用一个iMessage账号跑机器人,别拿工作号直接上。第四,定期清理日志。日志里记录着所有消息文本,如果日志文件长期保留,一旦被别人拿到就是完整的聊天记录泄漏。
我自己的习惯是,Clawdbot处理的账号只处理不涉及隐私的日常消息,涉及银行卡、验证码、身份证这类内容,要么手动操作,要么让Claude直接不响应并给我一个“收到但不方便回复”的信号。这是技术能力之外的判断,也是每个用这类工具的人该想清楚的事。
尾巴:一个让体验提升很多的小技巧
如果你也踩过了那些权限、断连、限流的坑,最后分享一个我一直在用的小技巧:让Clawdbot的回复带一点“人味”。比如你给朋友发“吃饭没”,AI回“吃了,你呢”和AI回“你好,我是AI助理,我还没有吃饭功能”是完全不同的体验。Clawdbot的systemPrompt里有一句我特别推荐的话——“当对方只是寒暄时,不要展开,用同样轻松的方式回应。”就这么一句,能让自动回复的观感提升一大截。工具是自己的,调教也是自己的,多花几分钟打磨prompt,长期用下来体验差距非常大。
