Przejdź do głównej treści

iMessage (starsze: imsg)

W przypadku nowych wdrożeń iMessage używaj BlueBubbles.Integracja imsg jest starsza i może zostać usunięta w przyszłym wydaniu.
Status: starsza zewnętrzna integracja CLI. Gateway uruchamia imsg rpc i komunikuje się przez JSON-RPC na stdio (bez osobnego demona/portu).

BlueBubbles (zalecane)

Preferowana ścieżka iMessage dla nowych konfiguracji.

Parowanie

Prywatne wiadomości iMessage domyślnie używają trybu parowania.

Dokumentacja konfiguracji

Pełna dokumentacja pól iMessage.

Szybka konfiguracja

1

Zainstaluj i sprawdź imsg

brew install steipete/tap/imsg
imsg rpc --help
2

Skonfiguruj OpenClaw

{
  channels: {
    imessage: {
      enabled: true,
      cliPath: "/usr/local/bin/imsg",
      dbPath: "/Users/<you>/Library/Messages/chat.db",
    },
  },
}
3

Uruchom gateway

openclaw gateway
4

Zatwierdź pierwsze parowanie w wiadomości prywatnej (domyślne dmPolicy)

openclaw pairing list imessage
openclaw pairing approve imessage <CODE>
Żądania parowania wygasają po 1 godzinie.

Wymagania i uprawnienia (macOS)

  • Messages musi być zalogowane na Macu, na którym działa imsg.
  • Dla kontekstu procesu uruchamiającego OpenClaw/imsg wymagany jest Full Disk Access (dostęp do bazy danych Messages).
  • Do wysyłania wiadomości przez Messages.app wymagane jest uprawnienie Automation.
Uprawnienia są przyznawane dla każdego kontekstu procesu osobno. Jeśli gateway działa bez interfejsu (LaunchAgent/SSH), uruchom jednorazowo interaktywne polecenie w tym samym kontekście, aby wywołać monity:
imsg chats --limit 1
# lub
imsg send <handle> "test"

Kontrola dostępu i routing

channels.imessage.dmPolicy steruje wiadomościami prywatnymi:
  • pairing (domyślnie)
  • allowlist
  • open (wymaga, aby allowFrom zawierało "*")
  • disabled
Pole allowlisty: channels.imessage.allowFrom.Wpisami allowlisty mogą być identyfikatory lub cele czatu (chat_id:*, chat_guid:*, chat_identifier:*).

Powiązania konwersacji ACP

Starsze czaty iMessage mogą być także powiązane z sesjami ACP. Szybki przepływ pracy operatora:
  • Uruchom /acp spawn codex --bind here w wiadomości prywatnej lub dozwolonym czacie grupowym.
  • Kolejne wiadomości w tej samej konwersacji iMessage są kierowane do uruchomionej sesji ACP.
  • /new i /reset resetują tę samą powiązaną sesję ACP na miejscu.
  • /acp close zamyka sesję ACP i usuwa powiązanie.
Skonfigurowane trwałe powiązania są obsługiwane przez wpisy najwyższego poziomu bindings[] z type: "acp" i match.channel: "imessage". match.peer.id może używać:
  • znormalizowanego identyfikatora wiadomości prywatnej, takiego jak +15555550123 lub user@example.com
  • chat_id:<id> (zalecane dla stabilnych powiązań grupowych)
  • chat_guid:<guid>
  • chat_identifier:<identifier>
Przykład:
{
  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" },
    },
  ],
}
Zobacz Agenci ACP, aby poznać współdzielone zachowanie powiązań ACP.

Wzorce wdrożeń

Używaj dedykowanego Apple ID i użytkownika macOS, aby ruch bota był odseparowany od Twojego osobistego profilu Messages.Typowy przepływ:
  1. Utwórz/zaloguj dedykowanego użytkownika macOS.
  2. Zaloguj się do Messages przy użyciu Apple ID bota w ramach tego użytkownika.
  3. Zainstaluj imsg dla tego użytkownika.
  4. Utwórz opakowanie SSH, aby OpenClaw mógł uruchamiać imsg w kontekście tego użytkownika.
  5. Skieruj channels.imessage.accounts.<id>.cliPath i .dbPath na profil tego użytkownika.
