Mainstream messaging
Google Chat
Google Chat berjalan sebagai plugin resmi @openclaw/googlechat: pesan langsung dan ruang melalui Webhook Google Chat API (hanya titik akhir HTTP, tanpa Pub/Sub).
Instalasi
openclaw plugins install @openclaw/googlechatCheckout lokal (saat dijalankan dari repositori 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 berkas JSON yang diunduh pada hos 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 tetapkan ke URL Gateway publik Anda yang diikuti
/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, tetapkan ke Live - available to users, lalu klik Save lagi.
- Konfigurasikan OpenClaw dengan akun layanan dan audiens Webhook (harus cocok 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 samping 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 titik akhir HTTPS publik. Demi keamanan, paparkan hanya jalur /googlechat ke internet dan pertahankan dasbor OpenClaw serta titik akhir lainnya tetap privat.
Opsi A: Tailscale Funnel (Disarankan)
Gunakan Tailscale Serve untuk dasbor privat dan Funnel untuk jalur Webhook publik.
-
Periksa alamat yang digunakan Gateway untuk mendengarkan:
bash ss -tlnp | grep 18789Catat IP-nya (misalnya,
127.0.0.1,0.0.0.0, atau alamat Tailscale100.x.x.x). -
Paparkan 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 -
Paparkan 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 keluaran 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 tersimpan setelah dimulai 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 masuk tunnel agar hanya merutekan jalur Webhook:
- Path:
/googlechat->http://localhost:18789/googlechat - Default rule: HTTP 404 (Not Found)
Cara kerjanya
- Google Chat mengirim JSON melalui POST 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 diurai. - Peristiwa Add-on Google Workspace membawa token dalam isi permintaan (
authorizationEventObject.systemIdToken) dan dibaca dengan batas praautentikasi yang lebih ketat (16 KB, 3 detik) sebelum verifikasi.
- 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 dengan
app-urljuga mengharuskanappPrincipalditetapkan ke ID klien OAuth 2.0 numerik aplikasi (21 digit, bukan email); jika tidak, verifikasi gagal dan peringatan dicatat.
- Pesan dirutekan berdasarkan ruang:
- Ruang mendapatkan sesi per ruang
agent:<agentId>:googlechat:group:<spaceId>; balasan dikirim ke utas pesan. - Pesan langsung secara default digabungkan ke sesi utama agen; tetapkan
session.dmScopeuntuk sesi pesan langsung per rekan (lihat Sesi).
- Ruang mendapatkan sesi per ruang
- Akses pesan langsung menggunakan pemasangan secara default. Pengirim yang tidak dikenal menerima kode pemasangan; setujui dengan:
openclaw pairing approve googlechat <code>
- Ruang grup secara default memerlukan penyebutan @. Penyebutan dideteksi dari anotasi
USER_MENTIONChat yang ditujukan ke aplikasi; tetapkanbotUser(misalnya,users/1234567890) jika pendeteksian 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 panggilan balik buram; perintah manual/approve <id> <decision>hanya muncul saat pengiriman native tidak tersedia.
Tujuan
Gunakan pengenal berikut untuk pengiriman dan daftar yang diizinkan:
- Pesan langsung:
users/<userId>(disarankan). - Ruang:
spaces/<spaceId>. - Email mentah
name@example.comdapat berubah dan hanya digunakan untuk pencocokan daftar yang diizinkan saatchannels.googlechat.dangerouslyAllowNameMatching: true. - Tidak digunakan lagi:
users/<email>diperlakukan sebagai ID pengguna, bukan entri email dalam daftar yang diizinkan. - Awalan
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 pendeteksian 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/berkas). 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 ditetapkan;webhookUrldapat menyediakan jalur sebagai gantinya. - Kunci grup harus berupa ID ruang yang stabil (
spaces/<spaceId>). Kunci nama tampilan tidak digunakan lagi dan dicatat sebagai demikian. dangerouslyAllowNameMatchingmengaktifkan kembali pencocokan prinsipal email yang dapat berubah untuk daftar yang diizinkan (mode kompatibilitas darurat); doctor memperingatkan tentang entri email.- Tindakan reaksi Google Chat tidak diekspos. Plugin menggunakan autentikasi akun layanan, sedangkan titik akhir 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 daridm.allowFromataudefaultTodan harus berupa nilai numerikusers/<id>yang stabil. - Tindakan pesan hanya mengekspos
sendteks. Pengunggahan lampiran Google Chat memerlukan autentikasi pengguna, sedangkan Plugin ini menggunakan autentikasi akun layanan, sehingga pengunggahan berkas keluar tidak diekspos. typingIndicator:message(default) memposting placeholder_<Bot> sedang mengetik..._dan mengubahnya menjadi balasan pertama;nonemenonaktifkannya;reactionmemerlukan OAuth pengguna dan saat ini kembali kemessagedengan kesalahan yang dicatat ketika menggunakan autentikasi akun layanan.- Lampiran masuk (lampiran pertama per pesan) diunduh melalui Chat API ke alur 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: Pengelolaan Rahasia.
Pemecahan masalah
405 Metode Tidak Diizinkan
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 belum dikonfigurasikan: bagian
channels.googlechattidak ada. Verifikasi dengan:bash openclaw config get channels.googlechatJika 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 gerbang penyebutan memblokir balasan, tetapkan
botUserke nama sumber daya pengguna aplikasi dan periksarequireMention. - Jalankan
openclaw logs --followsaat mengirim pesan percobaan untuk melihat apakah permintaan mencapai Gateway.
Terkait
- Ikhtisar Kanal — semua kanal yang didukung
- Perutean Kanal — perutean sesi untuk pesan
- Konfigurasi Gateway
- Grup — perilaku obrolan grup dan pembatasan berdasarkan penyebutan
- Pemasangan — autentikasi DM dan alur pemasangan
- Keamanan — model akses dan penguatan keamanan