Mainstream messaging
Google Chat
Google Chat は公式の @openclaw/googlechat Plugin として動作します。Google Chat API の Webhook を介して DM とスペースに対応します(HTTP エンドポイントのみ、Pub/Sub は使用しません)。
インストール
openclaw plugins install @openclaw/googlechatローカルチェックアウト(git リポジトリから実行する場合):
openclaw plugins install ./path/to/local/googlechat-pluginクイックセットアップ(初心者向け)
- Google Cloud プロジェクトを作成し、Google Chat API を有効にします。
- 移動先: Google Chat API の認証情報
- API がまだ有効になっていない場合は、有効にします。
- サービス アカウントを作成します。
- Create Credentials > Service Account を押します。
- 任意の名前を付けます(例:
openclaw-chat)。 - 権限とプリンシパルは空欄のままにします(Continue、続いて Done)。
- JSON キーを作成してダウンロードします。
- 新しいサービス アカウントをクリックし、Keys タブ > Add Key > Create new key > JSON > Create の順に選択します。
- ダウンロードした JSON ファイルを Gateway ホストに保存します(例:
~/.openclaw/googlechat-service-account.json)。 - Google Cloud Console の Chat Configurationで Google Chat アプリを作成します。
- Application info(アプリ名、アバター URL、説明)を入力します。
- Interactive features を有効にします。
- Functionality で Join spaces and group conversations をオンにします。
- Connection settings で HTTP endpoint URL を選択します。
- Triggers で Use a common HTTP endpoint URL for all triggers を選択し、公開 Gateway URL の末尾に
/googlechatを付けた値を設定します(公開 URLを参照)。 - Visibility で Make this Chat app available to specific people and groups in
<Your Domain>をオンにし、自分のメールアドレスを入力します。 - Save をクリックします。
- アプリのステータスを有効にします。ページを更新して App status を見つけ、Live - available to users に設定して、もう一度 Save をクリックします。
- サービス アカウントと Webhook のオーディエンスを使用して OpenClaw を設定します(Chat アプリの設定と一致させる必要があります)。
- 環境変数:
GOOGLE_CHAT_SERVICE_ACCOUNT_FILE=/path/to/service-account.json(デフォルトアカウントのみ)、または - 設定: 設定の要点を参照してください。
openclaw channels add --channel googlechatでは、--audience-type、--audience、--webhook-path、--webhook-urlも指定できます。
- 環境変数:
- Gateway を起動します。Google Chat は Webhook パス(デフォルトは
/googlechat)へ POST します。
Google Chat への追加
Gateway が実行中で、自分のメールアドレスが表示対象リストに登録されている場合:
- Google Chatを開きます。
- Direct Messages の横にある +(プラス)アイコンをクリックします。
- Google Cloud Console で設定したアプリ名を検索します。
- 非公開アプリのため、ボットは Marketplace の閲覧リストには表示されません。名前で検索してください。
- ボットを選択し、Add または Chat をクリックして、メッセージを送信します。
公開 URL(Webhook のみ)
Google Chat の Webhook には、公開 HTTPS エンドポイントが必要です。セキュリティのため、インターネットには /googlechat パスのみを公開し、OpenClaw ダッシュボードとその他のエンドポイントは非公開のままにしてください。
オプション A: Tailscale Funnel(推奨)
非公開ダッシュボードには Tailscale Serve、公開 Webhook パスには Funnel を使用します。
-
Gateway がバインドされているアドレスを確認します。
bash ss -tlnp | grep 18789IP を控えます(例:
127.0.0.1、0.0.0.0、または Tailscale の100.x.x.xアドレス)。 -
ダッシュボードを tailnet のみに公開します(ポート 8443)。
bash # localhost(127.0.0.1 または 0.0.0.0)にバインドされている場合:tailscale serve --bg --https 8443 http://127.0.0.1:18789 # Tailscale IP のみにバインドされている場合:tailscale serve --bg --https 8443 http://100.x.x.x:18789 -
Webhook パスのみを公開します。
bash # localhost(127.0.0.1 または 0.0.0.0)にバインドされている場合:tailscale funnel --bg --set-path /googlechat http://127.0.0.1:18789/googlechat # Tailscale IP のみにバインドされている場合:tailscale funnel --bg --set-path /googlechat http://100.x.x.x:18789/googlechat -
プロンプトが表示された場合は、出力に表示された認可 URL にアクセスし、この Node で Funnel を有効にします。
-
確認します。
bash tailscale serve statustailscale funnel status
公開 Webhook URL は https://<node-name>.<tailnet>.ts.net/googlechat です。ダッシュボードは https://<node-name>.<tailnet>.ts.net:8443/ で tailnet のみに公開されたままです。Google Chat アプリの設定には、公開 URL(:8443 なし)を使用します。
注: この設定は再起動後も保持されます。後で削除するには、
tailscale funnel resetとtailscale serve resetを実行します。
オプション B: リバースプロキシ(Caddy)
Webhook パスのみをプロキシします。
your-domain.com { reverse_proxy /googlechat* localhost:18789}your-domain.com/ へのリクエストは無視されるか 404 になり、your-domain.com/googlechat は OpenClaw にルーティングされます。
オプション C: Cloudflare Tunnel
Webhook パスのみをルーティングするように、トンネルの受信ルールを設定します。
- Path:
/googlechat->http://localhost:18789/googlechat - Default rule: HTTP 404(見つかりません)
動作の仕組み
- Google Chat は Gateway の Webhook パスへ JSON を POST します(POST のみ、JSON コンテンツタイプ必須、IP ごとのレート制限あり)。
- OpenClaw はディスパッチ前にすべてのリクエストを認証します。
- Chat アプリのイベントには
Authorization: Bearer <token>が含まれます。完全な本文を解析する前にトークンが検証されます。 - Google Workspace アドオンのイベントでは、本文の
authorizationEventObject.systemIdTokenにトークンが含まれます。検証前に、より厳しい事前認証制限(16 KB、3 秒)の下で読み取られます。
- Chat アプリのイベントには
- トークンは
audienceType+audienceと照合されます。audienceType: "app-url"→ オーディエンスは HTTPS Webhook URL です。audienceType: "project-number"→ オーディエンスは Cloud プロジェクト番号です。app-urlを使用するアドオントークンでは、さらにappPrincipalをアプリの数値 OAuth 2.0 クライアント ID(21 桁、メールアドレスではない)に設定する必要があります。設定されていない場合は、警告がログに記録され、検証に失敗します。
- メッセージはスペースごとにルーティングされます。
- スペースでは、スペースごとのセッション
agent:<agentId>:googlechat:group:<spaceId>が使用され、返信はメッセージスレッドに送信されます。 - デフォルトでは、DM はエージェントのメインセッションにまとめられます。相手ごとの DM セッションを使用するには、
session.dmScopeを設定します(セッションを参照)。
- スペースでは、スペースごとのセッション
- DM アクセスはデフォルトでペアリング方式です。不明な送信者にはペアリングコードが送られます。次のコマンドで承認します。
openclaw pairing approve googlechat <code>
- グループスペースでは、デフォルトで @メンションが必要です。メンションは、アプリを対象とする Chat の
USER_MENTIONアノテーションから検出されます。検出にアプリのユーザーリソース名が必要な場合は、botUser(例:users/1234567890)を設定します。 - Google Chat から exec または Plugin の承認が開始され、安定した
users/<id>承認者が設定されている場合、OpenClaw は元のスペースまたはスレッドにネイティブ承認カード(cardsV2)を投稿します。カードのボタンには不透明なコールバックトークンが含まれます。手動の/approve <id> <decision>プロンプトは、ネイティブ配信を利用できない場合にのみ表示されます。
ターゲット
配信と許可リストには、次の識別子を使用します。
- ダイレクトメッセージ:
users/<userId>(推奨)。 - スペース:
spaces/<spaceId>。 - 生のメールアドレス
name@example.comは変更可能であり、channels.googlechat.dangerouslyAllowNameMatching: trueの場合に限り、許可リストの照合に使用されます。 - 非推奨:
users/<email>はメールアドレスの許可リストエントリではなく、ユーザー ID として扱われます。 - 接頭辞
googlechat:、google-chat:、gchat:は受け入れられ、取り除かれます。
設定の要点
{ channels: { googlechat: { enabled: true, serviceAccountFile: "/path/to/service-account.json", // または serviceAccountRef: { source: "file", provider: "filemain", id: "/channels/googlechat/serviceAccount" } audienceType: "app-url", audience: "https://gateway.example.com/googlechat", appPrincipal: "123456789012345678901", // アドオン検証専用。数値の OAuth クライアント ID webhookPath: "/googlechat", botUser: "users/1234567890", // 任意。メンション検出に役立つ allowBots: false, dm: { policy: "pairing", allowFrom: ["users/1234567890"], }, groupPolicy: "allowlist", groups: { "spaces/AAAA": { enabled: true, requireMention: true, users: ["users/1234567890"], systemPrompt: "短い回答のみ。", }, }, typingIndicator: "message", mediaMaxMb: 20, }, },}注:
- サービス アカウントの認証情報:
serviceAccountFile(パス)、serviceAccount(インライン JSON 文字列またはオブジェクト)、またはserviceAccountRef(環境変数/ファイルの SecretRef)を使用します。環境変数GOOGLE_CHAT_SERVICE_ACCOUNT(インライン JSON)とGOOGLE_CHAT_SERVICE_ACCOUNT_FILE(パス)は、デフォルトアカウントにのみ適用されます。マルチアカウント構成では、アカウントごとのserviceAccountRefを含む同じキーをchannels.googlechat.accounts.<id>で使用します。 webhookPathが未設定の場合、デフォルトの Webhook パスは/googlechatです。代わりにwebhookUrlでパスを指定することもできます。- グループキーには、安定したスペース ID(
spaces/<spaceId>)を使用する必要があります。表示名のキーは非推奨であり、その旨がログに記録されます。 dangerouslyAllowNameMatchingは、許可リストで変更可能なメールプリンシパルの照合を再び有効にします(緊急時用の互換モード)。doctor はメールアドレスのエントリについて警告します。- Google Chat のリアクションアクションは公開されていません。この Plugin はサービス アカウント認証を使用しますが、Google Chat のリアクションエンドポイントにはユーザー認証が必要です。既存の
actions.reactions設定は互換性のために受け入れられますが、効果はありません。 - ネイティブ承認カードでは、リアクションイベントではなく、Google Chat の
cardsV2ボタンクリックを使用します。承認者はdm.allowFromまたはdefaultToから取得され、安定した数値のusers/<id>値である必要があります。 - メッセージアクションでは、テキストの
sendのみを公開します。Google Chat への添付ファイルのアップロードにはユーザー認証が必要ですが、この Plugin はサービス アカウント認証を使用するため、送信ファイルのアップロードは公開されていません。 typingIndicator:message(デフォルト)は_<Bot> is typing..._プレースホルダーを投稿し、最初の返信内容に編集します。noneは無効にします。reactionにはユーザー OAuth が必要であり、現在はサービス アカウント認証下で、エラーをログに記録してmessageにフォールバックします。- 受信した添付ファイル(メッセージごとに最初の添付ファイル)は、Chat API を介してメディアパイプラインにダウンロードされ、
mediaMaxMb(デフォルト 20)で上限が設定されます。 - ボットが作成したメッセージはデフォルトで無視されます。
allowBots: trueの場合、受け入れられたボットメッセージには共通のボットループ保護が適用されます。channels.defaults.botLoopProtectionを設定してから、channels.googlechat.botLoopProtectionまたはchannels.googlechat.groups.<space>.botLoopProtectionで上書きします。
シークレット参照の詳細: シークレット管理。
トラブルシューティング
405 メソッドが許可されていません
Google Cloud Logs Explorer に次のようなエラーが表示される場合:
status code: 405, reason phrase: HTTP error response: HTTP/1.1 405 Method Not AllowedWebhook ハンドラーが登録されていません。一般的な原因は次のとおりです。
-
チャンネルが設定されていない:
channels.googlechatセクションがありません。次のコマンドで確認します。bash openclaw config get channels.googlechat「Config path not found」が返された場合は、設定を追加します(設定の要点を参照)。
-
Plugin が有効になっていない: Plugin の状態を確認します。
bash openclaw plugins list | grep googlechat「disabled」と表示される場合は、設定に
plugins.entries.googlechat.enabled: trueを追加します。 -
設定変更後に Gateway が再起動されていない:
bash openclaw gateway restart
チャンネルが実行中であることを確認します。
openclaw channels status# 次のように表示されるはずです: Google Chat default: enabled, configured, ...その他の問題
openclaw channels status --probeは、認証エラーと不足しているオーディエンス設定を表示します(audienceとaudienceTypeは両方とも必須です)。- メッセージが届かない場合は、Chat アプリの Webhook URL とトリガー設定を確認します。
- メンション制限によって返信がブロックされる場合は、
botUserをアプリのユーザーリソース名に設定し、requireMentionを確認します。 - テストメッセージの送信中に
openclaw logs --followを実行すると、リクエストが Gateway に到達しているかどうかを確認できます。
関連項目
- チャンネルの概要 — サポートされているすべてのチャンネル
- チャンネルルーティング — メッセージのセッションルーティング
- Gateway の設定
- グループ — グループチャットの動作とメンションによる制御
- ペアリング — DM の認証とペアリングフロー
- セキュリティ — アクセスモデルと堅牢化