iMessage (legacy: imsg)
Khuyến nghị: Dùng BlueBubbles cho các thiết lập iMessage mới.
Kênh imsg là tích hợp CLI bên ngoài dạng legacy và có thể bị loại bỏ trong một bản phát hành tương lai.
Trạng thái: tích hợp CLI bên ngoài dạng legacy. Gateway spawns imsg rpc (JSON-RPC over stdio).
Khởi động nhanh (cho người mới)
- Đảm bảo Messages đã đăng nhập trên máy Mac này.
- Cài đặt
imsg:brew install steipete/tap/imsg
- Cấu hình OpenClaw với
channels.imessage.cliPathvàchannels.imessage.dbPath. - Khởi động gateway và phê duyệt mọi lời nhắc của macOS (Automation + Full Disk Access).
Nó là gì
- Kênh iMessage được hỗ trợ bởi
imsgtrên macOS. - Định tuyến xác định: phản hồi luôn quay lại iMessage.
- DM dùng chung phiên chính của tác tử; nhóm được cô lập (
agent:<agentId>:imessage:group:<chat_id>). - Nếu một luồng nhiều người tham gia đến với
is_group=false, bạn vẫn có thể cô lập nó bằngchat_idsử dụngchannels.imessage.groups(xem “Group-ish threads” bên dưới).
Ghi cấu hình
Theo mặc định, iMessage được phép ghi các cập nhật cấu hình kích hoạt bởi/config set|unset (yêu cầu commands.config: true).
Tắt bằng:
Yêu cầu
- macOS với Messages đã đăng nhập.
- Full Disk Access cho OpenClaw +
imsg(truy cập DB Messages). - Quyền Automation khi gửi.
channels.imessage.cliPathcó thể trỏ tới bất kỳ lệnh nào proxy stdin/stdout (ví dụ: script bọc SSH sang Mac khác và chạyimsg rpc).
Xử lý sự cố macOS Privacy and Security TCC
Nếu gửi/nhận thất bại (ví dụ,imsg rpc thoát với mã khác 0, hết thời gian chờ, hoặc gateway có vẻ bị treo), nguyên nhân phổ biến là lời nhắc quyền macOS chưa từng được phê duyệt.
macOS cấp quyền TCC theo từng ứng dụng/ngữ cảnh tiến trình. Approve prompts in the same context that runs imsg (for example, Terminal/iTerm, a LaunchAgent session, or an SSH-launched process).
Danh sách kiểm tra:
- Quyền truy cập toàn bộ ổ đĩa: cho phép truy cập cho tiến trình đang chạy OpenClaw (và bất kỳ wrapper shell/SSH nào thực thi
imsg). Điều này là bắt buộc để đọc cơ sở dữ liệu Messages (chat.db). - Automation → Messages: cho phép tiến trình chạy OpenClaw (và/hoặc terminal của bạn) điều khiển Messages.app cho việc gửi ra ngoài.
- Tình trạng CLI
imsg: xác minhimsgđã được cài và hỗ trợ RPC (imsg rpc --help).
Thiết lập (nhanh)
- Đảm bảo Messages đã đăng nhập trên máy Mac này.
- Cấu hình iMessage và khởi động gateway.
Người dùng macOS dành riêng cho bot (để cô lập danh tính)
Nếu bạn muốn bot gửi từ một danh tính iMessage riêng (và giữ Messages cá nhân sạch sẽ), hãy dùng một Apple ID riêng + một người dùng macOS riêng.- Tạo một Apple ID dành riêng (ví dụ:
[email protected]).- Apple có thể yêu cầu số điện thoại để xác minh / 2FA.
- Tạo một người dùng macOS (ví dụ:
openclawhome) và đăng nhập vào đó. - Mở Messages trong người dùng macOS đó và đăng nhập iMessage bằng Apple ID của bot.
- Bật Remote Login (System Settings → General → Sharing → Remote Login).
- Cài đặt
imsg:brew install steipete/tap/imsg
- Thiết lập SSH để
ssh <bot-macos-user>@localhost truehoạt động không cần mật khẩu. - Trỏ
channels.imessage.accounts.bot.cliPathtới một wrapper SSH chạyimsgdưới người dùng bot.
imsg rpc có vẻ bị treo hoặc thoát, hãy đăng nhập vào người dùng đó (Screen Sharing rất hữu ích), chạy một lần imsg chats --limit 1 / imsg send ..., chấp thuận các lời nhắc, rồi thử lại. Xem Khắc phục sự cố Quyền riêng tư và Bảo mật TCC trên macOS.
- Ví dụ wrapper (
chmod +x). 2. Thay<bot-macos-user>bằng tên người dùng macOS thực tế của bạn:
channels.imessage.cliPath, channels.imessage.dbPath) thay vì map accounts.
Biến thể remote/SSH (tùy chọn)
- Nếu bạn muốn iMessage trên một máy Mac khác, hãy đặt
channels.imessage.cliPaththành một wrapper chạyimsgtrên máy macOS từ xa qua SSH. 4. OpenClaw chỉ cần stdio.
- Tệp đính kèm từ xa: Khi
cliPathtrỏ tới một máy từ xa qua SSH, đường dẫn tệp đính kèm trong cơ sở dữ liệu Messages sẽ tham chiếu tới các tệp trên máy từ xa. 6. OpenClaw có thể tự động tải các tệp này qua SCP bằng cách đặtchannels.imessage.remoteHost:
- Nếu
remoteHostkhông được đặt, OpenClaw sẽ cố gắng tự động phát hiện bằng cách phân tích lệnh SSH trong script wrapper của bạn. 8. Khuyến nghị cấu hình tường minh để đảm bảo độ tin cậy.
Mac từ xa qua Tailscale (ví dụ)
Nếu Gateway chạy trên host/VM Linux nhưng iMessage phải chạy trên Mac, Tailscale là cầu nối đơn giản nhất: Gateway nói chuyện với Mac qua tailnet, chạyimsg qua SSH, và SCP đính kèm về.
Kiến trúc:
Ví dụ cấu hình cụ thể (hostname Tailscale):
~/.openclaw/scripts/imsg-ssh):
- Đảm bảo Mac đã đăng nhập Messages và bật Remote Login.
- Dùng khóa SSH để
ssh [email protected]hoạt động không cần lời nhắc. remoteHostnên khớp với đích SSH để SCP có thể tải đính kèm.
- Hỗ trợ nhiều tài khoản: sử dụng
channels.imessage.accountsvới cấu hình cho từng tài khoản vànametùy chọn. 10. Xemgateway/configurationđể biết mẫu dùng chung. 11. Đừng commit~/.openclaw/openclaw.json(thường chứa token).
Kiểm soát truy cập (DM + nhóm)
DM:- Mặc định:
channels.imessage.dmPolicy = "pairing". - Người gửi chưa biết sẽ nhận mã ghép cặp; tin nhắn bị bỏ qua cho đến khi được phê duyệt (mã hết hạn sau 1 giờ).
- Phê duyệt qua:
openclaw pairing list imessageopenclaw pairing approve imessage <CODE>
- Pairing is the default token exchange for iMessage DMs. 12. Chi tiết: Pairing
channels.imessage.groupPolicy = open | allowlist | disabled.channels.imessage.groupAllowFromkiểm soát ai có thể kích hoạt trong nhóm khiallowlistđược đặt.- Chặn theo nhắc tên dùng
agents.list[].groupChat.mentionPatterns(hoặcmessages.groupChat.mentionPatterns) vì iMessage không có metadata nhắc tên gốc. - Ghi đè đa tác tử: đặt pattern theo từng tác tử trên
agents.list[].groupChat.mentionPatterns.
Cách hoạt động (hành vi)
imsgstream các sự kiện tin nhắn; gateway chuẩn hóa chúng vào phong bì kênh dùng chung.- Phản hồi luôn định tuyến về cùng chat id hoặc handle.
Group-ish threads (is_group=false)
Một số luồng iMessage có thể có nhiều người tham gia nhưng vẫn đến với is_group=false tùy theo cách Messages lưu định danh chat.
Nếu bạn cấu hình tường minh một chat_id dưới channels.imessage.groups, OpenClaw coi luồng đó là “nhóm” cho:
- cô lập phiên (khóa phiên
agent:<agentId>:imessage:group:<chat_id>riêng) - hành vi danh sách cho phép nhóm / chặn theo nhắc tên
Media + giới hạn
- Nạp đính kèm tùy chọn qua
channels.imessage.includeAttachments. - Giới hạn media qua
channels.imessage.mediaMaxMb.
Giới hạn
- Văn bản gửi ra được chia khối tới
channels.imessage.textChunkLimit(mặc định 4000). - Chia khối theo dòng mới tùy chọn: đặt
channels.imessage.chunkMode="newline"để tách theo dòng trống (ranh giới đoạn) trước khi chia theo độ dài. - Tải media bị giới hạn bởi
channels.imessage.mediaMaxMb(mặc định 16).
Địa chỉ / đích gửi
Ưu tiênchat_id để định tuyến ổn định:
chat_id:123(ưu tiên)chat_guid:...chat_identifier:...- handle trực tiếp:
imessage:+1555/sms:+1555/[email protected]
Tham chiếu cấu hình (iMessage)
Cấu hình đầy đủ: Cấu hình Tùy chọn nhà cung cấp:channels.imessage.enabled: bật/tắt khởi động kênh.channels.imessage.cliPath: đường dẫn tớiimsg.channels.imessage.dbPath: đường dẫn DB Messages.channels.imessage.remoteHost: SSH host for SCP attachment transfer whencliPathpoints to a remote Mac (e.g.,user@gateway-host). Auto-detected from SSH wrapper if not set.channels.imessage.service:imessage | sms | auto.channels.imessage.region: vùng SMS.channels.imessage.dmPolicy:pairing | allowlist | open | disabled(mặc định: pairing).channels.imessage.allowFrom: DM allowlist (handles, emails, E.164 numbers, orchat_id:*). 14.openyêu cầu"*". iMessage has no usernames; use handles or chat targets.channels.imessage.groupPolicy:open | allowlist | disabled(mặc định: allowlist).channels.imessage.groupAllowFrom: danh sách cho phép người gửi trong nhóm.channels.imessage.historyLimit/channels.imessage.accounts.*.historyLimit: số tin nhắn nhóm tối đa đưa vào ngữ cảnh (0 là tắt).-
channels.imessage.dmHistoryLimit: giới hạn lịch sử DM theo số lượt của người dùng. 16. Ghi đè theo người dùng:channels.imessage.dms["<handle>"].historyLimit.
channels.imessage.groups: mặc định theo nhóm + danh sách cho phép (dùng"*"cho mặc định toàn cục).channels.imessage.includeAttachments: nạp đính kèm vào ngữ cảnh.channels.imessage.mediaMaxMb: giới hạn media vào/ra (MB).channels.imessage.textChunkLimit: kích thước chia khối gửi ra (ký tự).channels.imessage.chunkMode:length(mặc định) hoặcnewlineđể tách theo dòng trống (ranh giới đoạn) trước khi chia theo độ dài.
agents.list[].groupChat.mentionPatterns(hoặcmessages.groupChat.mentionPatterns).messages.responsePrefix.