×

注意!页面内容来自https://docs.openclaw.ai/zh-CN/channels/imessage,本站不储存任何内容,为了更好的阅读体验进行在线解析,若有广告出现,请及时反馈。若您觉得侵犯了您的利益,请通知我们进行删除,然后访问 原网页

Documentation Index

Fetch the complete documentation index at: https://docs.openclaw.ai/llms.txt

Use this file to discover all available pages before exploring further.

对于 OpenClaw iMessage 部署,请在已登录的 macOS Messages 主机上使用 imsg。如果你的 Gateway 网关运行在 Linux 或 Windows 上,请将 channels.imessage.cliPath 指向一个 SSH 包装脚本,由它在 Mac 上运行 imsgGateway 网关停机后的补齐是选择启用的。 启用后(channels.imessage.catchup.enabled: true),Gateway 网关会在下次启动时重放其离线期间(崩溃、重启、Mac 睡眠)落入 chat.db 的入站消息。默认禁用 — 见在 Gateway 网关停机后补齐。关闭 openclaw#78649
BlueBubbles 支持已移除。请将 channels.bluebubbles 配置迁移到 channels.imessage;OpenClaw 仅通过 imsg 支持 iMessage。先阅读简短公告 BlueBubbles removal and the imsg iMessage path,或查看完整迁移表 Coming from BlueBubbles
Status:原生外部 CLI 集成。Gateway 网关会启动 imsg rpc,并通过 stdio 上的 JSON-RPC 通信(没有单独的守护进程/端口)。高级操作需要 imsg launch 和成功的私有 API 探测。

私有 API 操作

回复、tapback、效果、附件和群组管理。

配对

iMessage 私信默认使用配对模式。

远程 Mac

当 Gateway 网关未运行在 Messages Mac 上时,使用 SSH 包装脚本。

配置参考

完整的 iMessage 字段参考。

快速设置

1

安装并验证 imsg

brew install steipete/tap/imsg
imsg rpc --help
imsg launch
openclaw channels status --probe
2

配置 OpenClaw

{
  channels: {
    imessage: {
      enabled: true,
      cliPath: "/usr/local/bin/imsg",
      dbPath: "/Users/user/Library/Messages/chat.db",
    },
  },
}
3

启动 Gateway 网关

openclaw gateway
4

批准首次私信配对(默认 dmPolicy)

openclaw pairing list imessage
openclaw pairing approve imessage <CODE>
配对请求会在 1 小时后过期。

要求和权限(macOS)

权限按进程上下文授予。如果 Gateway 网关以无头方式运行(LaunchAgent/SSH),请在同一上下文中运行一次交互式命令以触发提示:
imsg chats --limit 1
# or
imsg send <handle> "test"

启用 imsg 私有 API

imsg 提供两种运行模式: 要使用此渠道页面记录的高级操作能力,你需要私有 API 模式。imsg README 明确说明了该要求:
readtypinglaunch、由桥接支持的富发送、消息变更和聊天管理等高级功能是选择启用的。它们要求禁用 SIP,并将辅助 dylib 注入 Messages.app。当 SIP 启用时,imsg launch 会拒绝注入。
辅助注入技术使用 imsg 自己的 dylib 来访问 Messages 私有 API。OpenClaw iMessage 路径中没有第三方服务器或 BlueBubbles 运行时。
禁用 SIP 是真实的安全权衡。 SIP 是 macOS 防止运行被修改系统代码的核心保护之一;系统范围关闭它会带来额外攻击面和副作用。特别是,在 Apple Silicon Mac 上禁用 SIP 也会禁用在 Mac 上安装和运行 iOS 应用的能力请将其视为有意的运维选择,而不是默认选项。如果你的威胁模型无法容忍关闭 SIP,内置 iMessage 将仅限于基础模式 — 只能发送/接收文本和媒体,没有回应 / 编辑 / 撤回发送 / 效果 / 群组操作。

