关于 imsg
imsg 是通过本地 Messages.app 处理 iMessage 任务的技能,涵盖历史记录、搜索、发送和群组操作。它区分标准消息操作与私有 API 桥接能力,并强调确认收件人及可见变更。
主要功能
- 01列出、搜索和监听对话
- 02读取消息历史与附件
- 03发送文本和文件
- 04通过桥接使用原生回复、效果和投票
- 05管理群组和消息回应
适用场景
- 01查找对话并查看历史记录
- 02向已确认的收件人发送消息或附件
- 03创建投票或发送线程回复
- 04监听对话并管理群组成员
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ openclaw/ openclaw --skill imsg安装后在 Claude Code 中输入/imsg确认已加载。
详细介绍
imsg
对于当前 iMessage 模式公开的操作,优先使用通用 message 工具。当任务需要本地 Messages.app 历史记录、目标发现、监控,或 message 未提供的管理/私有 API 功能时,使用 imsg。
如果已配置的频道能够路由回复,则不要使用此技能在当前 OpenClaw 对话中回复;同样,也不要将其用于 Telegram、Signal、WhatsApp、Discord 或 Slack。
Agent 流程
- 首先确定目标对话。
- 选择私信、现有群聊或新群聊。
- 优先使用可用的
message操作;否则,选择能够保留所请求语义的、能力要求最低的imsg命令。 - 除非用户已经提供确切的收件人、内容和操作,否则,在任何发送或可见状态变更前都要确认。
- 使用稳定标识符执行:普通发送、监控和历史记录优先使用
--chat-id;桥接操作使用--chat聊天 GUID。
当多个聊天对象或句柄都可能匹配时,绝不能仅凭随口提供的名称推断收件人。发送前,应展示匹配对象的显示名称、句柄、群聊参与者和消息文本/操作。
主机要求
- macOS 14+,且 Messages.app 已登录,才能执行发送、表情回应和桥接操作。
- 对于 OpenClaw iMessage,强烈建议使用私有 API 模式。它支持回复、精确轻拍回应、特效、投票、附件回复、已读/正在输入操作和群聊管理。基础模式作为读取内容及发送纯文本或文件的备用方案。
- 运行
imsg或 OpenClaw 的进程上下文需要完全磁盘访问权限;如果无法访问 Messages 数据库,读取将失败。 - 使用公开的
send时,需要为 Messages.app 授予自动化权限。 - 运行公开的
imsg react需要辅助功能权限,因为该命令使用 System Events 进行 UI 自动化。桥接tapback则使用私有 API。 - 可选的 Contacts 权限,用于解析联系人名称。
- SMS 发送要求将用户 iPhone 上的“信息转发”设置到此 Mac。
- 在 Linux 上只能读取复制得到的
chat.db;无法发送、回应、启动 Messages.app、标记为已读或输入文字。
确定目标
读取时使用 --json。输出为换行分隔的 JSON;如果 jq 可用,使用 jq -s,也可直接逐行处理对象。
imsg chats --limit 25 --json | jq -s
imsg search --query "dinner" --match contains --json | jq -s
imsg history --chat-id 42 --limit 20 --attachments --json | jq -s
imsg group --chat-id 42 --json
目标规则:
- 向手机号码或邮箱地址发送私信:用户提供了准确句柄时,或唯一匹配到一个聊天对象后,使用
imsg send --to。 - 现有私信对话:与重新解析名称相比,
imsg send --chat-id <id>更安全。 - 现有群聊:使用
imsg group --chat-id <id> --json检查;使用--chat-id发送,并使用group提供的聊天 GUID 进行桥接。 - 新群聊:仅当用户明确要求创建群聊,或没有现有群聊匹配时,才使用
chat-create。 - 群聊名称有歧义:应确认参与者,而不只是显示名称。
- SMS:仅在用户提出要求或不想使用 iMessage 后备方式时,使用
--service sms。SMS 中继需要启用“信息转发”。
不要将 jq 作为使用此技能时的硬性前置条件;它只是用于示例的便捷格式化工具。
能力选择
当当前 message 架构未涵盖该操作或需要本地历史记录时,使用 imsg 标准命令:
- 读取、列出、搜索、监听:
chats、group、history、search、watch - 发送基础文本或文件:
send - 对聊天中最近收到的一条消息进行标准轻点回应:
react
对于 OpenClaw 用户通常期望的原生 iMessage 操作,使用私有 API 桥接:
- 富文本回复、文本格式、效果、主题、多部分发送
- Apple Messages 原生投票和投票操作
- 按消息 GUID 发送轻点回应或移除轻点回应
- 编辑、取消发送、删除、仍然通知
- 已读回执、正在输入指示器、桥接事件监听
- 创建群组、设置群组名称、设置照片、管理成员、退出、删除和标记操作
- 账户、whois 和昵称检查
进行 OpenClaw 渠道设置时,尽早检查桥接可用性:
imsg status --json
如果主机支持桥接操作,但尚未将桥接注入 Messages,请先征得同意,再运行 imsg launch。此操作会终止并重新启动 Messages.app 以注入桥接,因此应将其视为用户可见的状态变化:
imsg launch
imsg status --json
如果 SIP、库验证、私有权限检查或缺少选择器仍会阻止该能力,请说明此主机无法使用所请求的私有 API 操作,并在存在相近的非桥接操作时予以提供。不要将线程回复、效果、主题、投票或针对 GUID 的轻点回应静默降级为普通发送或 react。
私信场景
准确指定接收方标识,进行基本发送:
imsg send --to "+14155551212" --text "On my way" --service auto
已知私信线程:
imsg send --chat-id 42 --text "On my way"
imsg send --chat-id 42 --file /path/to/photo.jpg
仅在用户要求时强制指定渠道:
imsg send --to "+14155551212" --text "green bubble" --service sms
imsg send --to "+14155551212" --text "iMessage only" --service imessage --no-sms-fallback
线程回复、设置格式、添加效果或回复时附带附件:
imsg send-rich --chat 'iMessage;-;+15551234567' \
--reply-to <message-guid> --text "reply text"
imsg send-rich --chat 'iMessage;-;+15551234567' --text 'hello world' \
--format '[{"start":0,"length":5,"styles":["bold"]}]'
imsg send-rich --chat 'iMessage;-;+15551234567' --text "boom" --effect impact
imsg send-attachment --chat 'iMessage;-;+15551234567' \
--reply-to <message-guid> --file /path/to/file.jpg
格式范围以 UTF-16 位置表示。支持的样式包括 bold、italic、underline 和 strikethrough;生成 JSON 时使用 --format-file。
群组场景
执行操作前先检查:
imsg group --chat-id 42 --json
imsg history --chat-id 42 --limit 20 --json | jq -s
向现有群组发送消息:
imsg send --chat-id 42 --text "Works for me"
在现有群组中通过桥接回复或发起投票:
imsg send-rich --chat 'iMessage;+;chat0000' \
--reply-to <message-guid> --text "replying in thread"
imsg poll send --chat 'iMessage;+;chat0000' \
--question "Dinner?" --option "Pizza" --option "Sushi"
仅在明确请求时创建或修改群组:
imsg chat-create --addresses '+15551111111,+15552222222' --name 'Crew' --text 'gm'
imsg chat-name --chat 'iMessage;+;chat0000' --name 'Renamed'
imsg chat-photo --chat 'iMessage;+;chat0000' --file /path/to/group.jpg
imsg chat-add-member --chat 'iMessage;+;chat0000' --address +15553333333
imsg chat-remove-member --chat 'iMessage;+;chat0000' --address +15553333333
imsg chat-leave --chat 'iMessage;+;chat0000'
imsg chat-delete --chat 'iMessage;+;chat0000'
imsg chat-mark --chat 'iMessage;+;chat0000' --read
群组变更非常显眼。在更改群组成员、名称、照片、已读状态,或退出、删除群组之前,请确认目标群组和参与者列表。
轻点回应与回复
公开的 react 功能有限:它只能对聊天中最近收到的一条消息作出轻点回应。
imsg react --chat-id 42 --reaction like
imsg react --chat-id 42 --reaction love
imsg react --chat-id 42 --reaction dislike
imsg react --chat-id 42 --reaction laugh
imsg react --chat-id 42 --reaction emphasis
imsg react --chat-id 42 --reaction question
若要针对特定消息 GUID 作出轻点回应或移除轻点回应,请使用桥接 tapback:
imsg tapback --chat 'iMessage;-;+15551234567' --message <message-guid> --kind love
imsg tapback --chat 'iMessage;-;+15551234567' --message <message-guid> --kind love --remove
使用 send-rich --reply-to <message-guid> 发送线程回复。如果用户说“那条”或“上一条”,请确认所引用的消息。
投票
Apple Messages 原生投票需要桥接。创建时至少需要两个 --option 值。投票时必须提供 --option-id、--option-index 或 --option 中的一个。
Messages 只会呈现投票气泡中的选项,因此当前的 imsg poll send 会在投票之后尽力将 --question 作为普通说明文字回显。使用 --comment 可覆盖该说明文字。如果仅说明文字失败,请勿自动重试:投票可能已经送达。
imsg poll send --chat 'iMessage;-;+15551234567' \
--question "Dinner?" --option "Pizza" --option "Sushi" --comment "Vote by 5pm"
imsg poll send --chat 'iMessage;+;chat0000' --reply-to <message-guid> \
--question "Approve?" --option "Yes" --option "No"
imsg poll vote --chat 'iMessage;+;chat0000' \
--poll <poll-message-guid> --option-id <option-id>
使用以下命令查找投票 ID 和选项:
imsg history --chat-id 42 --limit 20 --json | jq -s '.[] | select(.poll != null) | {guid, poll}'
history 和 watch 会利用无标题的传入原生投票所对应的纯文本说明行,回填该投票的 poll.question。投票记录行是 poll 事件,而不是轻点回应;无需 watch --reactions 即可看到这些事件。
监听与长时间运行的 Agent
若只需短时等待一次,请使用 watch:
imsg watch --chat-id 42 --since-rowid 9000 --json
imsg watch --chat-id 42 --attachments --convert-attachments --json
imsg watch --chat-id 42 --reactions --json
imsg watch --chat-id 42 --bb-events --json
--since-rowid 不包含指定行。不指定时,watch 从最新一行开始。watch 使用文件系统事件,并以低频轮询作为后备,因此错过 SQLite 辅助进程事件后也能补齐。即使不指定 --reactions,也会显示投票对象。
对于守护进程或多聊天集成,请使用 imsg rpc。它通过标准输入和标准输出使用 JSON-RPC 2.0。使用较新的桥接方法或投票方法前,先检查 imsg status --json 中的 rpc_methods。
安全规则
- 每次发送前都要确认收件人、聊天和内容,除非用户的请求中已包含准确值。
- 确认可见的状态变更:已读回执、输入状态、编辑、撤回、删除、投票表态、表情回应、群组成员资格、群名称/照片、退出或删除聊天。
- 未经批准,绝不向未知号码或联系人名称匹配不明确的对象发送消息。
- 确认附件存在且为所需文件。
- 优先使用 E.164 电话号码;仅在本地格式需要时使用
--region US或其他地区代码。 - 对于仅适用于桥接的操作,使用桥接操作,但必须先确认可见的状态变更和破坏性操作。