imessage đi kèm hiện truy cập cùng bề mặt API riêng tư như BlueBubbles (react, edit, unsend, reply, sendWithEffect, quản lý nhóm, tệp đính kèm) bằng cách điều khiển steipete/imsg qua JSON-RPC. Nếu bạn đã chạy một máy Mac có cài imsg, bạn có thể bỏ máy chủ BlueBubbles và để Plugin nói chuyện trực tiếp với Messages.app.
Hỗ trợ BlueBubbles đã bị loại bỏ. OpenClaw chỉ hỗ trợ iMessage thông qua imsg. Hướng dẫn này dành cho việc di chuyển cấu hình channels.bluebubbles cũ sang channels.imessage; không có đường dẫn di chuyển nào khác được hỗ trợ.
Để xem thông báo ngắn và tóm tắt dành cho người vận hành, hãy xem Việc loại bỏ BlueBubbles và đường dẫn imsg cho iMessage.
Danh sách kiểm tra di chuyển
Dùng danh sách kiểm tra này khi bạn đã biết cấu hình BlueBubbles cũ của mình và muốn đường dẫn an toàn ngắn nhất:- Xác minh trực tiếp
imsgtrên máy Mac chạy Messages.app (imsg chats,imsg history,imsg sendvàimsg rpc --help). - Sao chép các khóa hành vi từ
channels.bluebubblessangchannels.imessage:dmPolicy,allowFrom,groupPolicy,groupAllowFrom,groups,includeAttachments,attachmentRoots,mediaMaxMb,textChunkLimit,coalesceSameSenderDmsvàactions. - Loại bỏ các khóa truyền tải không còn tồn tại:
serverUrl,password, URL Webhook và thiết lập máy chủ BlueBubbles. - Nếu Gateway không chạy trên máy Mac Messages, hãy đặt
channels.imessage.cliPaththành một trình bao SSH và đặtremoteHostđể lấy tệp đính kèm từ xa. - Khi Gateway đã dừng, bật
channels.imessage, rồi chạyopenclaw channels status --probe --channel imessage. - Kiểm thử một DM, một nhóm được cho phép, tệp đính kèm nếu được bật, và mọi hành động API riêng tư mà bạn kỳ vọng tác nhân sẽ dùng.
- Xóa máy chủ BlueBubbles và cấu hình
channels.bluebubblescũ sau khi đường dẫn iMessage đã được xác minh.
Khi nào nên di chuyển theo cách này
- Bạn đã chạy
imsgtrên cùng máy Mac (hoặc một máy có thể truy cập qua SSH) nơi Messages.app đã đăng nhập. - Bạn muốn giảm một thành phần vận hành — không có máy chủ BlueBubbles riêng, không có endpoint REST cần xác thực, không có hệ thống Webhook. Một tệp nhị phân CLI duy nhất thay vì máy chủ + ứng dụng khách + trình trợ giúp.
- Bạn đang dùng một bản dựng macOS /
imsgđược hỗ trợ, nơi phép dò API riêng tư báo cáoavailable: true.
imsg làm gì
imsg là một CLI macOS cục bộ cho Messages. OpenClaw khởi động imsg rpc như một tiến trình con và giao tiếp JSON-RPC qua stdin/stdout. Không có máy chủ HTTP, URL Webhook, daemon nền, launch agent hay cổng nào cần mở.
- Dữ liệu đọc đến từ
~/Library/Messages/chat.dbbằng một handle SQLite chỉ đọc. - Tin nhắn đến trực tiếp đến từ
imsg watch/watch.subscribe, theo dõi các sự kiện hệ thống tệp củachat.dbvới cơ chế polling dự phòng. - Gửi tin nhắn sử dụng tự động hóa Messages.app cho văn bản thông thường và gửi tệp.
- Các hành động nâng cao sử dụng
imsg launchđể chèn trình trợ giúpimsgvào Messages.app. Đây là thứ mở khóa biên nhận đã đọc, chỉ báo đang nhập, gửi phong phú, chỉnh sửa, thu hồi, trả lời theo luồng, tapbacks và quản lý nhóm. - Các bản dựng Linux có thể kiểm tra một bản sao
chat.db, nhưng không thể gửi, theo dõi cơ sở dữ liệu Mac trực tiếp, hoặc điều khiển Messages.app. Với OpenClaw iMessage, hãy chạyimsgtrên máy Mac đã đăng nhập hoặc thông qua một trình bao SSH đến máy Mac đó.
Trước khi bắt đầu
-
Cài đặt
imsgtrên máy Mac chạy Messages.app:Nếuimsg chatsthất bại vớiunable to open database file, đầu ra trống, hoặcauthorization denied, hãy cấp Full Disk Access cho terminal, trình soạn thảo, tiến trình Node, dịch vụ Gateway hoặc tiến trình cha SSH khởi chạyimsg, rồi mở lại tiến trình cha đó. -
Xác minh các bề mặt đọc, theo dõi, gửi và RPC trước khi thay đổi cấu hình OpenClaw:
Thay
42bằng một id cuộc trò chuyện thực từimsg chats. Việc gửi yêu cầu quyền Automation cho Messages.app. Nếu OpenClaw sẽ chạy qua SSH, hãy chạy các lệnh này qua cùng trình bao SSH hoặc ngữ cảnh người dùng mà OpenClaw sẽ dùng. Nếu đọc/dò hoạt động nhưng gửi thất bại với AppleEvents-1743, hãy kiểm tra xem Automation có rơi vào/usr/libexec/sshd-keygen-wrapperhay không; xem Gửi bằng trình bao SSH thất bại với AppleEvents -1743. -
Bật cầu nối API riêng tư khi bạn cần các hành động nâng cao:
imsg launchyêu cầu tắt SIP. Gửi cơ bản, lịch sử và theo dõi hoạt động mà không cầnimsg launch; các hành động nâng cao thì không. -
Sau khi bạn thêm cấu hình
channels.imessageđã bật, hãy xác minh cầu nối thông qua OpenClaw:Bạn cầnimessage.privateApi.available: true. Nếu nó báo cáofalse, hãy sửa việc đó trước — xem Phát hiện năng lực.channels status --probechỉ dò các tài khoản đã cấu hình và đã bật. -
Chụp nhanh cấu hình của bạn:
Chuyển đổi cấu hình
iMessage và BlueBubbles dùng chung nhiều cấu hình cấp kênh. Các khóa thay đổi chủ yếu là phần truyền tải (máy chủ REST so với CLI cục bộ). Các khóa hành vi (dmPolicy, groupPolicy, allowFrom, v.v.) giữ nguyên cùng ý nghĩa.
| BlueBubbles | iMessage tích hợp sẵn | Ghi chú |
|---|---|---|
channels.bluebubbles.enabled | channels.imessage.enabled | Cùng ngữ nghĩa. |
channels.bluebubbles.serverUrl | (đã loại bỏ) | Không có máy chủ REST — Plugin sinh imsg rpc qua stdio. |
channels.bluebubbles.password | (đã loại bỏ) | Không cần xác thực webhook. |
| (ngầm định) | channels.imessage.cliPath | Đường dẫn tới imsg (mặc định imsg); dùng script bao bọc cho SSH. |
| (ngầm định) | channels.imessage.dbPath | Ghi đè Messages.app chat.db tùy chọn; tự động phát hiện khi bỏ qua. |
| (ngầm định) | channels.imessage.remoteHost | host hoặc user@host — chỉ cần khi cliPath là script bao bọc SSH và bạn muốn lấy tệp đính kèm bằng SCP. |
channels.bluebubbles.dmPolicy | channels.imessage.dmPolicy | Cùng các giá trị (pairing / allowlist / open / disabled). |
channels.bluebubbles.allowFrom | channels.imessage.allowFrom | Phê duyệt ghép nối được chuyển tiếp theo handle, không theo token. |
channels.bluebubbles.groupPolicy | channels.imessage.groupPolicy | Cùng các giá trị (allowlist / open / disabled). |
channels.bluebubbles.groupAllowFrom | channels.imessage.groupAllowFrom | Giống nhau. |
channels.bluebubbles.groups | channels.imessage.groups | Sao chép nguyên văn phần này, bao gồm mọi mục ký tự đại diện groups: { "*": { ... } }. requireMention, tools, toolsBySender theo từng nhóm được chuyển tiếp. Với groupPolicy: "allowlist", khối groups trống hoặc thiếu sẽ âm thầm loại bỏ mọi tin nhắn nhóm — xem “Bẫy sổ đăng ký nhóm” bên dưới. |
channels.bluebubbles.sendReadReceipts | channels.imessage.sendReadReceipts | Mặc định true. Với Plugin tích hợp sẵn, mục này chỉ kích hoạt khi phép thăm dò API riêng tư đang hoạt động. |
channels.bluebubbles.includeAttachments | channels.imessage.includeAttachments | Cùng hình dạng, cũng tắt theo mặc định. Nếu bạn đã cho tệp đính kèm chạy trên BlueBubbles, bạn phải đặt lại rõ ràng mục này trên khối iMessage — nó không được chuyển tiếp ngầm định, và ảnh/phương tiện đến sẽ bị âm thầm loại bỏ mà không có dòng log Inbound message cho đến khi bạn làm vậy. |
channels.bluebubbles.attachmentRoots | channels.imessage.attachmentRoots | Các gốc cục bộ; cùng quy tắc ký tự đại diện. |
| (Không áp dụng) | channels.imessage.remoteAttachmentRoots | Chỉ dùng khi remoteHost được đặt để lấy bằng SCP. |
channels.bluebubbles.mediaMaxMb | channels.imessage.mediaMaxMb | Mặc định 16 MB trên iMessage (mặc định của BlueBubbles là 8 MB). Đặt rõ ràng nếu bạn muốn giữ giới hạn thấp hơn. |
channels.bluebubbles.textChunkLimit | channels.imessage.textChunkLimit | Mặc định 4000 trên cả hai. |
channels.bluebubbles.coalesceSameSenderDms | channels.imessage.coalesceSameSenderDms | Cùng lựa chọn bật thủ công. Chỉ dành cho DM — cuộc trò chuyện nhóm giữ cách điều phối tức thì theo từng tin nhắn trên cả hai kênh. Mở rộng debounce mặc định cho tin nhắn đến thành 7000 ms khi bật mà không có messages.inbound.byChannel.imessage rõ ràng hoặc messages.inbound.debounceMs toàn cục. Xem tài liệu iMessage § Gộp các DM gửi tách. |
channels.bluebubbles.enrichGroupParticipantsFromContacts | (Không áp dụng) | iMessage đã đọc tên hiển thị của người gửi từ chat.db. |
channels.bluebubbles.actions.* | channels.imessage.actions.* | Các công tắc theo từng hành động: reactions, edit, unsend, reply, sendWithEffect, renameGroup, setGroupIcon, addParticipant, removeParticipant, leaveGroup, sendAttachment. |
channels.bluebubbles.accounts.*) chuyển đổi một-một sang channels.imessage.accounts.*.
Bẫy sổ đăng ký nhóm
Plugin iMessage tích hợp sẵn chạy hai cổng allowlist nhóm riêng biệt nối tiếp nhau. Cả hai đều phải đạt để tin nhắn nhóm đến được agent:- Allowlist người gửi / đích trò chuyện (
channels.imessage.groupAllowFrom) — được kiểm tra bởiisAllowedIMessageSender. Khớp tin nhắn đến theo handle người gửi,chat_guid,chat_identifier, hoặcchat_id. Cùng hình dạng với BlueBubbles. - Sổ đăng ký nhóm (
channels.imessage.groups) — được kiểm tra bởiresolveChannelGroupPolicytừinbound-processing.ts:199. VớigroupPolicy: "allowlist", cổng này yêu cầu một trong hai:- mục ký tự đại diện
groups: { "*": { ... } }(đặtallowAll = true), hoặc - mục rõ ràng theo từng
chat_idtronggroups.
- mục ký tự đại diện
warn để việc này không còn im lặng ở cấp log mặc định:
- Một
warnmột lần khi khởi động cho mỗi tài khoản khigroupPolicy: "allowlist"được đặt nhưngchannels.imessage.groupstrống (không có ký tự đại diện"*", không có mục theo từngchat_id) — kích hoạt trước khi có bất kỳ tin nhắn nào đến. - Một
warnmột lần cho mỗichat_idvào lần đầu một nhóm cụ thể bị loại bỏ lúc chạy, nêu tên chat_id và khóa chính xác cần thêm vàogroupsđể cho phép nhóm đó.
groupAllowFrom và groupPolicy nhưng bỏ qua khối groups, vì groups: { "*": { "requireMention": true } } của BlueBubbles trông giống một thiết lập nhắc tên không liên quan. Thực ra nó là phần thiết yếu cho cổng registry.
Cấu hình tối thiểu để giữ tin nhắn nhóm tiếp tục chạy sau groupPolicy: "allowlist":
requireMention: true dưới * là vô hại khi không cấu hình mẫu nhắc tên: runtime đặt canDetectMention = false và bỏ qua nhánh loại bỏ do nhắc tên tại inbound-processing.ts:512. Khi đã cấu hình mẫu nhắc tên (agents.list[].groupChat.mentionPatterns), nó hoạt động đúng như mong đợi.
Nếu nhật ký gateway ghi imessage: dropping group message from chat_id=<id> hoặc dòng khởi động imessage: groupPolicy="allowlist" but channels.imessage.groups is empty, cổng 2 đang loại bỏ tin nhắn — hãy thêm khối groups.
Từng bước
-
Thêm một khối iMessage bên cạnh khối BlueBubbles hiện có. Giữ nó tắt trong khi Gateway vẫn đang định tuyến lưu lượng BlueBubbles:
-
Kiểm tra trước khi lưu lượng trở nên quan trọng — dừng Gateway, tạm thời bật khối iMessage, và xác nhận iMessage báo trạng thái khỏe mạnh từ CLI:
channels status --probechỉ kiểm tra các tài khoản đã cấu hình và đang bật. Không khởi động lại Gateway với cả BlueBubbles và iMessage cùng bật trừ khi bạn cố ý muốn cả hai bộ giám sát kênh cùng chạy. Nếu bạn chưa chuyển đổi ngay, đặtchannels.imessage.enabledvềfalsetrước khi khởi động lại Gateway. Dùng các lệnhimsgtrực tiếp trong Trước khi bắt đầu để xác thực Mac trước khi bật lưu lượng OpenClaw. -
Chuyển đổi. Khi tài khoản iMessage đã bật báo trạng thái khỏe mạnh, xóa cấu hình BlueBubbles và giữ iMessage bật:
Khởi động lại gateway. Lưu lượng iMessage vào giờ sẽ đi qua Plugin đi kèm.
- Xác minh DM. Gửi cho agent một tin nhắn trực tiếp; xác nhận phản hồi được gửi đến.
-
Xác minh nhóm riêng. DM và nhóm đi qua các đường dẫn mã khác nhau — DM thành công không chứng minh rằng nhóm đang được định tuyến. Gửi cho agent một tin nhắn trong cuộc trò chuyện nhóm đã ghép đôi và xác nhận phản hồi được gửi đến. Nếu nhóm im lặng (không có phản hồi của agent, không có lỗi), kiểm tra nhật ký gateway để tìm
imessage: dropping group message from chat_id=<id>hoặc dòng khởi độngimessage: groupPolicy="allowlist" but channels.imessage.groups is empty— cả hai đều xuất hiện ở cấp nhật ký mặc định. Nếu một trong hai xuất hiện, khốigroupscủa bạn bị thiếu hoặc rỗng — xem “Bẫy registry nhóm” ở trên. -
Xác minh bề mặt hành động — từ một DM đã ghép đôi, yêu cầu agent thả phản ứng, chỉnh sửa, thu hồi, trả lời, gửi ảnh, và (trong nhóm) đổi tên nhóm / thêm hoặc xóa người tham gia. Mỗi hành động phải xuất hiện nguyên bản trong Messages.app. Nếu bất kỳ hành động nào ném lỗi “iMessage
<action>requires the imsg private API bridge”, chạy lạiimsg launchvà làm mớichannels status --probe. -
Xóa máy chủ và cấu hình BlueBubbles sau khi đã xác minh DM, nhóm và hành động của iMessage. OpenClaw sẽ không dùng
channels.bluebubbles.
Tổng quan tương đương hành động
| Hành động | BlueBubbles cũ | iMessage đi kèm |
|---|---|---|
| Gửi văn bản / dự phòng SMS | ✅ | ✅ |
| Gửi phương tiện (ảnh, video, tệp, thoại) | ✅ | ✅ |
Trả lời theo luồng (reply_to_guid) | ✅ | ✅ (đóng #51892) |
Tapback (react) | ✅ | ✅ |
| Chỉnh sửa / thu hồi (người nhận macOS 13+) | ✅ | ✅ |
| Gửi kèm hiệu ứng màn hình | ✅ | ✅ (đóng một phần #9394) |
| Văn bản giàu định dạng in đậm / nghiêng / gạch chân / gạch ngang | ✅ | ✅ (định dạng typed-run qua attributedBody) |
| Đổi tên nhóm / đặt biểu tượng nhóm | ✅ | ✅ |
| Thêm / xóa người tham gia, rời nhóm | ✅ | ✅ |
| Biên nhận đã đọc và chỉ báo đang nhập | ✅ | ✅ (được chặn bởi kiểm tra API riêng tư) |
| Gộp DM cùng người gửi | ✅ | ✅ (chỉ DM; bật tùy chọn qua channels.imessage.coalesceSameSenderDms) |
| Khôi phục tin nhắn vào sau khi khởi động lại | ✅ (phát lại webhook + lấy lịch sử) | ✅ (tự động: phát lại phần bỏ lỡ qua since_rowid + khử trùng lặp; cửa sổ rộng hơn khi cục bộ) |
imsg watch.subscribe since_rowid và khử trùng lặp theo GUID, trong khi hàng rào tuổi backlog cũ ngăn “bom backlog” Push-flush. Việc này chạy qua kết nối RPC imsg, nên cũng hoạt động với các thiết lập cliPath SSH từ xa; thiết lập cục bộ có cửa sổ khôi phục rộng hơn vì chúng có thể đọc chat.db. Xem Khôi phục tin nhắn vào sau khi bridge hoặc gateway khởi động lại.
Ghép đôi, phiên và liên kết ACP
- Phê duyệt ghép đôi được chuyển tiếp theo handle. Bạn không cần phê duyệt lại những người gửi đã biết —
channels.imessage.allowFromnhận diện cùng các chuỗi+15555550123/user@example.commà BlueBubbles đã dùng. - Phiên vẫn được giới hạn theo từng agent + cuộc trò chuyện. DM được gộp vào phiên chính của agent dưới mặc định
session.dmScope=main; phiên nhóm vẫn cô lập theo từngchat_id. Khóa phiên khác nhau (agent:<id>:imessage:group:<chat_id>so với tương đương của BlueBubbles) — lịch sử hội thoại cũ dưới các khóa phiên BlueBubbles không được chuyển sang phiên iMessage. - Liên kết ACP tham chiếu
match.channel: "bluebubbles"cần được cập nhật thành"imessage". Các dạngmatch.peer.id(chat_id:,chat_guid:,chat_identifier:, handle trần) là giống hệt nhau.
Không có kênh rollback
Không có runtime BlueBubbles được hỗ trợ để chuyển ngược lại. Nếu xác minh iMessage thất bại, đặtchannels.imessage.enabled: false, khởi động lại Gateway, sửa điểm chặn imsg, rồi thử chuyển đổi lại.
Bộ nhớ đệm phản hồi nằm trong trạng thái Plugin SQLite. openclaw doctor --fix nhập và lưu trữ sidecar imessage/reply-cache.jsonl cũ khi có.
Liên quan
- Gỡ bỏ BlueBubbles và đường dẫn iMessage imsg — thông báo ngắn và tóm tắt cho người vận hành.
- iMessage — tài liệu tham chiếu đầy đủ cho kênh iMessage, bao gồm thiết lập
imsg launchvà phát hiện năng lực. /channels/bluebubbles— URL cũ chuyển hướng đến hướng dẫn di chuyển này.- Ghép đôi — xác thực DM và luồng ghép đôi.
- Định tuyến kênh — cách gateway chọn kênh cho phản hồi đi.