Mainstream messaging
Google Chat
Google Chat berjalan sebagai plugin resmi @openclaw/googlechat: DM dan ruang melalui webhook Google Chat API (hanya endpoint HTTP, tanpa Pub/Sub).
Instalasi
openclaw plugins install @openclaw/googlechatCheckout lokal (saat menjalankan dari repo git):
openclaw plugins install ./path/to/local/googlechat-pluginPenyiapan cepat (pemula)
- Buat proyek Google Cloud dan aktifkan Google Chat API.
- Buka: Kredensial Google Chat API
- Aktifkan API jika belum diaktifkan.
- Buat Service Account:
- Tekan Create Credentials > Service Account.
- Beri nama sesuai keinginan (misalnya,
openclaw-chat). - Biarkan izin dan prinsipal kosong (Continue, lalu Done).
- Buat dan unduh kunci JSON:
- Klik akun layanan baru > tab Keys > Add Key > Create new key > JSON > Create.
- Simpan file JSON yang diunduh di host Gateway Anda (misalnya,
~/.openclaw/googlechat-service-account.json). - Buat aplikasi Google Chat di Konfigurasi Chat Google Cloud Console:
- Isi Application info (nama aplikasi, URL avatar, deskripsi).
- Aktifkan Interactive features.
- Di bagian Functionality, centang Join spaces and group conversations.
- Di bagian Connection settings, pilih HTTP endpoint URL.
- Di bagian Triggers, pilih Use a common HTTP endpoint URL for all triggers dan atur ke URL Gateway publik Anda yang diikuti oleh
/googlechat(lihat URL publik). - Di bagian Visibility, centang Make this Chat app available to specific people and groups in
<Your Domain>dan masukkan alamat email Anda. - Klik Save.
- Aktifkan status aplikasi: muat ulang halaman, temukan App status, atur ke Live - available to users, lalu Save lagi.
- Konfigurasikan OpenClaw dengan akun layanan dan audiens webhook (harus sesuai dengan konfigurasi aplikasi Chat):
- Variabel lingkungan:
GOOGLE_CHAT_SERVICE_ACCOUNT_FILE=/path/to/service-account.json(hanya akun default), atau - Konfigurasi: lihat Sorotan konfigurasi.
openclaw channels add --channel googlechatjuga menerima--audience-type,--audience,--webhook-path, dan--webhook-url.
- Variabel lingkungan:
- Mulai Gateway. Google Chat akan mengirim POST ke jalur webhook Anda (default
/googlechat).
Tambahkan ke Google Chat
Setelah Gateway berjalan dan email Anda ada dalam daftar visibilitas:
- Buka Google Chat.
- Klik ikon + (tambah) di sebelah Direct Messages.
- Cari App name yang Anda konfigurasikan di Google Cloud Console.
- Bot tidak muncul dalam daftar penelusuran Marketplace karena merupakan aplikasi privat; cari berdasarkan namanya.
- Pilih bot, klik Add atau Chat, lalu kirim pesan.
URL publik (Khusus webhook)
Webhook Google Chat memerlukan endpoint HTTPS publik. Demi keamanan, ekspos hanya jalur /googlechat ke internet dan pertahankan dasbor OpenClaw serta endpoint lainnya tetap privat.
Opsi A: Tailscale Funnel (Direkomendasikan)
Gunakan Tailscale Serve untuk dasbor privat dan Funnel untuk jalur webhook publik.
-
Periksa alamat yang menjadi tujuan pengikatan Gateway Anda:
bash ss -tlnp | grep 18789Catat IP-nya (misalnya,
127.0.0.1,0.0.0.0, atau alamat Tailscale100.x.x.x). -
Ekspos dasbor hanya ke tailnet (port 8443):
bash # Jika terikat ke localhost (127.0.0.1 atau 0.0.0.0):tailscale serve --bg --https 8443 http://127.0.0.1:18789 # Jika hanya terikat ke IP Tailscale:tailscale serve --bg --https 8443 http://100.x.x.x:18789 -
Ekspos hanya jalur webhook secara publik:
bash # Jika terikat ke localhost (127.0.0.1 atau 0.0.0.0):tailscale funnel --bg --set-path /googlechat http://127.0.0.1:18789/googlechat # Jika hanya terikat ke IP Tailscale:tailscale funnel --bg --set-path /googlechat http://100.x.x.x:18789/googlechat -
Jika diminta, kunjungi URL otorisasi yang ditampilkan dalam output untuk mengaktifkan Funnel bagi Node ini.
-
Verifikasi:
bash tailscale serve statustailscale funnel status
URL webhook publik Anda adalah https://<node-name>.<tailnet>.ts.net/googlechat; dasbor tetap hanya dapat diakses melalui tailnet di https://<node-name>.<tailnet>.ts.net:8443/. Gunakan URL publik (tanpa :8443) dalam konfigurasi aplikasi Google Chat.
Catatan: Konfigurasi ini tetap berlaku setelah mulai ulang. Hapus nanti dengan
tailscale funnel resetdantailscale serve reset.
Opsi B: Proksi terbalik (Caddy)
Proksikan hanya jalur webhook:
your-domain.com { reverse_proxy /googlechat* localhost:18789}Permintaan ke your-domain.com/ diabaikan atau menghasilkan 404, sedangkan your-domain.com/googlechat dirutekan ke OpenClaw.
Opsi C: Cloudflare Tunnel
Konfigurasikan aturan ingress tunnel agar hanya merutekan jalur webhook:
- Path:
/googlechat->http://localhost:18789/googlechat - Default rule: HTTP 404 (Not Found)
Cara kerjanya
- Google Chat mengirim POST berisi JSON ke jalur webhook Gateway (hanya POST, jenis konten JSON wajib, dibatasi lajunya per IP).
- OpenClaw mengautentikasi setiap permintaan sebelum meneruskannya:
- Peristiwa aplikasi Chat membawa
Authorization: Bearer <token>; token diverifikasi sebelum seluruh isi permintaan diuraikan. - Peristiwa Add-on Google Workspace membawa token dalam isi permintaan (
authorizationEventObject.systemIdToken) dan dibaca dengan batas praautentikasi yang lebih ketat (16 KB, 3 dtk) sebelum diverifikasi.
- Peristiwa aplikasi Chat membawa
- Token diperiksa terhadap
audienceType+audience:audienceType: "app-url"→ audiens adalah URL webhook HTTPS Anda.audienceType: "project-number"→ audiens adalah nomor proyek Cloud.- Token Add-on dalam
app-urljuga mewajibkanappPrincipaldiatur ke ID klien OAuth 2.0 numerik aplikasi (21 digit, bukan email); jika tidak, verifikasi gagal dengan peringatan yang dicatat.
- Pesan dirutekan berdasarkan ruang:
- Ruang mendapatkan sesi per ruang
agent:<agentId>:googlechat:group:<spaceId>; balasan dikirim ke utas pesan. - Secara default, DM digabungkan ke sesi utama agen; atur
session.dmScopeuntuk sesi DM per rekan (lihat Sesi).
- Ruang mendapatkan sesi per ruang
- Akses DM menggunakan pemasangan secara default. Pengirim yang tidak dikenal menerima kode pemasangan; setujui dengan:
openclaw pairing approve googlechat <code>
- Secara default, ruang grup memerlukan penyebutan @. Penyebutan dideteksi dari anotasi
USER_MENTIONChat yang menargetkan aplikasi; aturbotUser(misalnya,users/1234567890) jika deteksi memerlukan nama sumber daya pengguna aplikasi. - Saat persetujuan eksekusi atau Plugin dimulai dari Google Chat dan pemberi persetujuan
users/<id>yang stabil dikonfigurasikan, OpenClaw memposting kartu persetujuan native (cardsV2) di ruang atau utas asal. Tombol kartu membawa token callback buram; perintah manual/approve <id> <decision>hanya muncul jika pengiriman native tidak tersedia.
Ketahanan pesan masuk
Setelah autentikasi permintaan, OpenClaw menghapus objek otorisasi Add-on dari penyimpanan dan memasukkan peristiwa MESSAGE Google Chat secara persisten ke antrean sebelum mengembalikan 200. Kegagalan persistensi mengembalikan 503, sehingga Google Chat dapat mencoba lagi alih-alih mengakui peristiwa yang mungkin hilang.
Pesan yang tertunda atau dapat dicoba ulang tetap bertahan setelah Gateway dimulai ulang, tetap diserialkan per ruang, dan menggunakan nama sumber daya pesan Google Chat untuk mencegah entri antrean duplikat selama catatan penyelesaian yang aktif atau dipertahankan masih ada. Tindakan nonpesan mempertahankan jalur webhook terpisah yang ada dan tidak mendapatkan jaminan antrean persisten ini. Pengiriman tetap bersifat setidaknya satu kali melintasi batas antrean-ke-agen, sehingga crash selama serah terima dapat memutar ulang satu giliran.
Target
Gunakan pengidentifikasi berikut untuk pengiriman dan daftar izin:
- Pesan langsung:
users/<userId>(direkomendasikan). - Ruang:
spaces/<spaceId>. - Email mentah
name@example.comdapat berubah dan hanya digunakan untuk pencocokan daftar izin saatchannels.googlechat.dangerouslyAllowNameMatching: true. - Tidak digunakan lagi:
users/<email>diperlakukan sebagai ID pengguna, bukan entri daftar izin email. - Prefiks
googlechat:,google-chat:, dangchat:diterima dan dihapus.
Sorotan konfigurasi
{ channels: { googlechat: { enabled: true, serviceAccountFile: "/path/to/service-account.json", // atau serviceAccountRef: { source: "file", provider: "filemain", id: "/channels/googlechat/serviceAccount" } audienceType: "app-url", audience: "https://gateway.example.com/googlechat", appPrincipal: "123456789012345678901", // hanya verifikasi add-on; ID klien OAuth numerik webhookPath: "/googlechat", botUser: "users/1234567890", // opsional; membantu deteksi penyebutan allowBots: false, dm: { policy: "pairing", allowFrom: ["users/1234567890"], }, groupPolicy: "allowlist", groups: { "spaces/AAAA": { enabled: true, requireMention: true, users: ["users/1234567890"], systemPrompt: "Hanya jawaban singkat.", }, }, typingIndicator: "message", mediaMaxMb: 20, }, },}Catatan:
- Kredensial akun layanan:
serviceAccountFile(jalur),serviceAccount(string atau objek JSON sebaris), atauserviceAccountRef(SecretRef variabel lingkungan/file). Variabel lingkunganGOOGLE_CHAT_SERVICE_ACCOUNT(JSON sebaris) danGOOGLE_CHAT_SERVICE_ACCOUNT_FILE(jalur) hanya berlaku untuk akun default. Penyiapan multiakun menggunakanchannels.googlechat.accounts.<id>dengan kunci yang sama, termasukserviceAccountRefper akun. - Jalur webhook default adalah
/googlechatsaatwebhookPathtidak diatur;webhookUrldapat menyediakan jalur sebagai gantinya. - Kunci grup harus berupa ID ruang yang stabil (
spaces/<spaceId>). Kunci nama tampilan tidak digunakan lagi dan dicatat sebagaimana mestinya. dangerouslyAllowNameMatchingmengaktifkan kembali pencocokan prinsipal email yang dapat berubah untuk daftar izin (mode kompatibilitas darurat); doctor memperingatkan tentang entri email.- Tindakan reaksi Google Chat tidak diekspos. Plugin menggunakan autentikasi akun layanan, sedangkan endpoint reaksi Google Chat memerlukan autentikasi pengguna. Konfigurasi
actions.reactionsyang ada diterima untuk kompatibilitas, tetapi tidak berpengaruh. - Kartu persetujuan native menggunakan klik tombol
cardsV2Google Chat, bukan peristiwa reaksi. Pemberi persetujuan berasal dariallowFromataudefaultTodan harus berupa nilaiusers/<id>numerik yang stabil. - Tindakan pesan hanya mengekspos
sendteks. Pengunggahan lampiran Google Chat memerlukan autentikasi pengguna, sedangkan Plugin ini menggunakan autentikasi akun layanan, sehingga pengunggahan file keluar tidak diekspos. typingIndicator:message(default) memposting placeholder_<Bot> is typing..._dan mengeditnya menjadi balasan pertama;nonemenonaktifkannya;reactionmemerlukan OAuth pengguna dan saat ini kembali menggunakanmessagedengan kesalahan yang dicatat saat menggunakan autentikasi akun layanan.- Lampiran masuk (lampiran pertama per pesan) diunduh melalui Chat API ke pipeline media, dengan batas
mediaMaxMb(default 20). - Pesan yang dibuat bot diabaikan secara default. Dengan
allowBots: true, pesan bot yang diterima menggunakan perlindungan perulangan bot bersama: konfigurasikanchannels.defaults.botLoopProtection, lalu timpa denganchannels.googlechat.botLoopProtectionatauchannels.googlechat.groups.<space>.botLoopProtection.
Detail referensi rahasia: Manajemen Rahasia.
Pemecahan masalah
405 Method Not Allowed
Jika Google Cloud Logs Explorer menampilkan kesalahan seperti:
status code: 405, reason phrase: HTTP error response: HTTP/1.1 405 Method Not AllowedPenangan webhook tidak terdaftar. Penyebab umum:
-
Saluran tidak dikonfigurasi: bagian
channels.googlechattidak ada. Verifikasi dengan:bash openclaw config get channels.googlechatJika perintah tersebut mengembalikan "Config path not found", tambahkan konfigurasi (lihat Sorotan konfigurasi).
-
Plugin tidak diaktifkan: periksa status plugin:
bash openclaw plugins list | grep googlechatJika menampilkan "disabled", tambahkan
plugins.entries.googlechat.enabled: trueke konfigurasi Anda. -
Gateway belum dimulai ulang setelah perubahan konfigurasi:
bash openclaw gateway restart
Verifikasi bahwa saluran sedang berjalan:
openclaw channels status# Seharusnya menampilkan: Google Chat default: enabled, configured, ...Masalah lainnya
openclaw channels status --probemenampilkan kesalahan autentikasi dan konfigurasi audiens yang tidak ada (audiencedanaudienceTypekeduanya wajib).- Jika tidak ada pesan yang masuk, konfirmasikan URL webhook dan konfigurasi pemicu aplikasi Chat.
- Jika pembatasan penyebutan memblokir balasan, atur
botUserke nama resource pengguna aplikasi dan periksarequireMention. openclaw logs --followsaat mengirim pesan uji menunjukkan apakah permintaan mencapai Gateway.
Terkait
- Ikhtisar Saluran — semua saluran yang didukung
- Perutean Saluran — perutean sesi untuk pesan
- Konfigurasi Gateway
- Grup — perilaku obrolan grup dan pembatasan penyebutan
- Pemasangan — autentikasi DM dan alur pemasangan
- Keamanan — model akses dan penguatan