Chuyển đến nội dung chính
Plugin 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:
  1. Xác minh trực tiếp imsg trên máy Mac chạy Messages.app (imsg chats, imsg history, imsg sendimsg rpc --help).
  2. Sao chép các khóa hành vi từ channels.bluebubbles sang channels.imessage: dmPolicy, allowFrom, groupPolicy, groupAllowFrom, groups, includeAttachments, attachmentRoots, mediaMaxMb, textChunkLimit, coalesceSameSenderDmsactions.
  3. 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.
  4. Nếu Gateway không chạy trên máy Mac Messages, hãy đặt channels.imessage.cliPath thành một trình bao SSH và đặt remoteHost để lấy tệp đính kèm từ xa.
  5. Khi Gateway đã dừng, bật channels.imessage, rồi chạy openclaw channels status --probe --channel imessage.
  6. 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.
  7. Xóa máy chủ BlueBubbles và cấu hình channels.bluebubbles cũ 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 imsg trê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áo available: 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.db bằ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ủa chat.db vớ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úp imsg và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ạy imsg trê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

  1. Cài đặt imsg trên máy Mac chạy Messages.app:
    brew install steipete/tap/imsg
    imsg --version
    imsg chats --limit 3
    
    Nếu imsg chats thất bại với unable to open database file, đầu ra trống, hoặc authorization 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ạy imsg, rồi mở lại tiến trình cha đó.
  2. 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:
    imsg chats --limit 10 --json | jq -s
    imsg history --chat-id 42 --limit 10 --attachments --json | jq -s
    imsg watch --chat-id 42 --reactions --json
    imsg send --chat-id 42 --text "OpenClaw imsg test"
    imsg rpc --help
    
    Thay 42 bằ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-wrapper hay không; xem Gửi bằng trình bao SSH thất bại với AppleEvents -1743.
  3. Bật cầu nối API riêng tư khi bạn cần các hành động nâng cao:
    imsg launch
    imsg status --json
    
    imsg launch yê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ần imsg launch; các hành động nâng cao thì không.
  4. 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:
    openclaw channels status --probe
    
    Bạn cần imessage.privateApi.available: true. Nếu nó báo cáo false, hãy sửa việc đó trước — xem Phát hiện năng lực. channels status --probe chỉ dò các tài khoản đã cấu hình và đã bật.
  5. Chụp nhanh cấu hình của bạn:
    cp ~/.openclaw/openclaw.json5 ~/.openclaw/openclaw.json5.bak
    

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.
BlueBubblesiMessage tích hợp sẵnGhi chú
channels.bluebubbles.enabledchannels.imessage.enabledCù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.dbPathGhi đè Messages.app chat.db tùy chọn; tự động phát hiện khi bỏ qua.
(ngầm định)channels.imessage.remoteHosthost 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.dmPolicychannels.imessage.dmPolicyCùng các giá trị (pairing / allowlist / open / disabled).
channels.bluebubbles.allowFromchannels.imessage.allowFromPhê duyệt ghép nối được chuyển tiếp theo handle, không theo token.
channels.bluebubbles.groupPolicychannels.imessage.groupPolicyCùng các giá trị (allowlist / open / disabled).
channels.bluebubbles.groupAllowFromchannels.imessage.groupAllowFromGiống nhau.
channels.bluebubbles.groupschannels.imessage.groupsSao 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.sendReadReceiptschannels.imessage.sendReadReceiptsMặ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.includeAttachmentschannels.imessage.includeAttachmentsCù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.attachmentRootschannels.imessage.attachmentRootsCác gốc cục bộ; cùng quy tắc ký tự đại diện.
(Không áp dụng)channels.imessage.remoteAttachmentRootsChỉ dùng khi remoteHost được đặt để lấy bằng SCP.
channels.bluebubbles.mediaMaxMbchannels.imessage.mediaMaxMbMặ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.textChunkLimitchannels.imessage.textChunkLimitMặc định 4000 trên cả hai.
channels.bluebubbles.coalesceSameSenderDmschannels.imessage.coalesceSameSenderDmsCù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.
Cấu hình nhiều tài khoản (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:
  1. Allowlist người gửi / đích trò chuyện (channels.imessage.groupAllowFrom) — được kiểm tra bởi isAllowedIMessageSender. Khớp tin nhắn đến theo handle người gửi, chat_guid, chat_identifier, hoặc chat_id. Cùng hình dạng với BlueBubbles.
  2. Sổ đăng ký nhóm (channels.imessage.groups) — được kiểm tra bởi resolveChannelGroupPolicy từ inbound-processing.ts:199. Với groupPolicy: "allowlist", cổng này yêu cầu một trong hai:
    • mục ký tự đại diện groups: { "*": { ... } } (đặt allowAll = true), hoặc
    • mục rõ ràng theo từng chat_id trong groups.
Nếu cổng 1 đạt nhưng cổng 2 không đạt, tin nhắn sẽ bị loại bỏ. Plugin phát ra hai tín hiệu cấp warn để việc này không còn im lặng ở cấp log mặc định:
  • Một warn một lần khi khởi động cho mỗi tài khoản khi groupPolicy: "allowlist" được đặt nhưng channels.imessage.groups trống (không có ký tự đại diện "*", không có mục theo từng chat_id) — kích hoạt trước khi có bất kỳ tin nhắn nào đến.
  • Một warn một lần cho mỗi chat_id và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ào groups để cho phép nhóm đó.
DM tiếp tục hoạt động vì chúng đi theo một đường dẫn mã khác. Đây là chế độ lỗi phổ biến nhất khi di chuyển từ BlueBubbles → iMessage đi kèm: người vận hành sao chép groupAllowFromgroupPolicy 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":
{
  channels: {
    imessage: {
      groupPolicy: "allowlist",
      groupAllowFrom: ["+15555550123", "chat_guid:any;-;..."],
      groups: {
        "*": { requireMention: true },
      },
    },
  },
}
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

  1. 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:
    {
      channels: {
        bluebubbles: {
          enabled: true,
          // ... existing config ...
        },
        imessage: {
          enabled: false,
          cliPath: "/opt/homebrew/bin/imsg",
          dmPolicy: "pairing",
          allowFrom: ["+15555550123"], // copy from bluebubbles.allowFrom
          groupPolicy: "allowlist",
          groupAllowFrom: [], // copy from bluebubbles.groupAllowFrom
          groups: { "*": { requireMention: true } }, // copy from bluebubbles.groups — silently drops groups if missing, see "Group registry footgun" above
          actions: {
            reactions: true,
            edit: true,
            unsend: true,
            reply: true,
            sendWithEffect: true,
            sendAttachment: true,
          },
        },
      },
    }
    
  2. 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:
    openclaw gateway stop
    # edit config: channels.imessage.enabled = true
    openclaw channels status --probe --channel imessage   # expect imessage.privateApi.available: true
    
    channels status --probe chỉ 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, đặt channels.imessage.enabled về false trước khi khởi động lại Gateway. Dùng các lệnh imsg trự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.
  3. 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:
    {
      channels: {
        imessage: { enabled: true /* ... */ },
      },
    }
    
    Khởi động lại gateway. Lưu lượng iMessage vào giờ sẽ đi qua Plugin đi kèm.
  4. 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.
  5. 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 động imessage: 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ối groups của bạn bị thiếu hoặc rỗng — xem “Bẫy registry nhóm” ở trên.
  6. 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ại imsg launch và làm mới channels status --probe.
  7. 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 độngBlueBubbles 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ộ)
iMessage khôi phục các tin nhắn bị bỏ lỡ khi gateway tắt: khi khởi động, nó phát lại từ rowid đã dispatch cuối cùng qua 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.allowFrom nhận diện cùng các chuỗi +15555550123 / user@example.com mà 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ừng chat_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ạng match.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, đặt channels.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 launch và 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.