---
summary: "iMessage 回击、线索回复、效果、本机民意调查、批准控制和问题反应"
read_when:
- "使用代理的反应、编辑、效果或民意调查"
- "将执行批准连接到 iMessage"
- "调试消息工具上缺少的操作"
title: "iMessage 私人 API 操作"
sidebarTitle: "私人 API 操作"
---
在纯文本发送之上添加了已检查的私有 API 桥的操作界面。
## 私有 API 动作
当 `imsg launch` 正在运行并且 `openclaw channels status --probe` 报告 `privateApi.available: true` 时,除了正常的文本发送之外,消息工具还可以使用 iMessage-native 操作。
所有动作默认启用;使用 `channels.imessage.actions` 可以关闭单个动作:
```json5
{
channels: {
imessage: {
actions: {
reactions: true,
edit: true,
unsend: true,
reply: true,
sendWithEffect: true,
sendAttachment: true,
renameGroup: true,
setGroupIcon: true,
addParticipant: true,
removeParticipant: true,
leaveGroup: true,
polls: true,
},
},
},
}
```
- **react**:Add/remove iMessage 抽头(`messageId`、`emoji`、`remove`)。支持的回击映射为爱、喜欢、不喜欢、笑、强调和问题。不带表情符号的删除会清除设置的回击。
- **reply**:向现有消息发送线程回复(`messageId`、`text` 或 `message`,以及 `chatGuid`、`chatId`、`chatIdentifier` 或 `to`)。本地的带附件回复还需要 `imsg` 构建版本的 `send-rich` 支持 `--file`。使用远程 `imsg` v0.13.4 时,附件回复使用 JSON-RPC,并支持整条消息或第 `0` 部分;RPC 方法不支持非零附件部分索引。
- **sendWithEffect**:发送带有 iMessage 效果的文本(`text` 或 `message`、`effect` 或 `effectId`)。短名称:slam、loud、gentle、invisibleink、confetti、lasers、fireworks、balloon、heart、echo、happybirthday、shootingstar、sparkles、spotlight。
- **edit**:在支持的 macOS/private API 版本(`messageId`、`text` 或 `newText`)上编辑已发送消息。只能编辑网关本身发送的消息。
- **unsend**:在支持的 macOS/private API 版本 (`messageId`) 上撤回已发送的消息。只能取消发送网关本身发送的消息。
- **上传文件**:发送media/files(`buffer`作为base64或水合`media`/`path`/`filePath`、`filename`,可选`asVoice`)。旧别名:`sendAttachment`。
- **renameGroup**、**setGroupIcon**、**addParticipant**、**removeParticipant**、**leaveGroup**:当当前目标是群组会话时管理群聊。这些动作会修改主机的 Messages 身份,因此要求发送者为所有者,或 Gateway 客户端具有 `operator.admin` 权限。
- **poll**:创建本机 Apple 消息轮询(`pollQuestion`、`pollOption` 重复 2 到 12 次,加上 `chatGuid`、`chatId`、 `chatIdentifier` 或 `to`)。 iOS/iPadOS/macOS 26+ 上的收件人可以本地查看并投票;较旧的 OS 版本获得“已发送民意调查”文本后备。需要 `selectors.pollPayloadMessage`。
- **poll-vote**:对现有投票进行投票(`pollId` 或 `messageId`,以及 `pollOptionIndex`、`pollOptionId` 或 `pollOptionText` 三者之一且只能选择一个)。需要 `selectors.pollVoteMessage` 和 `poll.vote` RPC 方法。远程 `imsg` v0.13.4 RPC 仅接受选项 ID,因此远程设置必须使用 `pollOptionId`;索引和文本选择器仍可用于本地设置。
已接受的入站投票会以问题、选项标签、投票数以及 `poll-vote` 所需的投票消息 ID 呈现给代理。远程账号还会包含每个稳定的选项 ID,并指示代理使用 `pollOptionId`。
入境iMessage上下文包括简短的`MessageSid`值和完整消息 GUID(`MessageSidFull`)当可用时。短 ID 的范围是最近的SQLite-支持回复缓存,并在使用前根据当前聊天进行检查。如果短路ID过期,用它重试`MessageSidFull`同时瞄准提供它的对话。完整 ID 不会绕过对话或帐户绑定,因此请替换ID来自与当前目标的另一次聊天。当当前对话证据不可用时,远程委派呼叫可以拒绝过时的完整 ID。
仅当缓存检查状态表明桥不可用时,OpenClaw 才会隐藏私有 API 操作。如果状态未知,则操作保持可见并延迟调度检查,以便第一个操作可以在 `imsg launch` 之后成功,而无需单独的手动状态刷新。
当私有 API 桥接可用时,已接受的入站聊天会被标记为已读,而直接聊天会在回合被接受时立刻显示正在输入气泡,同时代理准备上下文并生成回复。可通过以下方式禁用已读标记:
```json5
{
channels: {
imessage: {
sendReadReceipts: false,
},
},
}
```
早于按方法能力列表门控的旧版 `imsg` 构建会静默关闭 typing/read;OpenClaw 会在每次重启后记录一次警告,以便将缺失的回执归因。
OpenClaw 会订阅 iMessage 点按回应,并将收到的反应作为系统事件路由,而不是普通消息文本,因此用户的点按回应不会触发普通回复循环。
通知模式由 `channels.imessage.reactionNotifications` 控制:
- `"own"`(默认):仅在用户对机器人生成的消息作出反应时通知。
- `"all"`:对所有来自授权发送者的入站点按回应通知。
- `"off"`:忽略入站点按回应。
按账号覆盖使用 `channels.imessage.accounts..reactionNotifications`。
当 `approvals.exec.enabled` 或 `approvals.plugin.enabled` 为 true 且请求原生路由到 iMessage 时,网关会提供带原生控件的批准提示:
- 在具有轮询和标题抑制支持的已检查私有 API 桥上,提示包括每个允许的决策的消息轮询。较旧的 `imsg` 版本没有 `poll send --no-comment` 保留在文本控件上。
- 如果通过 `channels.imessage.actions.polls: false` 禁用了投票、桥接不支持投票、发送投票失败,或者可用决策少于两个,则提示会保留文本和点按回应控件。
- 文本回退会将 `👍`(赞)映射为 `allow-once`,将 `👎`(不喜欢)映射为 `deny`。它还包含 `/approve ` 命令,在请求允许时也包括 `allow-always`。
投票和反应要求执行操作的用户句柄必须是显式批准者。批准者列表从 `channels.imessage.allowFrom`(或 `channels.imessage.accounts..allowFrom`)读取;请添加用户的 E.164 格式电话号码或其 Apple ID 邮箱(如 `chat_id:*` 这类聊天目标不是有效的批准者条目)。通配符条目 `"*"` 会被接受,但会允许任何发送者批准;空的批准者列表会完全禁用投票和反应快捷方式。这些快捷方式会有意绕过 `reactionNotifications`、`dmPolicy` 和 `groupAllowFrom`,因为显式批准者白名单才是批准解析时真正重要的唯一门槛。
目前,原生投票控件仅限于来源 iMessage 会话中的通道原生投递,或 iMessage 批准者 DM。由 `approvals.exec.mode: "targets"` 选定的显式转发目标(以及 `"both"` 的目标部分)仍然会使用现有的转发批准消息,而不是 iMessage 投票。
`/approve` 文本命令的授权遵循相同列表:当 `channels.imessage.allowFrom` 非空时,`/approve ` 会依据该批准者列表进行授权(而不是更宽泛的 DM 白名单),而只在 DM 白名单中获准、但不在 `allowFrom` 中的发送者会收到明确拒绝。当 `allowFrom` 为空时,仍保持同聊天回退机制,`/approve` 会授权 DM 白名单允许的任何人。请把所有应当批准的操作员——无论是通过 `/approve` 还是通过反应——都加入 `allowFrom`。
操作员注意:
- 投票和反应绑定同时存储在内存中和网关的持久键值存储中(TTL 与批准到期时间一致),网关还会轮询待处理提示以查找点按回应。网关重启后,对旧控件的点击会被识别并吞掉,而不会进入代理聊天,但重启会终止进行中的命令;应请求新的批准,而不要指望旧控件恢复它。
- 当该句柄是显式批准者时,操作员自己的 `is_from_me=true` 点按回应(例如来自配对的 Apple 设备)会解析批准。
- 只有在配置了显式批准者时,批准提示才会路由到群组对话;否则群组中的任何成员都可能批准。
- 旧式文本样式点按回应(来自非常旧 Apple 客户端的纯文本 `Liked "…"`)无法解析批准,因为它们不携带消息 GUID;反应解析需要当前 macOS / iOS 客户端发出的结构化点按回应元数据。
对于包含一个非秘密单选问题和一到四个选项的 `ask_user` 提示,OpenClaw 添加了编号的表情符号选项。使用匹配的号码对发送的提示作出反应以回答它。该反应必须携带机器人编写的消息的稳定GUID; OpenClaw 然后通过网关将该号码映射到存储的选项。过时或重复的点击将被忽略。
多问题、多选择和自由文本提示仍然仅限文本回复。问题反应遵循正常的 iMessage DM/group 入场规则。即使一般 `reactionNotifications` 是 `"off"`,它们也能被识别,而不会将不相关的反应转化为代理事件。