Mainstream messaging
iMessage
狀態:原生外部命令列介面整合。閘道會啟動 imsg rpc,並透過 stdio 使用 JSON-RPC 通訊——不需要獨立的常駐程式或連接埠。強烈建議使用 Private API 模式,以獲得完整的 iMessage 頻道功能;回覆、點按回應、特效、投票、附件回覆和群組操作都需要 imsg launch,且 Private API 探測必須成功。
對於常見的本機設定,OpenClaw 設定流程可在已登入「訊息」的 Mac 上,經使用者確認後透過 Homebrew 安裝或更新 imsg。手動設定與 SSH 包裝程式拓撲仍由操作人員管理:請在將執行閘道或包裝程式的相同使用者環境中安裝或更新 imsg。
回覆、點按回應、特效、投票、附件和群組管理。
iMessage 私訊預設使用配對模式。
當閘道未在「訊息」Mac 上執行時,請使用 SSH 包裝程式。
完整的 iMessage 欄位參考。
快速設定
本機 Mac(快速路徑)
安裝並驗證 imsg
brew install steipete/tap/imsgbrew update && brew upgrade imsgimsg rpc --helpimsg launchopenclaw channels status --probe當本機設定精靈偵測到缺少預設的 imsg 命令時,可以提示透過 Homebrew 安裝 steipete/tap/imsg。如果偵測到由 Homebrew 管理的 imsg,則可以提示重新安裝或更新。自訂的 cliPath 包裝程式不會被修改。
設定 OpenClaw
{channels: {imessage: {enabled: true,cliPath: "/usr/local/bin/imsg",dbPath: "/Users/user/Library/Messages/chat.db",},},}啟動閘道
openclaw gateway核准第一個私訊配對(預設 dmPolicy)
openclaw pairing list imessageopenclaw pairing approve imessage <CODE>配對要求會在 1 小時後到期。
透過 SSH 使用遠端 Mac
大多數設定不需要 SSH。只有在閘道無法於已登入「訊息」的 Mac 上執行時,才使用此拓撲。OpenClaw 只需要與 stdio 相容的 cliPath,因此可以將 cliPath 指向一個包裝指令碼,由它透過 SSH 連線至遠端 Mac 並執行 imsg。
請在該遠端 Mac 上安裝及更新 imsg,而不是在閘道主機上:
ssh messages-mac 'brew install steipete/tap/imsg && brew update && brew upgrade imsg'#!/usr/bin/env bashexec ssh -T messages-mac imsg "$@"啟用附件時的建議設定:
{channels: {imessage: { enabled: true, cliPath: "~/.openclaw/scripts/imsg-ssh", remoteHost: "user@gateway-host", // used for SCP attachment fetches includeAttachments: true, // Optional: extra allowed attachment roots (merged with the default // /Users/*/Library/Messages/Attachments). attachmentRoots: ["/Users/*/Library/Messages/Attachments"], remoteAttachmentRoots: ["/Users/*/Library/Messages/Attachments"],},},}如果未設定 remoteHost,OpenClaw 會嘗試剖析 SSH 包裝指令碼來自動偵測。
remoteHost 必須是 host 或 user@host(不可包含空格或 SSH 選項);不安全的值會被忽略。
OpenClaw 會對 SCP 使用嚴格的主機金鑰檢查,因此中繼主機金鑰必須已存在於 ~/.ssh/known_hosts 中。
附件路徑會依據允許的根目錄(attachmentRoots / remoteAttachmentRoots)進行驗證。
需求與權限(macOS)
- 在執行
imsg的 Mac 上,必須登入「訊息」。 - 執行 OpenClaw/
imsg的程序環境需要「完整磁碟存取權限」(用於存取「訊息」資料庫)。 - 透過 Messages.app 傳送訊息需要「自動化」權限。
- 若要使用進階操作(回應/編輯/收回/討論串回覆/特效/投票/群組操作),必須停用「系統完整性保護」——請參閱啟用 imsg Private API。不停用也能使用基本的文字與媒體收發功能。
SSH 包裝程式傳送失敗並顯示 AppleEvents -1743
遠端 SSH 設定可能可以讀取聊天、通過 channels status --probe 並處理輸入訊息,但輸出傳送仍會因 AppleEvents 授權錯誤而失敗:
Not authorized to send Apple events to Messages. (-1743)請檢查已登入 Mac 使用者的 TCC 資料庫,或開啟 System Settings > Privacy & Security > Automation。如果「自動化」項目是記錄給 /usr/libexec/sshd-keygen-wrapper,而不是 imsg 或本機 Shell 程序,macOS 可能不會為該 SSH 伺服器端用戶端提供可用的「訊息」切換開關:
kTCCServiceAppleEvents | /usr/libexec/sshd-keygen-wrapper | auth_value=0 | com.apple.MobileSMS在此狀態下,重複執行 tccutil reset AppleEvents,或透過相同 SSH 包裝程式重新執行 imsg send,可能仍會失敗,因為需要「訊息」自動化權限的程序環境是 SSH 包裝程式,而不是 UI 可以授權的應用程式。
請改用下列其中一種受支援的 imsg 程序環境:
- 在已登入「訊息」的使用者本機工作階段中執行閘道,或至少執行
imsg橋接器。 - 從相同工作階段授予「完整磁碟存取權限」和「自動化」權限後,以該使用者的 LaunchAgent 啟動閘道。
- 如果保留雙使用者 SSH 拓撲,請在啟用頻道前,確認實際的輸出
imsg send可透過完全相同的包裝程式成功傳送。如果無法授予「自動化」權限,請重新設定為單一使用者的imsg設定,而不要依賴 SSH 包裝程式進行傳送。
啟用 imsg Private API
imsg 提供兩種運作模式。對 OpenClaw 而言,建議使用 Private API 模式,因為它能讓頻道提供使用者期望的原生 iMessage 操作。基本模式仍適用於低風險安裝、初始驗證,或無法停用 SIP 的主機。
- 基本模式(預設,無需變更 SIP):透過
send傳送文字與媒體、監看/取得輸入歷史記錄,以及列出聊天。全新安裝brew install steipete/tap/imsg並授予上述標準 macOS 權限後,即可直接使用這些功能。 - Private API 模式:
imsg會將輔助 dylib 注入Messages.app,以呼叫內部的IMCore函式。這會解鎖react、edit、unsend、reply(討論串)、sendWithEffect、poll和poll-vote(「訊息」原生投票)、renameGroup、setGroupIcon、addParticipant、removeParticipant、leaveGroup,以及輸入中指示器和已讀回條。
本頁建議的操作介面需要 Private API 模式。imsg README 明確說明了這項要求:
read、typing、launch、由橋接器支援的豐富傳送功能、訊息修改及聊天管理等進階功能皆為選用功能。這些功能需要停用 SIP,並將輔助 dylib 注入Messages.app。啟用 SIP 時,imsg launch會拒絕注入。
此輔助程式注入技術使用 imsg 自己的 dylib 來存取「訊息」的 Private API。OpenClaw iMessage 路徑中沒有第三方伺服器或 BlueBubbles 執行階段。
設定
-
在執行 Messages.app 的 Mac 上安裝(或升級)
imsg:bash brew install steipete/tap/imsgbrew update && brew upgrade imsgimsg --versionimsg status --jsonimsg status --json輸出會回報bridge_version、rpc_methods,以及各方法的selectors,讓你在開始前就能查看目前版本支援哪些功能。 -
停用系統完整性保護,並且(在現代 macOS 上)停用程式庫驗證。 將非 Apple 的輔助 dylib 注入由 Apple 簽署的
Messages.app,需要關閉 SIP,並且放寬程式庫驗證。復原模式中的 SIP 步驟會因 macOS 版本而異:- **macOS 10.13-10.15(Sierra-Catalina):**透過終端機停用程式庫驗證,重新啟動至復原模式,執行
csrutil disable,然後重新啟動。 - **macOS 11+(Big Sur 及更新版本),Intel:**進入復原模式(或網際網路復原),執行
csrutil disable,然後重新啟動。 - **macOS 11+,Apple Silicon:**使用電源按鈕啟動流程進入復原模式;在近期的 macOS 版本中,按一下 Continue 時按住 Left Shift 鍵,然後執行
csrutil disable。虛擬機器設定採用不同的流程,因此請先建立 VM 快照。
在 macOS 11 及更新版本上,只有
csrutil disable通常不夠。 Apple 仍會將Messages.app視為平台二進位檔並對其強制執行程式庫驗證,因此即使關閉 SIP,臨時簽署的輔助程式仍會遭到拒絕(Library Validation failed: ... platform binary, but mapped file is not)。停用 SIP 後,也請停用程式庫驗證並重新啟動:bash sudo defaults write /Library/Preferences/com.apple.security.libraryvalidation.plist DisableLibraryValidation -bool true**macOS 26(Tahoe),已於 26.5.1 驗證:**關閉 SIP 加上上述
DisableLibraryValidation命令,就足以在 26.0 至 26.5.x 之間注入輔助程式。不需要任何 boot-args。 此 plist 是決定性因素,也是 Tahoe 注入失敗時最常遺漏的步驟:- 有 plist 時:
imsg launch會完成注入,且imsg status會回報advanced_features: true。 - 沒有 plist 時(即使已關閉 SIP):
imsg launch會失敗並顯示Failed to launch: Timeout waiting for Messages.app to initialize。AMFI 會在載入時拒絕臨時簽署的輔助程式,因此橋接器永遠無法就緒,啟動作業最終會逾時。這個逾時是大多數人在 Tahoe 上遇到的症狀;解法是使用上述 plist,而不是採取更激進的措施。
如果在 macOS 升級後,
imsg launch注入或特定selectors開始傳回 false,通常是這個閘門所致。在認定 SIP 步驟本身失敗前,請先檢查 SIP 和程式庫驗證狀態。如果這些設定正確,但橋接器仍無法注入,請收集imsg status --json以及imsg launch的輸出,並向imsg專案回報,而不要進一步削弱其他全系統安全控制。 - **macOS 10.13-10.15(Sierra-Catalina):**透過終端機停用程式庫驗證,重新啟動至復原模式,執行
-
注入輔助程式。 在已停用 SIP 且 Messages.app 已登入的情況下:
bash imsg launchSIP 仍啟用時,
imsg launch會拒絕注入,因此這也可同時確認步驟 2 已生效。 -
從 OpenClaw 驗證橋接器:
bash openclaw channels status --probeiMessage 項目應回報
works,且imsg status --json | jq '{rpc_methods, selectors}'應顯示你的 macOS 組建所提供的功能。建立投票需要selectors.pollPayloadMessage;投票則同時需要selectors.pollVoteMessage和poll.voteRPC 方法。OpenClaw 外掛只會公告快取探測所支援的動作,而空白快取會保持樂觀,並在首次分派時進行探測。
如果 openclaw channels status --probe 將頻道回報為 works,但特定動作在分派時擲回「iMessage <action> requires the imsg private API bridge」,請再次執行 imsg launch——輔助程式可能會脫離(Messages.app 重新啟動、作業系統更新等),而快取的 available: true 狀態會持續公告動作,直到下一次探測重新整理。
SIP 保持啟用時
如果你的威脅模型無法接受停用 SIP:
imsg會退回基本模式——僅支援文字、媒體與接收。- OpenClaw 外掛仍會公告文字/媒體傳送及入站監控;它會從動作介面隱藏
react、edit、unsend、reply、sendWithEffect和群組操作(依各方法的功能閘門而定)。 - 你可以使用另一台已關閉 SIP 的非 Apple Silicon Mac(或專用機器人 Mac)處理 iMessage 工作負載,同時讓主要裝置維持 SIP 啟用。請參閱下方的專用機器人 macOS 使用者(獨立的 iMessage 身分)。
存取控制與路由
私訊政策
channels.imessage.dmPolicy 控制直接訊息:
pairing(預設)allowlist(至少需要一個allowFrom項目)open(需要allowFrom包含"*")disabled
允許清單欄位:channels.imessage.allowFrom。
允許清單項目必須識別傳送者:控制代碼或靜態傳送者存取群組(accessGroup:<name>)。對 chat_id:*、chat_guid:* 或 chat_identifier:* 等聊天目標使用 channels.imessage.groupAllowFrom;對數字型 chat_id 登錄機碼使用 channels.imessage.groups。
群組政策與提及
channels.imessage.groupPolicy 控制群組處理:
allowlist(預設)opendisabled
群組傳送者允許清單:channels.imessage.groupAllowFrom。
groupAllowFrom 項目也可以參照靜態傳送者存取群組(accessGroup:<name>)。
執行階段後援:如果未設定 groupAllowFrom,iMessage 群組傳送者檢查會使用 allowFrom;當私訊與群組准入應有所不同時,請設定 groupAllowFrom。明確設為空白的 groupAllowFrom: [] 不會後援——它會在 allowlist 下封鎖所有群組傳送者。
執行階段注意事項:如果完全缺少 channels.imessage,執行階段會退回 groupPolicy="allowlist" 並記錄警告(即使已設定 channels.defaults.groupPolicy)。
群組的提及閘門:
- iMessage 沒有原生提及中繼資料
- 提及偵測使用規則運算式模式(
agents.entries.*.groupChat.mentionPatterns,後援為messages.groupChat.mentionPatterns) - 未設定模式時,無法強制執行提及閘門
- 來自已授權傳送者的控制命令會略過提及閘門
個別群組的 systemPrompt:
channels.imessage.groups.* 下的每個項目都接受選用的 systemPrompt 字串;每當處理該群組中的訊息時,此字串都會注入代理程式的系統提示詞。解析方式與 channels.whatsapp.groups 相同:
- 群組專屬系統提示詞(
groups["<chat_id>"].systemPrompt):當對應表中存在特定群組項目,且已定義其systemPrompt鍵時使用。如果systemPrompt是空字串(""),則會抑制萬用字元,且不會對該群組套用任何系統提示詞。 - 群組萬用字元系統提示詞(
groups["*"].systemPrompt):當對應表中完全沒有特定群組項目,或該項目存在但未定義systemPrompt鍵時使用。
{ channels: { imessage: { groupPolicy: "allowlist", groupAllowFrom: ["+15555550123"], groups: { "*": { systemPrompt: "使用英式拼字。" }, "8421": { requireMention: true, systemPrompt: "這是值班輪調聊天。回覆請勿超過 3 句。", }, "9907": { // 明確抑制:萬用字元「使用英式拼字。」不會套用於此處 systemPrompt: "", }, }, }, },}個別群組提示詞只會套用於群組訊息——直接訊息不受影響。
工作階段與確定性回覆
- 私訊使用直接路由;群組使用群組路由。
- 使用預設的
session.dmScope=main時,iMessage 私訊會合併至代理程式的主要工作階段。 - 群組工作階段會彼此隔離(
agent:<agentId>:imessage:group:<chat_id>)。 - 回覆會使用來源頻道/目標中繼資料路由回 iMessage。
類群組討論串的行為:
部分多人參與的 iMessage 討論串可能會隨 is_group=false 抵達。
如果該 chat_id 已在 channels.imessage.groups 下明確設定,OpenClaw 會將其視為群組流量(群組閘門與群組工作階段隔離)。
ACP 對話綁定
iMessage 聊天可以綁定至 ACP 工作階段。
快速操作流程:
- 在私訊或允許的群組聊天中執行
/acp spawn codex --bind here。 - 之後同一個 iMessage 對話中的訊息會路由至已產生的 ACP 工作階段。
/new和/reset會就地重設同一個已綁定的 ACP 工作階段。/acp close會關閉 ACP 工作階段並移除綁定。
設定的持續性綁定使用頂層 bindings[] 項目,並搭配 type: "acp" 和 match.channel: "imessage"。
match.peer.id 可以使用:
- 正規化的私訊控制代碼,例如
+15555550123或user@example.com chat_id:<id>(建議用於穩定的群組綁定)chat_guid:<guid>chat_identifier:<identifier>
範例:
{ 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 代理程式。
部署模式
專用機器人 macOS 使用者(獨立的 iMessage 身分)
使用專用 Apple ID 和 macOS 使用者,將機器人流量與你的個人 Messages 設定檔隔離。
一般流程:
- 建立/登入專用的 macOS 使用者。
- 在該使用者中,使用機器人的 Apple ID 登入「訊息」。
- 在該使用者中安裝
imsg。 - 建立 SSH 包裝程式,讓 OpenClaw 能在該使用者的環境中執行
imsg。 - 將
channels.imessage.accounts.<id>.cliPath和.dbPath指向該使用者設定檔。
第一次執行時,可能需要在該機器人使用者工作階段的圖形介面中核准權限(自動化 + 完整磁碟存取權)。
透過 Tailscale 連線至遠端 Mac(範例)
常見拓撲:
- 閘道在 Linux/VM 上執行
- iMessage +
imsg在你 tailnet 中的 Mac 上執行 cliPath包裝程式使用 SSH 執行imsgremoteHost啟用透過 SCP 擷取附件
範例:
{ channels: { imessage: { enabled: true, cliPath: "~/.openclaw/scripts/imsg-ssh", remoteHost: "bot@mac-mini.tailnet-1234.ts.net", includeAttachments: true, dbPath: "/Users/bot/Library/Messages/chat.db", }, },}#!/usr/bin/env bashexec ssh -T bot@mac-mini.tailnet-1234.ts.net imsg "$@"使用 SSH 金鑰,讓 SSH 和 SCP 都能以非互動方式執行。
請先確保主機金鑰已受信任(例如 ssh bot@mac-mini.tailnet-1234.ts.net),以便填入 known_hosts。
多帳號模式
iMessage 支援在 channels.imessage.accounts 下設定各帳號。
每個帳號都能覆寫 cliPath、dbPath、allowFrom、groupPolicy、mediaMaxMb、歷史記錄設定和附件根目錄允許清單等欄位。
私人訊息歷史記錄
設定 channels.imessage.dmHistoryLimit,以使用該對話最近解碼的 imsg 歷史記錄,作為新私人訊息工作階段的初始內容。使用 channels.imessage.dms["<sender>"].historyLimit 設定各傳送者的覆寫值,包括使用 0 停用某位傳送者的歷史記錄。
iMessage 私人訊息歷史記錄會視需要從 imsg 擷取。若未設定 dmHistoryLimit,將停用全域私人訊息歷史記錄的初始填入;但若某位傳送者的 channels.imessage.dms["<sender>"].historyLimit 為正值,仍會為該傳送者啟用初始填入。
媒體、分段與傳送目標
附件與媒體
- 傳入附件的擷取功能預設為關閉 — 設定
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.streaming.chunkModelength(預設)newline(優先依段落分割)
- 傳出 Markdown 的粗體/斜體/底線/刪除線會轉換成原生樣式文字(macOS 15+ 的收件者會顯示樣式;較舊版本的收件者會看到不含標記的純文字);Markdown 表格會依照頻道的 Markdown 表格模式轉換
channels.imessage.sendTransport(auto為預設值,另有bridge、applescript)選擇imsg傳送訊息的方式
定址格式
建議使用明確目標:
chat_id:123(建議用於穩定路由)chat_guid:...chat_identifier:...
也支援帳號代稱目標:
imessage:+1555...sms:+1555...user@example.com
imsg chats --limit 20私有 API 動作
當 imsg launch 正在執行,且 openclaw channels status --probe 回報 privateApi.available: true 時,訊息工具除了傳送一般文字外,還能使用 iMessage 原生動作。
所有動作預設皆已啟用;使用 channels.imessage.actions 可個別關閉動作:
{ 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:新增/移除 iMessage 點按回應(
messageId、emoji、remove)。支援的點按回應對應愛心、讚、倒讚、大笑、強調和疑問。不指定表情符號即執行移除時,會清除目前設定的任何點按回應。 - reply:對現有訊息傳送討論串回覆(
messageId、text或message,以及chatGuid、chatId、chatIdentifier或to)。回覆並附加附件還需要使用其send-rich支援--file的imsg組建版本。 - sendWithEffect:使用 iMessage 特效傳送文字(
text或message、effect或effectId)。短名稱:slam、loud、gentle、invisibleink、confetti、lasers、fireworks、balloon、heart、echo、happybirthday、shootingstar、sparkles、spotlight。 - edit:在支援的 macOS/私有 API 版本上編輯已傳送的訊息(
messageId、text或newText)。只能編輯由閘道本身傳送的訊息。 - unsend:在支援的 macOS/私有 API 版本上收回已傳送的訊息(
messageId)。只能收回由閘道本身傳送的訊息。 - upload-file:傳送媒體/檔案(
buffer使用 base64,或已載入的media/path/filePath、filename,以及選用的asVoice)。舊版別名:sendAttachment。 - renameGroup、setGroupIcon、addParticipant、removeParticipant、leaveGroup:目前目標為群組對話時管理群組聊天。這些動作會變更主機的「訊息」身分,因此需要擁有者傳送者或
operator.admin閘道用戶端。 - poll:建立原生 Apple「訊息」投票(
pollQuestion、重複 2 至 12 次的pollOption,以及chatGuid、chatId、chatIdentifier或to)。使用 iOS/iPadOS/macOS 26+ 的收件者可直接查看並投票;較舊的作業系統版本會收到「Sent a poll」文字備援訊息。需要selectors.pollPayloadMessage。 - poll-vote:對現有投票進行投票(
pollId或messageId,以及pollOptionIndex、pollOptionId或pollOptionText中恰好一項)。需要selectors.pollVoteMessage和poll.voteRPC 方法。
已接受的傳入投票會呈現給代理程式,其中包含問題、編號的選項標籤、票數,以及 poll-vote 所需的投票訊息 ID。
訊息 ID
傳入的 iMessage 環境資訊會同時包含簡短的 MessageSid 值,以及可用時的完整訊息 GUID(MessageSidFull)。簡短 ID 的有效範圍僅限近期以 SQLite 為後端的回覆快取,使用前會先核對目前的聊天。如果簡短 ID 已過期,請在以提供該 ID 的對話為目標時,改用其 MessageSidFull 重試。完整 ID 不會略過對話或帳號繫結,因此若 ID 來自其他聊天,請換成目前目標中的 ID。當無法取得目前對話的證據時,遠端委派呼叫可能會拒絕過時的完整 ID。
功能偵測
OpenClaw 只會在快取的探查狀態指出橋接器無法使用時,隱藏私有 API 動作。如果狀態未知,動作仍會顯示,且會在分派時延遲探查,使 imsg launch 之後的第一個動作無須另外手動重新整理狀態即可成功。
已讀回條與輸入狀態
私有 API 橋接器啟用時,已接受的傳入聊天會標示為已讀;而在回合獲接受後,私人聊天會立即顯示輸入中的氣泡,同時代理程式準備環境資訊並產生內容。若要停用標示已讀:
{ channels: { imessage: { sendReadReceipts: false, }, },}在各方法功能清單出現前的舊版 imsg 組建版本中,輸入狀態/已讀功能會在無提示的情況下遭到停用;OpenClaw 每次重新啟動時會記錄一次警告,以便判斷未收到回條的原因。
傳入點按回應
OpenClaw 會訂閱 iMessage 點按回應,並將已接受的回應作為系統事件路由,而非一般訊息文字,因此使用者的點按回應不會觸發一般回覆迴圈。
通知模式由 channels.imessage.reactionNotifications 控制:
"own"(預設):僅在使用者回應機器人撰寫的訊息時通知。"all":針對已授權傳送者的所有傳入點按回應發出通知。"off":忽略傳入點按回應。
各帳號的覆寫值使用 channels.imessage.accounts.<id>.reactionNotifications。
核准回應(👍 / 👎)
當 approvals.exec.enabled 或 approvals.plugin.enabled 為 true,且要求路由至 iMessage 時,閘道會以原生方式傳送核准提示,並接受點按回應以完成處理:
👍(讚點按回應)→allow-once👎(倒讚點按回應)→denyallow-always仍可作為手動備援:將/approve <id> allow-always作為一般回覆傳送。
回應處理要求做出回應之使用者的帳號代稱必須明確列為核准者。核准者清單讀取自 channels.imessage.allowFrom(或 channels.imessage.accounts.<id>.allowFrom);請加入使用者採 E.164 格式的電話號碼或其 Apple ID 電子郵件地址(chat_id:* 等聊天目標不是有效的核准者項目)。支援萬用字元項目 "*",但這會允許任何傳送者核准;空白核准者清單會完全停用回應捷徑。回應捷徑會刻意略過 reactionNotifications、dmPolicy 和 groupAllowFrom,因為明確核准者允許清單是完成核准時唯一重要的閘門。
/approve 文字命令授權遵循相同清單:當 channels.imessage.allowFrom 不為空時,會依據該核准者清單授權 /approve <id> <decision>(而非較廣泛的私人訊息允許清單),且私人訊息允許清單允許、但不在 allowFrom 中的傳送者會收到明確的拒絕訊息。當 allowFrom 為空時,同一聊天備援會維持生效,且 /approve 會授權私人訊息允許清單所允許的所有人。請將所有應能核准的操作員(無論透過 /approve 或回應)加入 allowFrom。
Operator 注意事項:
- 回應綁定會同時儲存在記憶體與閘道的持久化鍵值儲存區中(TTL 與核准到期時間一致),而且閘道也會輪詢待處理提示中的 tapback,因此即使 tapback 在閘道重新啟動後不久才送達,仍可完成核准。
- 當操作者自己的
is_from_me=truetapback(例如來自已配對的 Apple 裝置)所使用的識別代號是明確指定的核准者時,便可完成核准。 - 只有在已設定明確核准者時,核准提示才會路由至群組對話;否則任何群組成員都可能核准。
- 舊版文字樣式的 tapback(
Liked "…",來自非常舊的 Apple 用戶端的純文字)無法完成核准,因為其中不含訊息 GUID;回應解析需要目前 macOS / iOS 用戶端所發出的結構化 tapback 中繼資料。
問題回應(1️⃣ / 2️⃣ / 3️⃣ / 4️⃣)
對於含有一個非機密單選問題及一至四個選項的 ask_user 提示,OpenClaw 會加入編號表情符號選項。請以相符的數字回應已送達的提示來作答。該回應必須包含由機器人撰寫之訊息的穩定 GUID;OpenClaw 隨後會透過閘道將數字對應至標準選項。過期或重複的點按會被忽略。
多問題、多選及自由文字提示仍只能透過文字回覆。問題回應遵循一般 iMessage 私訊/群組准入規則。即使一般 reactionNotifications 為 "off",仍會辨識這類回應,而不會將無關回應轉為代理程式事件。
設定寫入
iMessage 預設允許由頻道發起設定寫入(適用於 /config set|unset 為 commands.config: true 時)。
停用:
{ channels: { imessage: { configWrites: false, }, },}合併分開傳送的私訊(在同一次撰寫中包含命令與 URL)
Apple 可能會將命令及其 URL 預覽儲存為不同的實體 chat.db 資料列。imsg 0.13.1 以上版本會在監看、歷程記錄或搜尋傳回訊息前合併這些資料列,因此 OpenClaw 會收到一則邏輯上的入站訊息,而不需增加頻道特定的私訊延遲。
不需設定任何 iMessage 合併選項。已停用的 channels.imessage.coalesceSameSenderDms 鍵會由 openclaw doctor --fix 移除。若你有意將某個頻道中快速連續傳送的文字訊息批次處理,仍可使用通用 messages.inbound 防彈跳機制。
如果命令加 URL 的傳送內容成為不同的代理程式輪次,請在 Messages Mac 上更新 imsg:
brew update && brew upgrade imsg橋接器或閘道重新啟動後的入站復原
iMessage 會復原閘道停機期間遺漏的訊息,同時抑制 Apple 在 Push 復原後可能一次排出的過期「積壓轟炸」。此預設行為一律啟用,建構於持久入站機制與存留時間界線之上。
- 持久化重播防護。 在推進復原游標之前,OpenClaw 會將每個原始資料列記錄至共用 SQLite 入站佇列,並以其 Apple GUID 作為事件 ID。已完成的資料列會留下約 4 小時的墓碑記錄,上限為 10,000 筆,因此即使重新啟動後,以相同 GUID 重播的項目仍會被捨棄。待處理資料列則會持續保持可復原狀態,直到分派流程接管為止。
- 停機復原。 啟動時,監視器會記住最後一個已持久化准入之
chat.db資料列的 rowid(每個帳號各自持久保存的游標),並將其以since_rowid傳給imsg watch.subscribe,讓 imsg 重播尚未記錄的資料列,之後再接續追蹤即時資料。當機前已記錄的資料列會從 SQLite 恢復。重播僅限最近 500 個資料列,以及最長約 2 小時前的訊息;GUID 墓碑記錄則會捨棄任何已處理項目。 - 過期積壓的存留時間界線。 高於啟動界線的資料列確實是即時資料;若其傳送日期比抵達時間早超過約 15 分鐘,則屬於 Push 一次排出的積壓資料,會受到抑制。重播資料列(位於界線或界線以下)則使用較寬的復原時間範圍,因此近期遺漏的訊息會送達,而年代久遠的歷程記錄不會送達。
復原功能同時適用於本機與遠端 cliPath 設定,因為 since_rowid 重播會透過同一個 imsg RPC 連線執行。兩者差異在於時間範圍:當閘道可讀取 chat.db(本機)時,會以此錨定啟動時的 rowid 界線、限制重播範圍,並送達最長數小時前遺漏的訊息。透過遠端 SSH cliPath 時,閘道無法讀取資料庫,因此重播範圍不受限制,且每個資料列都使用即時存留時間界線——它仍會復原近期遺漏的訊息並抑制舊積壓,只是採用較窄的即時時間範圍。若要使用較寬的復原時間範圍,請在 Messages Mac 上執行閘道。
操作者可見的訊號
受到抑制的積壓會以預設層級記錄,絕不會在未留下記錄的情況下捨棄(recovery 旗標會顯示套用的時間範圍):
imessage: suppressed stale inbound backlog account=<id> sent=<iso> recovery=<bool> (<N> suppressed since start)移轉
channels.imessage.catchup.* 已棄用——停機復原會自動執行,新設定不需要任何組態。含有 catchup.enabled: true 的現有組態仍會作為復原重播時間範圍的相容性設定檔予以採用。已停用的追補區塊(enabled: false 或沒有 enabled: true)已停用;openclaw doctor --fix 會將其移除。
疑難排解
找不到 imsg 或不支援 RPC
驗證二進位檔及 RPC 支援:
imsg rpc --helpimsg status --jsonopenclaw channels status --probe如果探測回報不支援 RPC,請更新 imsg。如果無法使用私有 API 動作,請在已登入的 macOS 使用者工作階段中執行 imsg launch,然後再次探測。如果閘道並非在 macOS 上執行,請改用上方的「透過 SSH 使用遠端 Mac」設定,而非預設的本機 imsg 路徑。
訊息可以傳送,但入站 iMessage 未送達
首先確認訊息是否已抵達本機 Mac。如果 chat.db 沒有變化,即使 imsg status --json 回報橋接器狀態正常,OpenClaw 也無法接收訊息。
imsg chats --limit 10 --jsonimsg watch --chat-id <chat-id> --jsonsqlite3 ~/Library/Messages/chat.db \"select datetime(max(date)/1000000000 + 978307200, 'unixepoch', 'localtime'), max(ROWID) from message;"如果從手機傳送的訊息未建立新資料列,請先修復 macOS Messages 與 Apple Push 層,再變更 OpenClaw 組態。通常一次性的服務重新整理便已足夠:
launchctl kickstart -k system/com.apple.apsdlaunchctl kickstart -k gui/$(id -u)/com.apple.CommCenterlaunchctl kickstart -k gui/$(id -u)/com.apple.identityservicesdlaunchctl kickstart -k gui/$(id -u)/com.apple.imagentimsg launchopenclaw gateway restart從手機傳送一則新的 iMessage,並在偵錯 OpenClaw 工作階段之前,確認出現新的 chat.db 資料列或 imsg watch 事件。請勿將此操作設為定期執行的橋接器重新啟動迴圈;在工作進行期間反覆執行 imsg launch 並重新啟動閘道,可能中斷傳遞並使進行中的頻道執行流程擱置。
閘道並非在 macOS 上執行
預設的 cliPath: "imsg" 必須在已登入 Messages 的 Mac 上執行。在 Linux 或 Windows 上,請將 channels.imessage.cliPath 設定為包裝函式指令碼,透過 SSH 連線至該 Mac 並執行 imsg "$@"。
#!/usr/bin/env bashexec ssh -T messages-mac imsg "$@"然後執行:
openclaw channels status --probe --channel imessage私訊遭到忽略
檢查:
channels.imessage.dmPolicychannels.imessage.allowFrom- 配對核准(
openclaw pairing list imessage)
群組訊息遭到忽略
檢查:
channels.imessage.groupPolicychannels.imessage.groupAllowFromchannels.imessage.groups允許清單行為- 提及模式組態(
agents.entries.*.groupChat.mentionPatterns)
遠端附件失敗
檢查:
channels.imessage.remoteHostchannels.imessage.remoteAttachmentRoots- 從閘道主機進行的 SSH/SCP 金鑰驗證
- 閘道主機上的
~/.ssh/known_hosts中存在主機金鑰 - 執行 Messages 的 Mac 上可讀取遠端路徑
錯過 macOS 權限提示
請在相同使用者/工作階段情境中的互動式 GUI 終端機內重新執行,並核准提示:
imsg chats --limit 1imsg send <handle> "test"確認執行 OpenClaw/imsg 的處理程序情境已獲授予「完全磁碟存取權」與「自動化」權限。
組態參考連結
相關內容
- 頻道概覽 — 所有支援的頻道
- 移除 BlueBubbles 與 imsg iMessage 路徑 — 公告與移轉摘要
- 從 BlueBubbles 移轉 — 組態轉換表與逐步切換流程
- 配對 — 私訊驗證與配對流程
- 群組 — 群組聊天行為與提及門控
- 頻道路由 — 訊息的工作階段路由
- 安全性 — 存取模型與強化措施