Pierwsze uruchomienie może wymagać zatwierdzeń w GUI (Automation + Full Disk Access) w sesji tego użytkownika bota.
Typowa topologia:
  • gateway działa na Linuksie/VM
  • iMessage + imsg działa na Macu w Twoim tailnecie
  • opakowanie cliPath używa SSH do uruchamiania imsg
  • remoteHost umożliwia pobieranie załączników przez SCP
Przykład:
{
  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 bash
exec ssh -T bot@mac-mini.tailnet-1234.ts.net imsg "$@"
Używaj kluczy SSH, aby zarówno SSH, jak i SCP działały bez interakcji. Najpierw upewnij się, że klucz hosta jest zaufany (na przykład ssh bot@mac-mini.tailnet-1234.ts.net), aby uzupełnić known_hosts.
iMessage obsługuje konfigurację per konto w channels.imessage.accounts.Każde konto może nadpisywać pola takie jak cliPath, dbPath, allowFrom, groupPolicy, mediaMaxMb, ustawienia historii i allowlisty katalogów głównych załączników.

Multimedia, dzielenie na części i cele dostarczania

  • przyjmowanie załączników przychodzących jest opcjonalne: channels.imessage.includeAttachments
  • ścieżki zdalnych załączników mogą być pobierane przez SCP, gdy ustawiono remoteHost
  • ścieżki załączników muszą pasować do dozwolonych katalogów głównych:
    • channels.imessage.attachmentRoots (lokalne)
    • channels.imessage.remoteAttachmentRoots (zdalny tryb SCP)
    • domyślny wzorzec katalogu głównego: /Users/*/Library/Messages/Attachments
  • SCP używa ścisłego sprawdzania klucza hosta (StrictHostKeyChecking=yes)
  • rozmiar multimediów wychodzących używa channels.imessage.mediaMaxMb (domyślnie 16 MB)
  • limit długości fragmentu tekstu: channels.imessage.textChunkLimit (domyślnie 4000)
  • tryb dzielenia na części: channels.imessage.chunkMode
    • length (domyślnie)
    • newline (dzielenie najpierw według akapitów)
Preferowane jawne cele:
  • chat_id:123 (zalecane dla stabilnego routingu)
  • chat_guid:...
  • chat_identifier:...
Obsługiwane są także cele będące identyfikatorami:
  • imessage:+1555...
  • sms:+1555...
  • user@example.com
imsg chats --limit 20

Zapisy konfiguracji

iMessage domyślnie pozwala na zapisy konfiguracji inicjowane przez kanał (dla /config set|unset, gdy commands.config: true). Wyłącz:
{
  channels: {
    imessage: {
      configWrites: false,
    },
  },
}

Rozwiązywanie problemów

Zweryfikuj plik wykonywalny i obsługę RPC:
imsg rpc --help
openclaw channels status --probe
Jeśli test zgłasza brak obsługi RPC, zaktualizuj imsg.
Sprawdź:
  • channels.imessage.dmPolicy
  • channels.imessage.allowFrom
  • zatwierdzenia parowania (openclaw pairing list imessage)
Sprawdź:
  • channels.imessage.groupPolicy
  • channels.imessage.groupAllowFrom
  • zachowanie allowlisty channels.imessage.groups
  • konfigurację wzorców wzmianek (agents.list[].groupChat.mentionPatterns)
Sprawdź:
  • channels.imessage.remoteHost
  • channels.imessage.remoteAttachmentRoots
  • uwierzytelnianie kluczem SSH/SCP z hosta gateway
  • czy klucz hosta istnieje w ~/.ssh/known_hosts na hoście gateway
  • możliwość odczytu zdalnej ścieżki na Macu, na którym działa Messages
Uruchom ponownie w interaktywnym terminalu GUI w tym samym kontekście użytkownika/sesji i zatwierdź monity:
imsg chats --limit 1
imsg send <handle> "test"
Potwierdź, że Full Disk Access i Automation są przyznane dla kontekstu procesu uruchamiającego OpenClaw/imsg.

Wskaźniki do dokumentacji konfiguracji

Powiązane