iMessage (imsg)
状态:外部 CLI 集成。网关将通过 stdio 的 JSON-RPC 启动 imsg rpc。
快速设置(新手)
1) 确保此 Mac 上已登录 Messages。
2) 安装 imsg:
brew install steipete/tap/imsg3) 使用channels.imessage.cliPath和channels.imessage.dbPath配置 Clawdbot。 4) 启动网关并批准任何 macOS 的提示(自动化 + 全盘访问)。
最小配置:
json5
{
channels: {
imessage: {
enabled: true,
cliPath: “/usr/local/bin/imsg”,
dbPath: “/Users/
## 它是什么
- 基于 `imsg` 的 macOS 上的 iMessage 通道。
- 确定性路由:回复始终返回到 iMessage。
- 私信共享代理的主要会话;群组是隔离的 (`agent:<agentId>:imessage:group:<chat_id>`)。
- 如果一个多方参与的线程传入 `is_group=false`,你仍然可以通过 `chat_id` 使用 `channels.imessage.groups` 进行隔离(参见下面的“类似群组的线程”)。
## 配置写入
默认情况下,iMessage 允许通过 `/config set|unset` 触发的配置更新(需要 `commands.config: true`)。
禁用方法为:```json5
{
channels: { imessage: { configWrites: false } }
}
```
## 要求
- macOS 并且已登录 Messages。
- Clawdbot 对 `imsg`(Messages 数据库访问)具有完全磁盘访问权限。
- 发送时需要自动化权限。
- `channels.imessage.cliPath` 可以指向任何可以代理 stdin/stdout 的命令(例如,一个通过 SSH 连接到另一台 Mac 并运行 `imsg rpc` 的包装脚本)。
## 设置(快速路径)
1) 确保此 Mac 上已登录 Messages。
2) 配置 iMessage 并启动网关。
### 专用机器人 macOS 用户(用于隔离身份)
如果你想让机器人使用一个 **独立的 iMessage 身份**(并保持你个人的 Messages 账户干净),请使用一个专用的 Apple ID 和一个专用的 macOS 用户。
1) 创建一个专用的 Apple ID(例如:`my-cool-bot@icloud.com`)。
- Apple 可能需要一个电话号码用于验证 / 两步验证。
2) 创建一个 macOS 用户(例如:`clawdshome`)并登录该用户。
3) 在该 macOS 用户中打开 Messages 并使用机器人 Apple ID 登录 iMessage。
4) 启用远程登录(系统设置 → 通用 → 共享 → 远程登录)。
5) 安装 `imsg`:
- `brew install steipete/tap/imsg`
6) 配置 SSH,使得 `ssh <bot-macos-user>@localhost true` 能够无需密码即可运行。
7) 将 `channels.imessage.accounts.bot.cliPath` 指向一个 SSH 包装脚本,该脚本以机器人用户身份运行 `imsg`。
首次运行注意事项:发送/接收可能需要在 *机器人 macOS 用户* 中进行 GUI 批准(自动化权限 + 完全磁盘访问)。如果 `imsg rpc` 看起来卡住或退出,请登录该用户(屏幕共享有助于操作),运行一次 `imsg chats --limit 1` / `imsg send ...`,批准提示,然后重试。
包装脚本示例(需 `chmod +x`)。将 `<bot-macos-user>` 替换为你的实际 macOS 用户名:
bash
#!/usr/bin/env bash
set -euo pipefail
# 首先运行一次交互式 SSH 以接受主机密钥:
# ssh <bot-macos-user>@localhost true
exec /usr/bin/ssh -o BatchMode=yes -o ConnectTimeout=5 -T <bot-macos-user>@localhost \
"/usr/local/bin/imsg" "$@"``````
示例配置:```json5
{
channels: {
imessage: {
enabled: true,
accounts: {
bot: {
name: "Bot",
enabled: true,
cliPath: "/path/to/imsg-bot",
dbPath: "/Users/<bot-macos-user>/Library/Messages/chat.db"
}
}
}
}
}
```
对于单账户设置,请使用平铺选项(`channels.imessage.cliPath`、`channels.imessage.dbPath`),而不是 `accounts` 映射。
### 远程/SSH 变体(可选)
如果你想在另一台 Mac 上使用 iMessage,请将 `channels.imessage.cliPath` 设置为在一个运行在远程 macOS 主机上的 SSH 会话中执行 `imsg` 的包装脚本。Clawdbot 仅需要标准输入输出。
bash
#!/usr/bin/env bash
exec ssh -T gateway-host imsg "$@"``````
**远程附件**:当 `cliPath` 通过 SSH 指向远程主机时,Messages 数据库中的附件路径会引用远程机器上的文件。Clawdbot 可以通过设置 `channels.imessage.remoteHost` 自动通过 SCP 获取这些文件:```json5
{
channels: {
imessage: {
cliPath: "~/imsg-ssh", // SSH wrapper to remote Mac
remoteHost: "user@gateway-host", // for SCP file transfer
includeAttachments: true
}
}
}
```
如果未设置 `remoteHost`,Clawdbot 会尝试通过解析你在包装脚本中的 SSH 命令来自动检测它。为了保证可靠性,建议进行显式配置。
#### 通过 Tailscale 连接远程 Mac(示例)
如果网关运行在 Linux 主机/虚拟机上,但 iMessage 必须在 Mac 上运行,Tailscale 是最简单的桥梁:网关通过 tailnet 与 Mac 通信,通过 SSH 运行 `imsg`,并将附件通过 SCP 传回。
┌──────────────────────────────┐ SSH (imsg rpc) ┌──────────────────────────┐
│ 网关主机(Linux/VM) │──────────────────────────────────▶│ 运行 Messages + imsg 的 Mac │
│ - clawdbot 网关 │ SCP(附件) │ - 已登录 Messages │
│ - channels.imessage.cliPath │◀──────────────────────────────────│ - 已启用远程登录 │
└──────────────────────────────┘ └──────────────────────────┘
▲
│ Tailscale tailnet(主机名或 100.x.y.z)
▼
user@gateway-host``````
混凝土配置示例(Tailscale 主机名):```json5
{
channels: {
imessage: {
enabled: true,
cliPath: "~/.clawdbot/scripts/imsg-ssh",
remoteHost: "bot@mac-mini.tailnet-1234.ts.net",
includeAttachments: true,
dbPath: "/Users/bot/Library/Messages/chat.db"
}
}
}
```
示例包装器(`~/.clawdbot/scripts/imsg-ssh`):
bash
#!/usr/bin/env bash
exec ssh -T bot@mac-mini.tailnet-1234.ts.net imsg "$@"
注意事项:
- 确保 Mac 已登录到 Messages,并且启用了远程登录(Remote Login)。
- 使用 SSH 密钥,使得 `ssh bot@mac-mini.tailnet-1234.ts.net` 可以无需提示直接登录。
- `remoteHost` 应该与 SSH 目标匹配,以便 SCP 可以获取附件。
多账号支持:使用 `channels.imessage.accounts` 进行每个账号的配置,并可选地设置 `name`。有关共享模式,请参阅 [`gateway/configuration`](/gateway/configuration#telegramaccounts--discordaccounts--slackaccounts--signalaccounts--imessageaccounts)。不要提交 `~/.clawdbot/clawdbot.json`(其中通常包含令牌)。
## 访问控制(私聊 + 群组)
私聊:
- 默认设置为 `channels.imessage.dmPolicy = "pairing"`。
- 未知发件人会收到一个配对码;消息在未获得批准前会被忽略(配对码在一小时后过期)。
- 批准方式:
- `clawdbot pairing list imessage`
1. `clawdbot pairing approve imessage <CODE>`
- 配对是 iMessage 私聊的默认令牌交换方式。详情请参阅:[配对](/start/pairing)
群组:
- `channels.imessage.groupPolicy = open | allowlist | disabled`。
- 当设置为 `allowlist` 时,`channels.imessage.groupAllowFrom` 控制谁可以在群组中触发消息。
- 提及控制使用 `agents.list[].groupChat.mentionPatterns`(或 `messages.groupChat.mentionPatterns`),因为 iMessage 没有原生的提及元数据。
- 多代理覆盖:在 `agents.list[].groupChat.mentionPatterns` 上为每个代理设置提及模式。
## 工作方式(行为)
- `imsg` 流式传输消息事件;网关将其标准化为统一的频道封装格式。
- 回复始终路由回相同的聊天 ID 或处理方式。
## 类群组线程(`is_group=false`)
某些 iMessage 线程可能有多个参与者,但由于 Messages 存储聊天标识符的方式,它们仍可能以 `is_group=false` 的形式出现。
如果你在 `channels.imessage.groups` 下显式配置了 `chat_id`,Clawdbot 会将该线程视为“群组”,用于:
- 会话隔离(独立的 `agent:<agentId>:imessage:group:<chat_id>` 会话密钥)
- 群组允许列表 / 提及控制行为
示例:
json5
{
channels: {
imessage: {
groupPolicy: "allowlist",
groupAllowFrom: ["+15555550123"],
groups: {
"42": { "requireMention": false }
}
}
}
}
这在您希望为特定线程提供隔离的个性/模型时很有用(参见 多代理路由)。关于文件系统隔离,请参见 沙箱。
媒体 + 限制
- 通过
channels.imessage.includeAttachments可选地接收附件。 - 媒体容量限制通过
channels.imessage.mediaMaxMb设置。
限制
- 出站文本会被分块为
channels.imessage.textChunkLimit(默认为 4000)。 - 可选的换行符分块:将
channels.imessage.chunkMode="newline"设置为在长度分块前按空行(段落边界)进行分割。 - 媒体上传受
channels.imessage.mediaMaxMb限制(默认为 16)。
地址 / 传递目标
推荐使用 chat_id 进行稳定路由:
chat_id:123(推荐)chat_guid:...chat_identifier:...- 直接联系方式:
imessage:+1555/sms:+1555/user@example.com
列出聊天:
imsg chats –limit 20 ``````
配置参考(iMessage)
完整配置:配置
提供者选项:
channels.imessage.enabled: 启用/禁用该频道。channels.imessage.cliPath:imsg的路径。channels.imessage.dbPath: Messages 数据库路径。channels.imessage.remoteHost: 当cliPath指向远程 Mac 时,用于 SCP 附件传输的 SSH 主机(例如user@gateway-host)。如果没有设置,将从 SSH 包装器中自动检测。channels.imessage.service:imessage | sms | auto。channels.imessage.region: SMS 区域。channels.imessage.dmPolicy:pairing | allowlist | open | disabled(默认:pairing)。channels.imessage.allowFrom: DM 允许列表(可以是 handles、emails、E.164 号码,或chat_id:*)。open需要设置为"*"。iMessage 没有用户名;请使用 handles 或 chat 目标。channels.imessage.groupPolicy:open | allowlist | disabled(默认:allowlist)。channels.imessage.groupAllowFrom: 群组发送者允许列表。channels.imessage.historyLimit/channels.imessage.accounts.*.historyLimit: 最多包含的群组消息数量作为上下文(0 表示禁用)。channels.imessage.dmHistoryLimit: DM 历史记录限制(用户轮次)。支持按用户覆盖:channels.imessage.dms["<handle>"].historyLimit。channels.imessage.groups: 每个群组的默认值 + 允许列表(使用"*"表示全局默认值)。channels.imessage.includeAttachments: 将附件纳入上下文。channels.imessage.mediaMaxMb: 入站/出站媒体容量(MB)。channels.imessage.textChunkLimit: 出站分块大小(字符数)。channels.imessage.chunkMode: 分块方式,length(默认)或newline(在长度分块前按空行分割,即段落边界)。
相关全局选项:
agents.list[].groupChat.mentionPatterns(或messages.groupChat.mentionPatterns)。messages.responsePrefix。