Mainstream messaging
iMessage
Durum: yerel harici CLI entegrasyonu. Gateway imsg rpc sürecini başlatır ve stdio üzerinde JSON-RPC ile iletişim kurar (ayrı daemon/port yoktur). Gelişmiş eylemler imsg launch ve başarılı bir özel API yoklaması gerektirir.
Yanıtlar, tapback'ler, efektler, anketler, ekler ve grup yönetimi.
iMessage DM'leri varsayılan olarak eşleme modunu kullanır.
Gateway Messages Mac üzerinde çalışmıyorsa bir SSH sarmalayıcısı kullanın.
Tam iMessage alan başvurusu.
Hızlı kurulum
Yerel Mac (hızlı yol)
imsg yükleyin ve doğrulayın
brew install steipete/tap/imsgimsg rpc --helpimsg launchopenclaw channels status --probeOpenClaw yapılandırın
{channels: {imessage: {enabled: true,cliPath: "/usr/local/bin/imsg",dbPath: "/Users/user/Library/Messages/chat.db",},},}Gateway başlatın
openclaw gatewayİlk DM eşlemesini onaylayın (varsayılan dmPolicy)
openclaw pairing list imessageopenclaw pairing approve imessage <CODE>Eşleme isteklerinin süresi 1 saat sonra dolar.
SSH üzerinden uzak Mac
OpenClaw yalnızca stdio uyumlu bir cliPath gerektirir; bu nedenle cliPath değerini uzak bir Mac'e SSH yapan ve imsg çalıştıran bir sarmalayıcı betiğine yönlendirebilirsiniz.
#!/usr/bin/env bashexec ssh -T gateway-host imsg "$@"Ekler etkinleştirildiğinde önerilen yapılandırma:
{channels: {imessage: { enabled: true, cliPath: "~/.openclaw/scripts/imsg-ssh", remoteHost: "user@gateway-host", // used for SCP attachment fetches includeAttachments: true, // Optional: override allowed attachment roots. // Defaults include /Users/*/Library/Messages/Attachments attachmentRoots: ["/Users/*/Library/Messages/Attachments"], remoteAttachmentRoots: ["/Users/*/Library/Messages/Attachments"],},},}remoteHost ayarlanmazsa OpenClaw, SSH sarmalayıcı betiğini ayrıştırarak bunu otomatik algılamaya çalışır.
remoteHost, host veya user@host olmalıdır (boşluk veya SSH seçeneği yok).
OpenClaw, SCP için katı ana makine anahtarı denetimi kullanır; bu nedenle aktarma ana makinesi anahtarı ~/.ssh/known_hosts içinde zaten bulunmalıdır.
Ek yolları izin verilen köklere göre doğrulanır (attachmentRoots / remoteAttachmentRoots).
Gereksinimler ve izinler (macOS)
imsgçalıştıran Mac üzerinde Messages oturumu açılmış olmalıdır.- OpenClaw/
imsgçalıştıran süreç bağlamı için Tam Disk Erişimi gereklidir (Messages DB erişimi). - Messages.app üzerinden ileti göndermek için Otomasyon izni gereklidir.
- Gelişmiş eylemler için (tepki / düzenleme / göndermeyi geri alma / konu içinde yanıt / efektler / anketler / grup işlemleri), Sistem Bütünlüğü Koruması devre dışı bırakılmalıdır — aşağıdaki imsg özel API'sini etkinleştirme bölümüne bakın. Temel metin ve medya gönderme/alma bunun olmadan çalışır.
SSH sarmalayıcı gönderimleri AppleEvents -1743 ile başarısız oluyor
Uzak SSH kurulumu sohbetleri okuyabilir, channels status --probe denetiminden geçebilir ve gelen iletileri işleyebilir; ancak giden gönderimler yine de bir AppleEvents yetkilendirme hatasıyla başarısız olabilir:
Not authorized to send Apple events to Messages. (-1743)Oturum açmış Mac kullanıcısının TCC veritabanını veya Sistem Ayarları > Gizlilik ve Güvenlik > Otomasyon bölümünü denetleyin. Otomasyon girdisi imsg veya yerel shell süreci yerine /usr/libexec/sshd-keygen-wrapper için kaydedilmişse macOS, bu SSH sunucu tarafı istemcisi için kullanılabilir bir Messages anahtarı göstermeyebilir:
kTCCServiceAppleEvents | /usr/libexec/sshd-keygen-wrapper | auth_value=0 | com.apple.MobileSMSBu durumda, tccutil reset AppleEvents komutunu tekrarlamak veya aynı SSH sarmalayıcısı üzerinden imsg send komutunu yeniden çalıştırmak başarısız olmaya devam edebilir; çünkü Messages Otomasyonu'na ihtiyaç duyan süreç bağlamı, kullanıcı arayüzünün izin verebileceği bir uygulama değil SSH sarmalayıcısıdır.
Bunun yerine desteklenen imsg süreç bağlamlarından birini kullanın:
- Gateway'i veya en azından
imsgköprüsünü, oturum açmış Messages kullanıcısının yerel oturumunda çalıştırın. - Aynı oturumdan Tam Disk Erişimi ve Otomasyon izni verdikten sonra Gateway'i bu kullanıcı için bir LaunchAgent ile başlatın.
- İki kullanıcılı SSH topolojisini koruyorsanız kanalı etkinleştirmeden önce, gerçek bir giden
imsg sendkomutunun tam olarak aynı sarmalayıcı üzerinden başarılı olduğunu doğrulayın. Otomasyon izni verilemiyorsa gönderimler için SSH sarmalayıcısına güvenmek yerine tek kullanıcılı birimsgkurulumuna yeniden yapılandırın.
imsg özel API'sini etkinleştirme
imsg iki çalışma moduyla gelir:
- Temel mod (varsayılan, SIP değişikliği gerekmez):
sendüzerinden giden metin ve medya, gelen izleme/geçmiş, sohbet listesi. Yeni birbrew install steipete/tap/imsgkurulumundan ve yukarıdaki standart macOS izinlerinden sonra kutudan çıktığı gibi elde ettiğiniz budur. - Özel API modu:
imsg, dahiliIMCoreişlevlerini çağırmak içinMessages.appiçine bir yardımcı dylib enjekte eder. Bu,react,edit,unsend,reply(konu içinde),sendWithEffect,pollvepoll-vote(yerel Messages anketleri),renameGroup,setGroupIcon,addParticipant,removeParticipant,leaveGroupile yazıyor göstergelerini ve okundu bilgilerini açar.
Bu kanal sayfasının belgelediği gelişmiş eylem yüzeyine ulaşmak için Özel API modu gerekir. imsg README gereksinim konusunda açıktır:
read,typing,launch, köprü destekli zengin gönderim, ileti mutasyonu ve sohbet yönetimi gibi gelişmiş özellikler isteğe bağlıdır. SIP'in devre dışı bırakılmasını veMessages.appiçine bir yardımcı dylib enjekte edilmesini gerektirir. SIP etkin olduğundaimsg launchenjeksiyonu reddeder.
Yardımcı enjeksiyon tekniği, Messages özel API'lerine erişmek için imsg'nin kendi dylib'ini kullanır. OpenClaw iMessage yolunda üçüncü taraf sunucu veya BlueBubbles çalışma zamanı yoktur.
Kurulum
-
Messages.app çalıştıran Mac üzerinde
imsgyükleyin (veya yükseltin):bash brew install steipete/tap/imsgimsg --versionimsg status --jsonimsg status --jsonçıktısıbridge_version,rpc_methodsve yöntem başınaselectorsbildirir; böylece başlamadan önce geçerli derlemenin neyi desteklediğini görebilirsiniz. -
Sistem Bütünlüğü Koruması'nı ve (modern macOS'ta) Kitaplık Doğrulamasını devre dışı bırakın. Apple imzalı
Messages.appiçine Apple olmayan bir yardımcı dylib enjekte etmek için SIP'in kapalı olması ve kitaplık doğrulamasının gevşetilmesi gerekir. Recovery-mode SIP adımı macOS sürümüne özeldir:- macOS 10.13-10.15 (Sierra-Catalina): Kitaplık Doğrulamasını Terminal üzerinden devre dışı bırakın, Recovery Mode'a yeniden başlatın,
csrutil disableçalıştırın, yeniden başlatın. - macOS 11+ (Big Sur ve sonrası), Intel: Recovery Mode (veya Internet Recovery),
csrutil disable, yeniden başlatın. - macOS 11+, Apple Silicon: Recovery'ye girmek için güç düğmesi başlangıç dizisini kullanın; son macOS sürümlerinde Continue'a tıklarken Left Shift tuşunu basılı tutun, ardından
csrutil disableçalıştırın. Sanal makine kurulumları ayrı bir akış izler; bu nedenle önce bir VM anlık görüntüsü alın.
macOS 11 ve sonrasında, yalnızca
csrutil disablegenellikle yeterli değildir. Apple,Messages.appbir platform ikilisi olduğundan kitaplık doğrulamasını hâlâ uygular; bu nedenle adhoc imzalı bir yardımcı, SIP kapalı olsa bile reddedilir (Library Validation failed: ... platform binary, but mapped file is not). SIP'i devre dışı bıraktıktan sonra kitaplık doğrulamasını da devre dışı bırakın ve yeniden başlatın:bash sudo defaults write /Library/Preferences/com.apple.security.libraryvalidation.plist DisableLibraryValidation -bool truemacOS 26 (Tahoe), 26.5.1 üzerinde doğrulandı: SIP kapalı artı yukarıdaki
DisableLibraryValidationkomutu, yardımcının 26.0'dan 26.5.x'e kadar enjekte edilmesi için yeterlidir. boot-args gerekmez. plist belirleyici etkendir ve Tahoe'da enjeksiyon başarısız olduğunda en sık eksik olan adımdır:- plist ile:
imsg launchenjekte eder veimsg status,advanced_features: truebildirir. - plist olmadan (SIP kapalı olsa bile):
imsg launch,Failed to launch: Timeout waiting for Messages.app to initializeile başarısız olur. AMFI, adhoc yardımcıyı yükleme sırasında reddeder; bu nedenle köprü hiçbir zaman hazır olmaz ve başlatma zaman aşımına uğrar. Tahoe'da çoğu kişinin karşılaştığı belirti bu zaman aşımıdır ve düzeltme yukarıdaki plist'tir, daha sert bir şey değil.
Bu, macOS 26.5.1 (Apple Silicon) üzerinde kontrollü bir önce/sonra ile doğrulandı: plist varken dylib
Messages.appiçine eşlenir ve köprü çalışır; plist'i kaldırıp yeniden başlatıncaimsg launch, dylib eşlenmeden yukarıdaki zaman aşımı hatasını üretir.If
imsg launchenjeksiyonu veya belirliselectorsdeğerleri bir macOS yükseltmesinden sonra false döndürmeye başlarsa, olağan neden bu geçittir. SIP ve library-validation durumunuzu, SIP adımının kendisinin başarısız olduğunu varsaymadan önce kontrol edin. Bu ayarlar doğruysa ve köprü hâlâ enjekte edemiyorsa,imsg status --jsonileimsg launchçıktısını toplayın ve ek sistem genelindeki güvenlik denetimlerini zayıflatmak yerine bunuimsgprojesine bildirin.imsg launchçalıştırmadan önce SIP'yi devre dışı bırakmak için Apple'ın Mac'inize yönelik Recovery-mode akışını izleyin. - macOS 10.13-10.15 (Sierra-Catalina): Kitaplık Doğrulamasını Terminal üzerinden devre dışı bırakın, Recovery Mode'a yeniden başlatın,
-
Yardımcıyı enjekte edin. SIP devre dışıyken ve Messages.app oturum açmış durumdayken:
bash imsg launchimsg launch, SIP hâlâ etkin olduğunda enjeksiyonu reddeder; bu nedenle bu, 2. adımın uygulandığına dair bir doğrulama işlevi de görür. -
Köprüyü OpenClaw'dan doğrulayın:
bash openclaw channels status --probeiMessage girdisi
worksbildirmeli veimsg status --json | jq '{rpc_methods, selectors}'macOS derlemenizin sunduğu yetenekleri göstermelidir. Anket oluşturmaselectors.pollPayloadMessagegerektirir; oy verme hemselectors.pollVoteMessagehem depoll.voteRPC yöntemini gerektirir. OpenClaw Plugin yalnızca önbelleğe alınmış yoklamanın desteklediği eylemleri duyurur; boş bir önbellek ise iyimser kalır ve ilk gönderimde yoklama yapar.
openclaw channels status --probe kanalı works olarak bildiriyor ancak belirli eylemler gönderim sırasında "iMessage <action> requires the imsg private API bridge" hatası veriyorsa, imsg launch komutunu yeniden çalıştırın — yardımcı devreden çıkabilir (Messages.app yeniden başlatması, işletim sistemi güncellemesi vb.) ve önbelleğe alınmış available: true durumu, bir sonraki yoklama yenilenene kadar eylemleri duyurmaya devam eder.
SIP'yi devre dışı bırakamadığınızda
SIP'nin devre dışı olması tehdit modeliniz için kabul edilebilir değilse:
imsgtemel moda geri döner — yalnızca metin + medya + alma.- OpenClaw Plugin, metin/medya gönderimini ve gelen izlemeyi duyurmaya devam eder; yalnızca
react,edit,unsend,reply,sendWithEffectve grup işlemlerini eylem yüzeyinden gizler (yöntem başına yetenek geçidine göre). - Birincil cihazlarınızda SIP'yi etkin tutarken, iMessage iş yükü için SIP kapalı ayrı bir Apple Silicon olmayan Mac (veya ayrılmış bir bot Mac) çalıştırabilirsiniz. Aşağıdaki Dedicated bot macOS user (separate iMessage identity) bölümüne bakın.
Erişim denetimi ve yönlendirme
DM policy
channels.imessage.dmPolicy doğrudan mesajları denetler:
pairing(varsayılan)allowlistopen(allowFromdeğerinin"*"içermesini gerektirir)disabled
İzin listesi alanı: channels.imessage.allowFrom.
İzin listesi girdileri gönderenleri tanımlamalıdır: tanıtıcılar veya statik gönderen erişim grupları (accessGroup:<name>). chat_id:*, chat_guid:* veya chat_identifier:* gibi sohbet hedefleri için channels.imessage.groupAllowFrom kullanın; sayısal chat_id kayıt anahtarları için channels.imessage.groups kullanın.
Group policy + mentions
channels.imessage.groupPolicy grup işlemeyi denetler:
allowlist(yapılandırıldığında varsayılan)opendisabled
Grup gönderen izin listesi: channels.imessage.groupAllowFrom.
groupAllowFrom girdileri statik gönderen erişim gruplarına da başvurabilir (accessGroup:<name>).
Çalışma zamanı geri dönüşü: groupAllowFrom ayarlanmamışsa, iMessage grup gönderen denetimleri allowFrom kullanır; DM ve grup kabulü farklı olmalıysa groupAllowFrom ayarlayın.
Çalışma zamanı notu: channels.imessage tamamen eksikse, çalışma zamanı groupPolicy="allowlist" değerine geri döner ve bir uyarı günlüğe kaydeder (channels.defaults.groupPolicy ayarlanmış olsa bile).
Gruplar için bahsetme geçidi:
- iMessage yerel bahsetme meta verisine sahip değildir
- bahsetme algılama regex kalıplarını kullanır (
agents.list[].groupChat.mentionPatterns, geri dönüşmessages.groupChat.mentionPatterns) - yapılandırılmış kalıp yoksa, bahsetme geçidi zorlanamaz
Yetkili gönderenlerden gelen denetim komutları gruplarda bahsetme geçidini atlayabilir.
Grup başına systemPrompt:
channels.imessage.groups.* altındaki her girdi isteğe bağlı bir systemPrompt dizesi kabul eder. Değer, o gruptaki bir mesajı işleyen her turda aracının sistem prompt'una enjekte edilir. Çözümleme, channels.whatsapp.groups tarafından kullanılan grup başına prompt çözümlemesini yansıtır:
- Gruba özgü sistem prompt'u (
groups["<chat_id>"].systemPrompt): belirli grup girdisi haritada mevcut olduğunda vesystemPromptanahtarı tanımlandığında kullanılır.systemPromptboş bir dizeyse ("") joker bastırılır ve o gruba sistem prompt'u uygulanmaz. - Grup joker sistem prompt'u (
groups["*"].systemPrompt): belirli grup girdisi haritada tamamen yoksa veya mevcut olupsystemPromptanahtarı tanımlamıyorsa kullanılır.
{ channels: { imessage: { groupPolicy: "allowlist", groupAllowFrom: ["+15555550123"], groups: { "*": { systemPrompt: "Use British spelling." }, "8421": { requireMention: true, systemPrompt: "This is the on-call rotation chat. Keep replies under 3 sentences.", }, "9907": { // explicit suppression: the wildcard "Use British spelling." does not apply here systemPrompt: "", }, }, }, },}Grup başına prompt'lar yalnızca grup mesajlarına uygulanır — bu kanaldaki doğrudan mesajlar etkilenmez.
Sessions and deterministic replies
- DM'ler doğrudan yönlendirme kullanır; gruplar grup yönlendirmesi kullanır.
- Varsayılan
session.dmScope=mainile iMessage DM'leri aracının ana oturumunda birleşir. - Grup oturumları izoledir (
agent:<agentId>:imessage:group:<chat_id>). - Yanıtlar, kaynak kanal/hedef meta verileri kullanılarak iMessage'a geri yönlendirilir.
Grup benzeri ileti dizisi davranışı:
Bazı çok katılımcılı iMessage ileti dizileri is_group=false ile gelebilir.
Bu chat_id, channels.imessage.groups altında açıkça yapılandırılmışsa, OpenClaw bunu grup trafiği olarak ele alır (grup geçidi + grup oturumu izolasyonu).
ACP konuşma bağlamaları
Eski iMessage sohbetleri ACP oturumlarına da bağlanabilir.
Hızlı operatör akışı:
- DM veya izin verilen grup sohbeti içinde
/acp spawn codex --bind hereçalıştırın. - Aynı iMessage konuşmasındaki gelecekteki mesajlar, oluşturulan ACP oturumuna yönlendirilir.
/newve/resetaynı bağlı ACP oturumunu yerinde sıfırlar./acp closeACP oturumunu kapatır ve bağlamayı kaldırır.
Yapılandırılmış kalıcı bağlamalar, type: "acp" ve match.channel: "imessage" içeren üst düzey bindings[] girdileri aracılığıyla desteklenir.
match.peer.id şunları kullanabilir:
+15555550123veyauser@example.comgibi normalleştirilmiş DM tanıtıcısıchat_id:<id>(kararlı grup bağlamaları için önerilir)chat_guid:<guid>chat_identifier:<identifier>
Örnek:
{ 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" }, }, ],}Paylaşılan ACP bağlama davranışı için ACP Agents bölümüne bakın.
Dağıtım kalıpları
Dedicated bot macOS user (separate iMessage identity)
Bot trafiğinin kişisel Messages profilinizden izole edilmesi için ayrılmış bir Apple ID ve macOS kullanıcısı kullanın.
Tipik akış:
- Ayrılmış bir macOS kullanıcısı oluşturun/oturum açın.
- Bu kullanıcıda bot Apple ID'siyle Messages oturumu açın.
- Bu kullanıcıda
imsgkurun. - OpenClaw'ın
imsgkomutunu bu kullanıcı bağlamında çalıştırabilmesi için SSH sarmalayıcısı oluşturun. channels.imessage.accounts.<id>.cliPathve.dbPathdeğerlerini bu kullanıcı profiline yönlendirin.
İlk çalıştırma, bu bot kullanıcı oturumunda GUI onayları (Automation + Full Disk Access) gerektirebilir.
Remote Mac over Tailscale (example)
Yaygın topoloji:
- gateway Linux/VM üzerinde çalışır
- iMessage +
imsg, tailnet'inizdeki bir Mac üzerinde çalışır cliPathsarmalayıcısıimsgçalıştırmak için SSH kullanırremoteHost, SCP ek getirmelerini etkinleştirir
Örnek:
{ 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 "$@"Hem SSH hem de SCP'nin etkileşimsiz olması için SSH anahtarları kullanın.
Önce ana makine anahtarının güvenilir olduğundan emin olun (örneğin ssh bot@mac-mini.tailnet-1234.ts.net) ki known_hosts doldurulsun.
Multi-account pattern
iMessage, channels.imessage.accounts altında hesap başına yapılandırmayı destekler.
Her hesap cliPath, dbPath, allowFrom, groupPolicy, mediaMaxMb, geçmiş ayarları ve ek kökü izin listeleri gibi alanları geçersiz kılabilir.
Direct-message history
Yeni doğrudan mesaj oturumlarını o konuşmaya ait yakın zamanda çözümlenmiş imsg geçmişiyle başlatmak için channels.imessage.dmHistoryLimit ayarlayın. Gönderen başına geçersiz kılmalar için channels.imessage.dms["<sender>"].historyLimit kullanın; bir gönderen için geçmişi devre dışı bırakmak üzere 0 dahil.
iMessage DM geçmişi, gerektikçe imsg üzerinden getirilir. dmHistoryLimit değerini ayarlamamak genel DM geçmişi başlatmayı devre dışı bırakır, ancak pozitif bir gönderen başına channels.imessage.dms["<sender>"].historyLimit değeri yine de o gönderen için başlatmayı etkinleştirir.
Medya, parçalama ve teslim hedefleri
Ekler ve medya
- gelen ek alımı varsayılan olarak kapalıdır — fotoğrafları, sesli notları, videoları ve diğer ekleri ajana iletmek için
channels.imessage.includeAttachments: trueayarlayın. Devre dışıyken, yalnızca ek içeren iMessage'lar ajana ulaşmadan bırakılır ve hiçInbound messagegünlük satırı üretmeyebilir. remoteHostayarlandığında uzak ek yolları SCP ile alınabilir- ek yolları izin verilen köklerle eşleşmelidir:
channels.imessage.attachmentRoots(yerel)channels.imessage.remoteAttachmentRoots(uzak SCP modu)- varsayılan kök deseni:
/Users/*/Library/Messages/Attachments
- SCP katı ana makine anahtarı denetimi kullanır (
StrictHostKeyChecking=yes) - giden medya boyutu
channels.imessage.mediaMaxMbkullanır (varsayılan 16 MB)
Giden parçalama
- metin parçası sınırı:
channels.imessage.textChunkLimit(varsayılan 4000) - parça modu:
channels.imessage.chunkModelength(varsayılan)newline(önce paragraf bölme)
Adresleme biçimleri
Tercih edilen açık hedefler:
chat_id:123(kararlı yönlendirme için önerilir)chat_guid:...chat_identifier:...
Tanıtıcı hedefleri de desteklenir:
imessage:+1555...sms:+1555...user@example.com
imsg chats --limit 20Özel API eylemleri
imsg launch çalışırken ve openclaw channels status --probe çıktısı privateApi.available: true bildirirken, ileti aracı normal metin göndermelerine ek olarak iMessage'a özgü eylemleri kullanabilir.
{ 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, }, }, },}Kullanılabilir eylemler
- react: iMessage tapback'leri ekleyin/kaldırın (
messageId,emoji,remove). Desteklenen tapback'ler sevgi, beğenme, beğenmeme, gülme, vurgulama ve soru ile eşleşir. - reply: Mevcut bir iletiye iş parçacıklı yanıt gönderin (
messageId,textveyamessage, artıchatGuid,chatId,chatIdentifierveyato). - sendWithEffect: Bir iMessage efektiyle metin gönderin (
textveyamessage,effectveyaeffectId). - edit: Desteklenen macOS/özel API sürümlerinde gönderilmiş bir iletiyi düzenleyin (
messageId,textveyanewText). - unsend: Desteklenen macOS/özel API sürümlerinde gönderilmiş bir iletiyi geri çekin (
messageId). - upload-file: Medya/dosya gönderin (
bufferbase64 olarak veya hydrate edilmişmedia/path/filePath,filename, isteğe bağlıasVoice). Eski takma ad:sendAttachment. - renameGroup, setGroupIcon, addParticipant, removeParticipant, leaveGroup: Geçerli hedef bir grup sohbetiyse grup sohbetlerini yönetin.
- poll: Yerel bir Apple Messages anketi oluşturun (
pollQuestion, 2 ila 12 kez yinelenenpollOption, artıchatGuid,chatId,chatIdentifierveyato). iOS/iPadOS/macOS 26+ üzerindeki alıcılar bunu yerel olarak görür ve oylar; daha eski OS sürümleri"Sent a poll"metin yedeği alır.selectors.pollPayloadMessagegerektirir. - poll-vote: Mevcut bir ankette oy verin (
pollIdveyamessageId, artıpollOptionIndex,pollOptionIdveyapollOptionTextöğelerinden tam olarak biri).selectors.pollVoteMessagevepoll.voteRPC yöntemini gerektirir.
Kabul edilen gelen anketler, soru, numaralı seçenek etiketleri, oy sayıları ve poll-vote için gereken anket ileti kimliğiyle ajan için işlenir.
İleti kimlikleri
Gelen iMessage bağlamı, kullanılabilir olduğunda hem kısa MessageSid değerlerini hem de tam ileti GUID'lerini içerir. Kısa kimlikler son SQLite destekli yanıt önbelleği kapsamındadır ve kullanılmadan önce geçerli sohbetle denetlenir. Kısa kimliğin süresi dolmuşsa veya başka bir sohbete aitse, tam MessageSidFull ile yeniden deneyin.
Yetenek algılama
OpenClaw özel API eylemlerini yalnızca önbelleğe alınmış yoklama durumu köprünün kullanılamadığını söylediğinde gizler. Durum bilinmiyorsa, eylemler görünür kalır ve gönderim yoklamaları tembel biçimde yapar; böylece ilk eylem imsg launch sonrasında ayrı bir elle durum yenilemesi olmadan başarılı olabilir.
Okundu bilgileri ve yazıyor göstergesi
Özel API köprüsü çalışıyorsa, kabul edilen gelen sohbetler okundu olarak işaretlenir ve doğrudan sohbetler, ajan bağlamı hazırlayıp üretirken tur kabul edilir edilmez yazıyor balonu gösterir. Okundu işaretlemeyi şu şekilde devre dışı bırakın:
{ channels: { imessage: { sendReadReceipts: false, }, },}Yöntem başına yetenek listesinden önceki eski imsg derlemeleri, yazıyor/okundu bilgisini sessizce kapatır; OpenClaw, eksik okundu bilgisinin nedeni anlaşılabilsin diye her yeniden başlatmada bir kez uyarı günlüğe yazar.
Gelen tapback'ler
OpenClaw iMessage tapback'lerine abone olur ve kabul edilen tepkileri normal ileti metni yerine sistem olayları olarak yönlendirir; böylece bir kullanıcı tapback'i olağan bir yanıt döngüsünü tetiklemez.
Bildirim modu channels.imessage.reactionNotifications ile denetlenir:
"own"(varsayılan): yalnızca kullanıcılar bot tarafından yazılmış iletilere tepki verdiğinde bildir."all": yetkili gönderenlerden gelen tüm tapback'ler için bildir."off": gelen tapback'leri yok say.
Hesap başına geçersiz kılmalar channels.imessage.accounts.<id>.reactionNotifications kullanır.
Onay tepkileri (👍 / 👎)
approvals.exec.enabled veya approvals.plugin.enabled true olduğunda ve istek iMessage'a yönlendirildiğinde, Gateway onay istemini yerel olarak iletir ve bunu çözmek için bir tapback kabul eder:
👍(Beğen tapback'i) →allow-once👎(Beğenme tapback'i) →denyallow-alwayselle kullanılan bir yedek olarak kalır: normal yanıt olarak/approve <id> allow-alwaysgönderin.
Tepki işleme, tepki veren kullanıcının tanıtıcısının açık bir onaylayıcı olmasını gerektirir. Onaylayıcı listesi channels.imessage.allowFrom içinden (veya channels.imessage.accounts.<id>.allowFrom içinden) okunur; kullanıcının telefon numarasını E.164 biçiminde veya Apple ID e-postasını ekleyin. Joker giriş "*" dikkate alınır ancak herhangi bir gönderenin onaylamasına izin verir. Tepki kısayolu, reactionNotifications, dmPolicy ve groupAllowFrom değerlerini kasıtlı olarak atlar; çünkü onay çözümlemesi için önemli olan tek kapı açık onaylayıcı izin listesidir.
Bu sürümle gelen davranış değişikliği: channels.imessage.allowFrom boş değilse, /approve <id> <decision> metin komutu artık daha geniş DM izin listesine göre değil, bu onaylayıcı listesine göre yetkilendirilir. DM izin listesinde izin verilen ancak allowFrom içinde olmayan gönderenler açık bir ret alır. Önceki davranışı korumak için /approve ile (ve tepkilerle) onay verebilmesi gereken her operatörü allowFrom içine ekleyin. allowFrom boş olduğunda eski "aynı sohbet yedeği" yürürlükte kalır ve /approve, DM izin listesinin izin verdiği herkesi yetkilendirmeye devam eder.
Operatör notları:
- Tepki bağlaması hem bellekte (onay süresiyle eşleşen TTL ile) hem de Gateway'in kalıcı anahtarlı deposunda saklanır; böylece Gateway yeniden başlatıldıktan kısa süre sonra gelen bir tapback yine de onayı çözer.
- Cihazlar arası
is_from_me=truetapback'leri (operatörün eşleştirilmiş bir Apple cihazındaki kendi tepkisi), botun kendi kendini onaylayamaması için kasıtlı olarak yok sayılır. - Eski metin tarzı tapback'ler (çok eski Apple istemcilerinden gelen
Liked "…"düz metni), ileti GUID'i taşımadıkları için onayları çözemez; tepki çözümlemesi, güncel macOS / iOS istemcilerinin yaydığı yapılandırılmış tapback meta verilerini gerektirir.
Yapılandırma yazmaları
iMessage, kanal tarafından başlatılan yapılandırma yazmalarına varsayılan olarak izin verir (commands.config: true olduğunda /config set|unset için).
Devre dışı bırakma:
{ channels: { imessage: { configWrites: false, }, },}Bölünmüş gönderimli DM'leri birleştirme (tek kompozisyonda komut + URL)
Bir kullanıcı bir komut ve URL'yi birlikte yazdığında — ör. Dump https://example.com/article — Apple'ın Messages uygulaması gönderimi iki ayrı chat.db satırına böler:
- Bir metin iletisi (
"Dump"). - OG önizleme görsellerinin ek olarak bulunduğu bir URL önizleme balonu (
"https://...").
İki satır çoğu kurulumda OpenClaw'a yaklaşık 0.8-2.0 sn arayla ulaşır. Birleştirme olmadan, ajan 1. turda yalnızca komutu alır, yanıt verir (çoğu zaman "URL'yi bana gönder" der) ve URL'yi ancak 2. turda görür — o noktada komut bağlamı zaten kaybolmuştur. Bu, Apple'ın gönderim işlem hattıdır; OpenClaw veya imsg tarafından eklenen bir şey değildir.
channels.imessage.coalesceSameSenderDms, bir DM'yi aynı gönderenden gelen ardışık satırları arabelleğe almaya dahil eder. imsg, kaynak satırlardan birinde yapısal URL önizleme işaretçisi balloon_bundle_id: "com.apple.messages.URLBalloonProvider" değerini sunduğunda, OpenClaw yalnızca bu gerçek bölünmüş gönderimi birleştirir ve arabelleğe alınmış diğer satırları ayrı turlar olarak tutar. Hiç balon meta verisi yaymayan daha eski imsg derlemelerinde OpenClaw, bölünmüş gönderimi ayrı gönderimlerden ayırt edemez; bu yüzden kovayı birleştirmeye geri döner. Bu, Dump <url> bölünmüş gönderimlerini iki tura geriletmek yerine meta veri öncesi davranışı korur. Grup sohbetleri, çok kullanıcılı tur yapısının korunması için ileti başına gönderilmeye devam eder.
Ne zaman etkinleştirilmeli
Şu durumlarda etkinleştirin:
- Tek iletide
command + payloadbekleyen Skills gönderiyorsanız (dump, paste, save, queue vb.). - Kullanıcılarınız komutların yanına URL yapıştırıyorsa.
- Eklenen DM tur gecikmesini kabul edebiliyorsanız (aşağıya bakın).
Şu durumlarda devre dışı bırakılmış bırakın:
- Tek kelimelik DM tetikleyicileri için en düşük komut gecikmesine ihtiyacınız varsa.
- Tüm akışlarınız yük devamı olmayan tek seferlik komutlarsa.
Etkinleştirme
{ channels: { imessage: { coalesceSameSenderDms: true, // dahil ol (varsayılan: false) }, },}Bayrak açıkken ve açık bir messages.inbound.byChannel.imessage veya genel messages.inbound.debounceMs yokken, geri sekme önleme penceresi 7000 ms değerine genişler (eski varsayılan 0 ms'dir — geri sekme önleme yoktur). Daha geniş pencere gereklidir, çünkü Apple'ın URL önizlemeli bölünmüş gönderim temposu, Messages.app önizleme satırını yayarken birkaç saniyeye uzayabilir.
Pencereyi kendiniz ayarlamak için:
{ messages: { inbound: { byChannel: { // 7000 ms, gözlemlenen Messages.app URL önizleme gecikmelerini kapsar. imessage: 7000, }, }, },}Ödünler
- Kesin birleştirme güncel
imsgyük metaverisi gerektirir. URL satırıballoon_bundle_idiçerdiğinde yalnızca o gerçek bölünmüş gönderim birleştirilir ve diğer tamponlanan satırlar ayrı kalır. Balon metaverisi göstermeyen eskiimsgderlemelerinde OpenClaw tamponlanan kovayı birleştirmeye geri döner; böyleceDump <url>bölünmüş gönderimleri iki tura gerilemez (geçici geriye dönük uyumluluk,imsgbölünmüş gönderimleri yukarı akışta birleştirdiğinde kaldırılır). - DM iletileri için ek gecikme. Bayrak açıkken her DM (bağımsız denetim komutları ve tek metinli takipler dahil), bir URL önizleme satırı gelme olasılığına karşı gönderilmeden önce en fazla debounce penceresi kadar bekler. Grup sohbeti iletileri anında gönderilmeye devam eder.
- Birleştirilmiş çıktı sınırlıdır. Birleştirilmiş metin, açık bir
…[truncated]işaretçisiyle 4000 karakterde sınırlandırılır; ekler 20 ile sınırlıdır; kaynak girdileri 10 ile sınırlıdır (bunun ötesinde ilk ve en son korunur). Her kaynak GUID'i aşağı akış telemetrisi içincoalescedMessageGuidsiçinde izlenir. - Yalnızca DM. Grup sohbetleri ileti başına gönderime düşer; böylece birden çok kişi yazarken bot duyarlı kalır.
- İsteğe bağlı, kanal başına. Diğer kanallar (Telegram, WhatsApp, Slack, …) etkilenmez.
channels.bluebubbles.coalesceSameSenderDmsayarlayan eski BlueBubbles yapılandırmaları bu değerichannels.imessage.coalesceSameSenderDmskonumuna taşımalıdır.
Senaryolar ve aracının gördükleri
"Bayrak açık" sütunu, balloon_bundle_id yayan bir imsg derlemesindeki davranışı gösterir. Hiç balon metaverisi yaymayan eski imsg derlemelerinde, aşağıda "İki tur" / "N tur" olarak işaretlenen satırlar bunun yerine eski bir birleştirmeye (tek tur) geri döner: OpenClaw, bölünmüş gönderimi ayrı gönderimlerden yapısal olarak ayırt edemez, bu yüzden metaveri öncesi birleştirmeyi korur. Kesin ayırma, derleme balon metaverisi yaymaya başladığında etkinleşir.
| Kullanıcı şunu oluşturur | chat.db şunu üretir |
Bayrak kapalı (varsayılan) | Bayrak açık + pencere (imsg balon metaverisi yayar) |
|---|---|---|---|
Dump https://example.com (tek gönderim) |
~1 sn arayla 2 satır | İki aracı turu: önce yalnızca "Dump", sonra URL | Tek tur: birleştirilmiş metin Dump https://example.com |
Save this 📎image.jpg caption (ek + metin) |
URL balon metaverisi olmadan 2 satır | İki tur | Metaveri gözlendikten sonra iki tur; eski/mandal öncesi metaverisiz oturumlarda tek birleştirilmiş tur |
/status (bağımsız komut) |
1 satır | Anında gönderim | Pencereye kadar bekle, sonra gönder |
| Tek başına yapıştırılan URL | 1 satır | Anında gönderim | Pencereye kadar bekle, sonra gönder |
| Dakikalar arayla kasıtlı olarak iki ayrı ileti halinde gönderilen metin + URL | Pencere dışında 2 satır | İki tur | İki tur (pencere aralarında sona erer) |
| Hızlı akış (pencere içinde >10 küçük DM) | URL balon metaverisi olmadan N satır | N tur | Metaveri gözlendikten sonra N tur; eski/mandal öncesi metaverisiz oturumlarda tek sınırlı birleştirilmiş tur |
| Grup sohbetinde iki kişi yazıyor | M gönderenden N satır | M+ tur (gönderen kovası başına bir) | M+ tur — grup sohbetleri birleştirilmez |
Köprü veya Gateway yeniden başlatıldıktan sonra gelen ileti kurtarma
iMessage, Gateway kapalıyken kaçırılan iletileri kurtarır ve aynı anda Apple'ın bir Push kurtarmasından sonra boşaltabileceği bayat "birikmiş işler bombası"nı bastırır. Varsayılan davranış her zaman açıktır ve gelen tekilleştirme üzerine kuruludur.
- Yeniden oynatma tekilleştirmesi. Gönderilen her gelen ileti, Apple GUID'iyle kalıcı Plugin durumuna (
imessage.inbound-dedupe) kaydedilir; alım sırasında sahiplenilir ve işlendikten sonra işlenmiş olarak kaydedilir (geçici hatada yeniden deneyebilmesi için serbest bırakılır). Zaten işlenmiş olan her şey, iki kez gönderilmek yerine düşürülür. Kurtarmanın ileti başına defter tutmadan agresif biçimde yeniden oynatabilmesini sağlayan şey budur. - Kesinti süresi kurtarması. Başlangıçta izleyici, son gönderilen
chat.dbrowid değerini (hesap başına kalıcı imleç) hatırlar ve bunusince_rowidolarakimsg watch.subscribeöğesine geçirir; böyleceimsg, Gateway kapalıyken gelen satırları yeniden oynatır ve ardından canlı kuyruğu izler. Yeniden oynatma en son satırlarla ve yaklaşık 2 saate kadar eski iletilerle sınırlıdır; tekilleştirme de zaten işlenmiş olan her şeyi düşürür. - Bayat birikmiş işler yaş sınırı. Başlangıç sınırının üzerindeki satırlar gerçekten canlıdır; gönderim tarihi varışından yaklaşık 15 dakikadan daha eski olanlar Push boşaltma birikmiş işleridir ve bastırılır. Yeniden oynatılan satırlar (sınırda veya altında olanlar) bunun yerine daha geniş kurtarma penceresini kullanır; böylece yakın zamanda kaçırılan bir ileti teslim edilirken kadim geçmiş teslim edilmez.
Kurtarma hem yerel hem uzak cliPath kurulumlarında çalışır, çünkü since_rowid yeniden oynatması aynı imsg RPC bağlantısı üzerinden yürür. Fark pencerededir: Gateway chat.db okuyabildiğinde (yerel), başlangıç rowid sınırını sabitler, yeniden oynatma aralığını sınırlar ve birkaç saate kadar eski kaçırılmış iletileri teslim eder. Uzak SSH cliPath üzerinden veritabanını okuyamaz; bu yüzden yeniden oynatma sınırsızdır ve her satır canlı yaş sınırını kullanır — yakın zamanda kaçırılan iletileri yine kurtarır ve eski birikmiş işleri yine bastırır, yalnızca daha dar canlı pencereyle. Daha geniş kurtarma penceresi için Gateway'i Messages Mac üzerinde çalıştırın.
Operatöre görünen sinyal
Bastırılan birikmiş işler varsayılan düzeyde günlüklenir, asla sessizce düşürülmez (recovery bayrağı hangi pencerenin uygulandığını gösterir):
imessage: suppressed stale inbound backlog account=<id> sent=<iso> recovery=<bool> (<N> suppressed since start)Migrasyon
channels.imessage.catchup.* kullanımdan kaldırıldı — kesinti süresi kurtarması artık otomatiktir ve yeni kurulumlar için yapılandırma gerektirmez. catchup.enabled: true içeren mevcut yapılandırmalar, kurtarma yeniden oynatma penceresi için uyumluluk profili olarak desteklenmeye devam eder. Devre dışı catchup blokları (enabled: false veya enabled: true olmayanlar) emekliye ayrıldı; openclaw doctor --fix bunları kaldırır.
Sorun giderme
imsg bulunamadı veya RPC desteklenmiyor
İkiliyi ve RPC desteğini doğrulayın:
imsg rpc --helpimsg status --jsonopenclaw channels status --probeProbe RPC'nin desteklenmediğini bildirirse imsg öğesini güncelleyin. Özel API eylemleri kullanılamıyorsa oturum açmış macOS kullanıcı oturumunda imsg launch çalıştırın ve yeniden probe edin. Gateway macOS üzerinde çalışmıyorsa varsayılan yerel imsg yolu yerine yukarıdaki SSH üzerinden Uzak Mac kurulumunu kullanın.
İletiler gönderiliyor ama gelen iMessage'lar ulaşmıyor
Önce iletinin yerel Mac'e ulaşıp ulaşmadığını kanıtlayın. chat.db değişmiyorsa, imsg status --json sağlıklı bir köprü bildirse bile OpenClaw iletiyi alamaz.
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;"Telefondan gönderilen iletiler yeni satır oluşturmuyorsa OpenClaw yapılandırmasını değiştirmeden önce macOS Messages ve Apple Push katmanını onarın. Tek seferlik bir servis yenilemesi çoğu zaman yeterlidir:
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 restartTelefondan yeni bir iMessage gönderin ve OpenClaw oturumlarında hata ayıklamadan önce yeni bir chat.db satırını veya imsg watch olayını doğrulayın. Bunu periyodik köprü yeniden başlatma döngüsü olarak çalıştırmayın; etkin çalışma sırasında tekrarlanan imsg launch ve Gateway yeniden başlatmaları teslimatları kesintiye uğratabilir ve devam eden kanal çalıştırmalarını yarıda bırakabilir.
Gateway macOS üzerinde çalışmıyor
Varsayılan cliPath: "imsg", Messages oturumu açılmış Mac üzerinde çalışmalıdır. Linux veya Windows üzerinde, channels.imessage.cliPath değerini o Mac'e SSH yapan ve imsg "$@" çalıştıran bir sarmalayıcı betiğe ayarlayın.
#!/usr/bin/env bashexec ssh -T messages-mac imsg "$@"Ardından şunu çalıştırın:
openclaw channels status --probe --channel imessageDM'ler yok sayılıyor
Kontrol edin:
channels.imessage.dmPolicychannels.imessage.allowFrom- eşleştirme onayları (
openclaw pairing list imessage)
Grup iletileri yok sayılıyor
Kontrol edin:
channels.imessage.groupPolicychannels.imessage.groupAllowFromchannels.imessage.groupsizin listesi davranışı- bahsetme deseni yapılandırması (
agents.list[].groupChat.mentionPatterns)
Uzak ekler başarısız oluyor
Kontrol edin:
channels.imessage.remoteHostchannels.imessage.remoteAttachmentRoots- Gateway ana makinesinden SSH/SCP anahtar kimlik doğrulaması
- Gateway ana makinesinde
~/.ssh/known_hostsiçinde ana makine anahtarı var - Messages çalıştıran Mac üzerinde uzak yolun okunabilirliği
macOS izin istemleri kaçırıldı
Aynı kullanıcı/oturum bağlamında etkileşimli bir GUI terminalinde yeniden çalıştırın ve istemleri onaylayın:
imsg chats --limit 1imsg send <handle> "test"OpenClaw/imsg çalıştıran süreç bağlamı için Full Disk Access + Automation izinlerinin verildiğini doğrulayın.
Yapılandırma referansı işaretçileri
İlgili
- Kanallara Genel Bakış — desteklenen tüm kanallar
- BlueBubbles'ın kaldırılması ve imsg iMessage yolu — duyuru ve migrasyon özeti
- BlueBubbles'tan geçiş — yapılandırma çeviri tablosu ve adım adım geçiş
- Eşleştirme — DM kimlik doğrulaması ve eşleştirme akışı
- Gruplar — grup sohbeti davranışı ve bahsetme kapısı
- Kanal Yönlendirme — iletiler için oturum yönlendirme
- Güvenlik — erişim modeli ve sıkılaştırma