设置

  1. 在运行 Messages.app 的 Mac 上安装(或升级)imsg
    brew install steipete/tap/imsg
    imsg --version
    imsg status --on
    
    imsg status --on 输出会报告 bridge_versionrpc_methods 和每个方法的 selectors,因此你可以在开始前查看当前构建支持什么。
  2. 禁用系统完整性保护。 这与 macOS 版本相关,因为底层 Apple 要求取决于操作系统和硬件:
    • macOS 10.13–10.15(Sierra–Catalina): 通过 Terminal 禁用 Library Validation,重启到恢复模式,运行 csrutil disable,再重启。
    • macOS 11+(Big Sur 及更高版本),Intel: 恢复模式(或互联网恢复),csrutil disable,重启。
    • macOS 11+,Apple Silicon: 通过电源按钮启动序列进入恢复;在较新的 macOS 版本中,点击 Continue 时按住 Left Shift 键,然后运行 csrutil disable。虚拟机设置遵循单独流程 — 先创建 VM 快照。
    • macOS 26 / Tahoe: library-validation 策略和 imagent 私有授权检查进一步收紧;imsg 可能需要更新构建才能跟上。如果在 macOS 主版本升级后,imsg launch 注入或特定 selectors 开始返回 false,请先检查 imsg 的发布说明,再假设 SIP 步骤已成功。
    在运行 imsg launch 前,请按照 Apple 针对你的 Mac 的恢复模式流程禁用 SIP。
  3. 注入辅助程序。 在 SIP 已禁用且 Messages.app 已登录的情况下:
    imsg launch
    
    当 SIP 仍启用时,imsg launch 会拒绝注入,因此这也可用来确认第 2 步已生效。
  4. 从 OpenClaw 验证桥接:
    openclaw channels status --probe
    
    iMessage 条目应报告 works,且 imsg status --on | jq '.selectors' 应显示 retractMessagePart: true,以及你的 macOS 构建暴露的任意编辑 / 输入 / 已读 selectors。actions.ts 中的 OpenClaw 插件按方法门控只会公布底层 selector 为 true 的操作,因此你在智能体工具列表中看到的操作面反映了此主机上的桥接实际能做什么。
如果 openclaw channels status --probe 将渠道报告为 works,但特定操作在分发时抛出 “iMessage <action> requires the imsg private API bridge”,请再次运行 imsg launch — 辅助程序可能会脱落(Messages.app 重启、操作系统更新等),而缓存的 available: true 状态会持续公布操作,直到下一次探测刷新。

当你无法禁用 SIP 时

如果禁用 SIP 对你的威胁模型不可接受:

访问控制和路由

