iMessage (legacy: imsg)¶
Zalecane: Do nowych konfiguracji iMessage używaj BlueBubbles.
Kanał
imsgjest starszą integracją zewnętrznego CLI i może zostać usunięty w przyszłej wersji.
Status: starsza integracja zewnętrznego CLI. Gateway uruchamia imsg rpc (JSON-RPC przez stdio).
Szybka konfiguracja (dla początkujących)¶
- Upewnij się, że aplikacja Messages jest zalogowana na tym Macu.
- Zainstaluj
imsg: -brew install steipete/tap/imsg - Skonfiguruj OpenClaw z
channels.imessage.cliPathichannels.imessage.dbPath. - Uruchom gateway i zatwierdź wszystkie monity macOS (Automatyzacja + Pełny dostęp do dysku).
Minimalna konfiguracja:
{
channels: {
imessage: {
enabled: true,
cliPath: "/usr/local/bin/imsg",
dbPath: "/Users/<you>/Library/Messages/chat.db",
},
},
}
Czym to jest¶
- Kanał iMessage oparty na
imsgw systemie macOS. - Deterministyczne routowanie: odpowiedzi zawsze wracają do iMessage.
- DM-y współdzielą główną sesję agenta; grupy są izolowane (
agent:<agentId>:imessage:group:<chat_id>). - Jeśli wątek z wieloma uczestnikami dotrze z
is_group=false, nadal możesz go izolować,chat_idużywającchannels.imessage.groups(zobacz „Wątki typu grupowego” poniżej).
Zapisy konfiguracji¶
Domyślnie iMessage może zapisywać aktualizacje konfiguracji wyzwalane przez /config set|unset (wymaga commands.config: true).
Wyłącz za pomocą:
{
channels: { imessage: { configWrites: false } },
}
Wymagania¶
- macOS z zalogowaną aplikacją Messages.
- Pełny dostęp do dysku dla OpenClaw +
imsg(dostęp do bazy danych Messages). - Uprawnienie Automatyzacji podczas wysyłania.
channels.imessage.cliPathmoże wskazywać dowolne polecenie, które pośredniczy stdin/stdout (na przykład skrypt opakowujący, który łączy się przez SSH z innym Makiem i uruchamiaimsg rpc).
Rozwiązywanie problemów z macOS Privacy and Security TCC¶
Jeśli wysyłanie/odbieranie nie działa (na przykład imsg rpc kończy się kodem niezerowym, przekracza limit czasu lub gateway sprawia wrażenie zawieszonego), częstą przyczyną jest monit o uprawnienia macOS, który nigdy nie został zatwierdzony.
macOS przyznaje uprawnienia TCC na aplikację/kontekst procesu. Zatwierdzaj monity w tym samym kontekście, który uruchamia imsg (na przykład Terminal/iTerm, sesja LaunchAgent lub proces uruchomiony przez SSH).
Lista kontrolna:
- Pełny dostęp do dysku: zezwól na dostęp procesowi uruchamiającemu OpenClaw (oraz wszelkim powłokom/opakowaniom SSH, które wykonują
imsg). Jest to wymagane do odczytu bazy danych Messages (chat.db). - Automatyzacja → Messages: zezwól procesowi uruchamiającemu OpenClaw (i/lub terminalowi) na kontrolowanie Messages.app w celu wysyłania wychodzących.
- Stan zdrowia CLI
imsg: sprawdź, czyimsgjest zainstalowane i obsługuje RPC (imsg rpc --help).
Wskazówka: Jeśli OpenClaw działa bez interfejsu (LaunchAgent/systemd/SSH), monit macOS łatwo przeoczyć. Uruchom jednorazowe polecenie interaktywne w terminalu GUI, aby wymusić monit, a następnie spróbuj ponownie:
imsg chats --limit 1
# or
imsg send <handle> "test"
Powiązane uprawnienia folderów macOS (Biurko/Dokumenty/Pobrane): /platforms/mac/permissions.
Konfiguracja (szybka ścieżka)¶
- Upewnij się, że aplikacja Messages jest zalogowana na tym Macu.
- Skonfiguruj iMessage i uruchom gateway.
Dedykowany użytkownik macOS dla bota (dla izolowanej tożsamości)¶
Jeśli chcesz, aby bot wysyłał z oddzielnej tożsamości iMessage (i zachować porządek w osobistych Wiadomościach), użyj dedykowanego Apple ID + dedykowanego użytkownika macOS.
- Utwórz dedykowane Apple ID (przykład:
my-cool-bot@icloud.com). - Apple może wymagać numeru telefonu do weryfikacji / 2FA. - Utwórz użytkownika macOS (przykład:
openclawhome) i zaloguj się do niego. - Otwórz Messages na tym użytkowniku macOS i zaloguj się do iMessage przy użyciu Apple ID bota.
- Włącz Zdalne logowanie (Ustawienia systemowe → Ogólne → Udostępnianie → Zdalne logowanie).
- Zainstaluj
imsg: -brew install steipete/tap/imsg - Skonfiguruj SSH tak, aby
ssh <bot-macos-user>@localhost truedziałało bez hasła. - Ustaw
channels.imessage.accounts.bot.cliPathna opakowanie SSH, które uruchamiaimsgjako użytkownik bota.
Uwaga przy pierwszym uruchomieniu: wysyłanie/odbieranie może wymagać zatwierdzeń GUI (Automatyzacja + Pełny dostęp do dysku) u użytkownika macOS bota. Jeśli imsg rpc wygląda na zawieszone lub kończy działanie, zaloguj się na tego użytkownika (pomaga Udostępnianie ekranu), uruchom jednorazowo imsg chats --limit 1 / imsg send ..., zatwierdź monity, a następnie spróbuj ponownie. Zobacz Rozwiązywanie problemów z macOS Privacy and Security TCC.
Przykładowe opakowanie (chmod +x). Zastąp <bot-macos-user> rzeczywistą nazwą użytkownika macOS:
#!/usr/bin/env bash
set -euo pipefail
# Run an interactive SSH once first to accept host keys:
# ssh <bot-macos-user>@localhost true
exec /usr/bin/ssh -o BatchMode=yes -o ConnectTimeout=5 -T <bot-macos-user>@localhost \
"/usr/local/bin/imsg" "$@"
Przykładowa konfiguracja:
{
channels: {
imessage: {
enabled: true,
accounts: {
bot: {
name: "Bot",
enabled: true,
cliPath: "/path/to/imsg-bot",
dbPath: "/Users/<bot-macos-user>/Library/Messages/chat.db",
},
},
},
},
}
Dla konfiguracji z jednym kontem użyj opcji płaskich (channels.imessage.cliPath, channels.imessage.dbPath) zamiast mapy accounts.
Wariant zdalny/SSH (opcjonalny)¶
Jeśli chcesz używać iMessage na innym Macu, ustaw channels.imessage.cliPath na opakowanie, które uruchamia imsg na zdalnym hoście macOS przez SSH. OpenClaw potrzebuje tylko stdio.
Przykładowe opakowanie:
#!/usr/bin/env bash
exec ssh -T gateway-host imsg "$@"
Zdalne załączniki: Gdy cliPath wskazuje zdalny host przez SSH, ścieżki załączników w bazie danych Messages odnoszą się do plików na zdalnej maszynie. OpenClaw może automatycznie pobierać je przez SCP, ustawiając channels.imessage.remoteHost:
{
channels: {
imessage: {
cliPath: "~/imsg-ssh", // SSH wrapper to remote Mac
remoteHost: "user@gateway-host", // for SCP file transfer
includeAttachments: true,
},
},
}
Jeśli remoteHost nie jest ustawione, OpenClaw próbuje wykryć je automatycznie, parsując polecenie SSH w skrypcie opakowującym. Dla niezawodności zalecana jest jawna konfiguracja.
Zdalny Mac przez Tailscale (przykład)¶
Jeśli Gateway działa na hoście/VM z Linuxem, ale iMessage musi działać na Macu, Tailscale jest najprostszym mostem: Gateway komunikuje się z Makiem przez tailnet, uruchamia imsg przez SSH i pobiera załączniki przez SCP.
Architektura:
%%{init: {
'theme': 'base',
'themeVariables': {
'primaryColor': '#ffffff',
'primaryTextColor': '#000000',
'primaryBorderColor': '#000000',
'lineColor': '#000000',
'secondaryColor': '#f9f9fb',
'tertiaryColor': '#ffffff',
'clusterBkg': '#f9f9fb',
'clusterBorder': '#000000',
'nodeBorder': '#000000',
'mainBkg': '#ffffff',
'edgeLabelBackground': '#ffffff'
}
}}%%
flowchart TB
subgraph T[" "]
subgraph Tailscale[" "]
direction LR
Gateway["<b>Gateway host (Linux/VM)<br></b><br>openclaw gateway<br>channels.imessage.cliPath"]
Mac["<b>Mac with Messages + imsg<br></b><br>Messages signed in<br>Remote Login enabled"]
end
Gateway -- SSH (imsg rpc) --> Mac
Mac -- SCP (attachments) --> Gateway
direction BT
User["user@gateway-host"] -- "Tailscale tailnet (hostname or 100.x.y.z)" --> Gateway
end
Konkretny przykład konfiguracji (nazwa hosta Tailscale):
{
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",
},
},
}
Przykładowe opakowanie (~/.openclaw/scripts/imsg-ssh):
#!/usr/bin/env bash
exec ssh -T bot@mac-mini.tailnet-1234.ts.net imsg "$@"
Uwagi:
- Upewnij się, że Mac jest zalogowany do Messages, a Zdalne logowanie jest włączone.
- Użyj kluczy SSH, aby
ssh bot@mac-mini.tailnet-1234.ts.netdziałało bez monitów. remoteHostpowinno odpowiadać celowi SSH, aby SCP mogło pobierać załączniki.
Obsługa wielu kont: użyj channels.imessage.accounts z konfiguracją per konto i opcjonalnym name. Zobacz gateway/configuration dla wspólnego wzorca. Nie commituj ~/.openclaw/openclaw.json (często zawiera tokeny).
Kontrola dostępu (DM-y + grupy)¶
DM-y:
- Domyślnie:
channels.imessage.dmPolicy = "pairing". - Nieznani nadawcy otrzymują kod parowania; wiadomości są ignorowane do czasu zatwierdzenia (kody wygasają po 1 godzinie).
- Zatwierdzanie przez:
openclaw pairing list imessageopenclaw pairing approve imessage <CODE>- Parowanie jest domyślną wymianą tokenów dla DM-ów iMessage. Szczegóły: Parowanie
Grupy:
channels.imessage.groupPolicy = open | allowlist | disabled.channels.imessage.groupAllowFromkontroluje, kto może wyzwalać w grupach, gdy ustawione jestallowlist.- Bramka wzmianek używa
agents.list[].groupChat.mentionPatterns(lubmessages.groupChat.mentionPatterns), ponieważ iMessage nie ma natywnych metadanych wzmianek. - Nadpisanie wieloagentowe: ustaw wzorce per agent w
agents.list[].groupChat.mentionPatterns.
Jak to działa (zachowanie)¶
imsgstrumieniuje zdarzenia wiadomości; gateway normalizuje je do wspólnej koperty kanału.- Odpowiedzi zawsze wracają do tego samego identyfikatora czatu lub uchwytu.
Wątki typu grupowego (is_group=false)¶
Niektóre wątki iMessage mogą mieć wielu uczestników, ale nadal docierać z is_group=false, w zależności od tego, jak Messages przechowuje identyfikator czatu.
Jeśli jawnie skonfigurujesz chat_id w channels.imessage.groups, OpenClaw traktuje ten wątek jako „grupę” dla:
- izolacji sesji (oddzielny klucz sesji
agent:<agentId>:imessage:group:<chat_id>) - list dozwolonych dla grup / zachowania bramkowania wzmianek
Przykład:
{
channels: {
imessage: {
groupPolicy: "allowlist",
groupAllowFrom: ["+15555550123"],
groups: {
"42": { requireMention: false },
},
},
},
}
Jest to przydatne, gdy chcesz mieć izolowaną osobowość/model dla konkretnego wątku (zobacz Routing wieloagentowy). W zakresie izolacji systemu plików zobacz Sandboxing.
Media + limity¶
- Opcjonalne wczytywanie załączników przez
channels.imessage.includeAttachments. - Limit mediów przez
channels.imessage.mediaMaxMb.
Limity¶
- Tekst wychodzący jest dzielony na fragmenty do
channels.imessage.textChunkLimit(domyślnie 4000). - Opcjonalne dzielenie po nowych liniach: ustaw
channels.imessage.chunkMode="newline", aby dzielić po pustych liniach (granice akapitów) przed dzieleniem według długości. - Wysyłanie mediów jest ograniczone przez
channels.imessage.mediaMaxMb(domyślnie 16).
Adresowanie / cele dostarczania¶
Preferuj chat_id dla stabilnego routowania:
chat_id:123(preferowane)chat_guid:...chat_identifier:...- bezpośrednie uchwyty:
imessage:+1555/sms:+1555/user@example.com
Lista czatów:
imsg chats --limit 20
Referencja konfiguracji (iMessage)¶
Pełna konfiguracja: Konfiguracja
Opcje dostawcy:
channels.imessage.enabled: włącz/wyłącz uruchamianie kanału.channels.imessage.cliPath: ścieżka doimsg.channels.imessage.dbPath: ścieżka bazy danych Messages.channels.imessage.remoteHost: host SSH dla transferu załączników przez SCP, gdycliPathwskazuje zdalnego Maca (np.user@gateway-host). Automatycznie wykrywane z opakowania SSH, jeśli nie ustawione.channels.imessage.service:imessage | sms | auto.channels.imessage.region: region SMS.channels.imessage.dmPolicy:pairing | allowlist | open | disabled(domyślnie: parowanie).channels.imessage.allowFrom: lista dozwolonych DM-ów (uchwyty, e-maile, numery E.164 lubchat_id:*).openwymaga"*". iMessage nie ma nazw użytkowników; używaj uchwytów lub celów czatu.channels.imessage.groupPolicy:open | allowlist | disabled(domyślnie: lista dozwolonych).channels.imessage.groupAllowFrom: lista dozwolonych nadawców w grupach.channels.imessage.historyLimit/channels.imessage.accounts.*.historyLimit: maksymalna liczba wiadomości grupowych do włączenia jako kontekst (0 wyłącza).channels.imessage.dmHistoryLimit: limit historii DM w turach użytkownika. Nadpisania per użytkownik:channels.imessage.dms["<handle>"].historyLimit.channels.imessage.groups: domyślne ustawienia per grupa + lista dozwolonych (użyj"*"dla globalnych domyślnych).channels.imessage.includeAttachments: wczytywanie załączników do kontekstu.channels.imessage.mediaMaxMb: limit mediów przychodzących/wychodzących (MB).channels.imessage.textChunkLimit: rozmiar fragmentu wychodzącego (znaki).channels.imessage.chunkMode:length(domyślne) lubnewlinedo dzielenia po pustych liniach (granice akapitów) przed dzieleniem według długości.
Powiązane opcje globalne:
agents.list[].groupChat.mentionPatterns(lubmessages.groupChat.mentionPatterns).messages.responsePrefix.