channels.imessage.dmPolicy 控制直接消息:
  • pairing(默认)
  • allowlist
  • open(要求 allowFrom 包含 "*"
  • disabled
允许列表字段:channels.imessage.allowFrom允许列表条目必须标识发送者:handle 或静态发送者访问组(accessGroup:<name>)。对 chat_id:*chat_guid:*chat_identifier:* 等聊天目标使用 channels.imessage.groupAllowFrom;对数字 chat_id 注册表键使用 channels.imessage.groups

ACP 会话绑定

旧版 iMessage 聊天也可以绑定到 ACP 会话。 快速操作流程: 支持通过顶层 bindings[] 条目配置持久绑定,其中包含 type: "acp"match.channel: "imessage" match.peer.id 可以使用: 示例:
{
  agents: {
    list: [
      {
        id: "codex",
        runtime: {
          type: "acp",
          acp: { agent: "codex", backend: "acpx", mode: "persistent" },
        },
      },
    ],
  },
  bindings: [
    {
      type: "acp",
      agentId: "codex",
      match: {
        channel: "imessage",
        accountId: "default",
        peer: { kind: "group", id: "chat_id:123" },
      },
      acp: { label: "codex-group" },
    },
  ],
}
参见 ACP 智能体,了解共享的 ACP 绑定行为。

部署模式

使用专用 Apple ID 和 macOS 用户,使机器人流量与你的个人 Messages 配置文件隔离。典型流程:
  1. 创建/登录专用 macOS 用户。
  2. 在该用户中使用机器人 Apple ID 登录 Messages。
  3. 在该用户中安装 imsg
  4. 创建 SSH 包装器,让 OpenClaw 能够在该用户上下文中运行 imsg
  5. channels.imessage.accounts.<id>.cliPath.dbPath 指向该用户配置文件。
首次运行可能需要在该机器人用户会话中授予 GUI 权限(自动化 + 完全磁盘访问权限)。
常见拓扑:
  • Gateway 网关在 Linux/VM 上运行
  • iMessage + imsg 在你的 tailnet 中的一台 Mac 上运行
  • cliPath 包装器使用 SSH 运行 imsg
  • remoteHost 启用 SCP 附件获取
示例:
{
  channels: {
    imessage: {
      enabled: true,
      cliPath: "~/.openclaw/scripts/imsg-ssh",
      remoteHost: "[email protected]",
      includeAttachments: true,
      dbPath: "/Users/bot/Library/Messages/chat.db",
    },
  },
}
#!/usr/bin/env bash
exec ssh -T [email protected] imsg "$@"
使用 SSH 密钥,让 SSH 和 SCP 都无需交互。 请先确保主机密钥受信任(例如 ssh [email protected]),以便填充 known_hosts
iMessage 支持在 channels.imessage.accounts 下进行按账号配置。每个账号都可以覆盖 cliPathdbPathallowFromgroupPolicymediaMaxMb、历史记录设置以及附件根路径允许列表等字段。

媒体、分块和投递目标

  • 入站附件摄取默认关闭 —— 设置 channels.imessage.includeAttachments: true,即可将照片、语音备忘录、视频和其他附件转发给智能体。禁用时,仅含附件的 iMessage 会在到达智能体之前被丢弃,并且可能根本不会产生 Inbound message 日志行。
  • 设置 remoteHost 时,可以通过 SCP 获取远程附件路径
  • 附件路径必须匹配允许的根路径:
    • channels.imessage.attachmentRoots(本地)
    • channels.imessage.remoteAttachmentRoots(远程 SCP 模式)
    • 默认根路径模式:/Users/*/Library/Messages/Attachments
  • SCP 使用严格主机密钥检查(StrictHostKeyChecking=yes
  • 出站媒体大小使用 channels.imessage.mediaMaxMb(默认 16 MB)
  • 文本分块限制:channels.imessage.textChunkLimit(默认 4000)
  • 分块模式:channels.imessage.chunkMode
    • length(默认)
    • newline(优先按段落拆分)
首选显式目标:
  • chat_id:123(推荐用于稳定路由)
  • chat_guid:...
  • chat_identifier:...
也支持句柄目标:
imsg chats --limit 20

私有 API 操作

imsg launch 正在运行,并且 openclaw channels status --probe 报告 privateApi.available: true 时,消息工具除了普通文本发送外,还可以使用 iMessage 原生操作。
{
  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,
      },
    },
  },
}
  • react:添加/移除 iMessage tapback(messageIdemojiremove)。支持的 tapback 映射到爱心、喜欢、不喜欢、大笑、强调和疑问。
  • reply:向现有消息发送线程回复(messageIdtextmessage,以及 chatGuidchatIdchatIdentifierto)。
  • sendWithEffect:使用 iMessage 效果发送文本(textmessageeffecteffectId)。
  • edit:在支持的 macOS/私有 API 版本上编辑已发送消息(messageIdtextnewText)。
  • unsend:在支持的 macOS/私有 API 版本上撤回已发送消息(messageId)。
  • upload-file:发送媒体/文件(buffer 为 base64,或已注水的 media/path/filePathfilename,可选 asVoice)。旧版别名:sendAttachment
  • renameGroupsetGroupIconaddParticipantremoveParticipantleaveGroup:当当前目标是群组对话时,管理群聊。
入站 iMessage 上下文会在可用时同时包含短 MessageSid 值和完整消息 GUID。短 ID 的作用域限定在最近的内存回复缓存中,并会在使用前根据当前聊天进行检查。如果短 ID 已过期或属于另一个聊天,请使用完整的 MessageSidFull 重试。
只有当缓存的探测状态显示桥接不可用时,OpenClaw 才会隐藏私有 API 操作。如果状态未知,操作会保持可见,并在调度时惰性探测,因此首次操作可以在 imsg launch 之后成功,而无需单独手动刷新状态。
当私有 API 桥接启动时,已接受的入站聊天会在调度前标记为已读,并在智能体生成期间向发送者显示正在输入气泡。使用以下配置禁用已读标记:
{
  channels: {
    imessage: {
      sendReadReceipts: false,
    },
  },
}
早于按方法能力列表的旧版 imsg 构建会静默关闭正在输入/已读门控;OpenClaw 会在每次重启时记录一次性警告,以便归因缺失的回执。
OpenClaw 订阅 iMessage tapback,并将已接受的反应作为系统事件路由,而不是作为普通消息文本,因此用户 tapback 不会触发普通回复循环。通知模式由 channels.imessage.reactionNotifications 控制:
  • "own"(默认):仅当用户对机器人撰写的消息作出反应时通知。
  • "all":通知来自已授权发送者的所有入站 tapback。
  • "off":忽略入站 tapback。
按账号覆盖使用 channels.imessage.accounts.<id>.reactionNotifications

配置写入

iMessage 默认允许由频道发起的配置写入(用于 commands.config: true 时的 /config set|unset)。 禁用:
{
  channels: {
    imessage: {
      configWrites: false,
    },
  },
}

合并拆分发送的私信(同一次输入中的命令 + URL)

当用户同时输入命令和 URL 时 —— 例如 Dump https://example.com/article —— Apple 的 Messages 应用会将发送拆分成两条独立的 chat.db
  1. 一条文本消息("Dump")。
  2. 一个 URL 预览气泡("https://..."),并带有 OG 预览图片作为附件。
两行在大多数设置中会相隔约 0.8-2.0 秒到达 OpenClaw。如果没有合并,智能体会在第 1 轮只收到命令并回复(通常是“把 URL 发给我”),然后到第 2 轮才看到 URL,此时命令上下文已经丢失。这是 Apple 的发送管线行为,并不是 OpenClaw 或 imsg 引入的。 channels.imessage.coalesceSameSenderDms 会让一个私信选择把连续的同发送者行合并成一个智能体轮次。群组聊天会继续按消息分发,以保留多用户轮次结构。
在以下情况启用:
  • 你发布的技能期望在一条消息中收到 command + payload(dump、paste、save、queue 等)。
  • 你的用户会把 URL、图片或长内容与命令一起粘贴。
  • 你可以接受增加的私信轮次延迟(见下文)。
在以下情况保持禁用:
  • 你需要单词私信触发器具备最低命令延迟。
  • 你的所有流程都是没有后续载荷的一次性命令。

场景以及智能体看到的内容

用户编写chat.db 产生关闭标志(默认)开启标志 + 2500 ms 窗口
Dump https://example.com(一次发送)2 行,相隔约 1 秒两个智能体轮次:“Dump” 单独一轮,然后是 URL一个轮次:合并文本 Dump https://example.com
Save this 📎image.jpg caption(附件 + 文本)2 行两个轮次(附件在合并时丢弃)一个轮次:保留文本 + 图片
/status(独立命令)1 行即时分发最多等待一个窗口,然后分发
单独粘贴 URL1 行即时分发即时分发(桶中只有一个条目)
文本 + URL 作为两条有意分开的消息发送,相隔数分钟窗口外 2 行两个轮次两个轮次(两者之间窗口已过期)
快速大量发送(窗口内 >10 条小私信)N 行N 个轮次一个轮次,输出有上限(应用第一条 + 最新条、文本/附件上限)
两个人在群组聊天中输入来自 M 个发送者的 N 行M+ 个轮次(每个发送者桶一个)M+ 个轮次,群组聊天不会被合并

Gateway 网关停机后的追赶

当 Gateway 网关离线(崩溃、重启、Mac 休眠、机器关机)时,imsg watch 会在 Gateway 网关恢复后从当前 chat.db 状态继续;默认情况下,间隔期间到达的任何内容都不会被看到。追赶会在下一次启动时重放这些消息,确保智能体不会静默错过入站流量。 追赶功能默认禁用。按渠道启用:
channels: {
  imessage: {
    catchup: {
      enabled: true,             // master switch (default: false)
      maxAgeMinutes: 120,        // skip rows older than now - 2h (default: 120clamp 1..720)
      perRunLimit: 50,           // max rows replayed per startup (default: 50clamp 1..500)
      firstRunLookbackMinutes: 30, // first run with no cursor: look back 30 min (default: 30)
      maxFailureRetries: 10,     // give up on a wedged guid after 10 dispatch failures (default: 10)
    },
  },
}

运行方式

每次 monitorIMessageProvider 启动执行一轮,顺序为 imsg launch 就绪 → watch.subscribeperformIMessageCatchup → 实时分发循环。追赶本身使用 chats.list + 每个聊天的 messages.history,并通过与 imsg watch 相同的 JSON-RPC 客户端调用。追赶期间到达的任何内容都会照常流经实时分发;现有入站去重缓存会吸收与重放行之间的任何重叠。 每条重放行都会走实时分发路径(evaluateIMessageInbound + dispatchInboundMessage),因此允许列表、群组策略、防抖器、回声缓存和已读回执在重放消息与实时消息上的行为完全一致。

游标和重试语义

追赶会在 <openclawStateDir>/imessage/catchup/<account>__<hash>.on 保存按账号划分的游标(OpenClaw 状态目录默认是 ~/.openclaw,可用 OPENCLAW_STATE_DIR 覆盖):
{
  "lastSeenMs": 1717900800000,
  "lastSeenRowid": 482910,
  "updatedAt": 1717900801234,
  "failureRetries": { "<guid>": 1 }
}

操作者可见信号

imessage catchup: replayed=N skippedFromMe=… skippedGivenUp=… failed=… givenUp=… fetchedCount=…
imessage catchup: giving up on guid=<guid> after <N> failures; advancing cursor past it
imessage catchup: fetched <X> rows across chatscapped to perRunLimit=<Y>
WARN ... capped to perRunLimit 行表示单次启动没有清空全部积压。如果你的间隔经常超过默认的 50 行处理量,请提高 perRunLimit(最大 500)。

何时保持关闭

启用追赶后,首次没有游标的启动只会回看 firstRunLookbackMinutes(默认 30 分钟),而不是完整的 maxAgeMinutes 窗口;这样可避免重放启用前的长历史消息。

故障排除

验证二进制文件和 RPC 支持:
imsg rpc --help
imsg status --on
openclaw channels status --probe
如果探测报告 RPC 不受支持,请更新 imsg。如果私有 API 操作不可用,请在已登录的 macOS 用户会话中运行 imsg launch,然后再次探测。如果 Gateway 网关未在 macOS 上运行,请使用上面的通过 SSH 连接远程 Mac 设置,而不是默认的本地 imsg 路径。
默认的 cliPath: "imsg" 必须在已登录 Messages 的 Mac 上运行。在 Linux 或 Windows 上,将 channels.imessage.cliPath 设置为一个包装脚本,用 SSH 连接到那台 Mac 并运行 imsg "$@"
#!/usr/bin/env bash
exec ssh -T messages-mac imsg "$@"
然后运行:
openclaw channels status --probe --channel imessage
检查:
  • channels.imessage.dmPolicy
  • channels.imessage.allowFrom
  • 配对审批(openclaw pairing list imessage
检查:
  • channels.imessage.groupPolicy
  • channels.imessage.groupAllowFrom
  • channels.imessage.groups 允许列表行为
  • 提及模式配置(agents.list[].groupChat.mentionPatterns
检查:
  • channels.imessage.remoteHost
  • channels.imessage.remoteAttachmentRoots
  • 来自 Gateway 网关主机的 SSH/SCP 密钥认证
  • 主机密钥存在于 Gateway 网关主机上的 ~/.ssh/known_hosts
  • 运行 Messages 的 Mac 上远程路径可读
在同一用户/会话上下文中的交互式 GUI 终端中重新运行,并批准提示:
imsg chats --limit 1
imsg send <handle> "test"
确认运行 OpenClaw/imsg 的进程上下文已获得 Full Disk Access + Automation 权限。

配置参考指针

相关