Google Chat アプリを Webhook として作成する

このページでは、非同期メッセージを 外部トリガーを使用した Chat スペース。たとえば モニタリング アプリケーションを構成して、オンコール担当者に サーバーがダウンしたときにチャットする。同期メッセージを送信するには 使用方法については、 メッセージを送信する

このタイプのアーキテクチャでは ユーザーが Webhook や接続された外部 IP アドレス 通信は一方向であるためです。Webhook は会話型ではありません。 ユーザーやチャット メッセージに Chat 用アプリのインタラクション イベント。 メッセージに返信するには、 構築する 使用します。

Webhook は技術的に Webhook は、標準 HTTP リクエスト - このページでは、これを Chat 用アプリと 簡素化します。各 Webhook は、 あります。着信 Webhook はダイレクト メッセージ内で動作しますが、 すべてのユーザーが 有効な Chat アプリ。 Webhook を Google Workspace Marketplace に公開することはできません。

次の図は、Kubernetes に接続された Webhook のアーキテクチャを示しています。 チャット:

着信 Webhook が Chat に非同期メッセージを送信するためのアーキテクチャ。

上の図で、Chat 用アプリには次のものが含まれます。 情報のフロー:

  1. Chat アプリのロジックは、Google Chat のメッセージ アプリで サードパーティのサービス(プロジェクト管理システム、 チケット発行ツールを使用します
  2. Chat 用アプリのロジックは、クラウドまたは Webhook URL を使用してメッセージを送信できる 割り当てることができます。
  3. ユーザーは次の場所で Chat アプリのメッセージを受信できます: その特定の Chat スペースにはアクセスできないものの、 Chat アプリ。

前提条件

Python

  • 企業または大企業 以下へのアクセス権を持つ Google Workspace アカウント Google Chat。 Google Workspace の組織では、ユーザーが Google Workspace の 着信 Webhook を追加して使用する
  • Python 3.6 以降
  • pip パッケージ管理ツール
  • httplib2 ライブラリ。ライブラリをインストールするには、コマンドライン インターフェースで次のコマンドを実行します。

    pip install httplib2
    
  • Google Chat スペース。Google Chat API を使用して作成する方法については、以下をご覧ください。 スペースを作成します。Chat で作成するには、 詳しくは、 ヘルプセンターの記事をご覧ください。

Node.js

Java

Apps Script

Webhook を作成する

Webhook を作成するには、目的の Chat スペースに Webhook を登録します。 メッセージを受信し、メッセージを送信するスクリプトを作成します。

着信 Webhook を登録する

  1. ブラウザで Google Chat。 Chat モバイルアプリから Webhook を構成することはできません。
  2. Webhook を追加するスペースに移動します。
  3. スペースのタイトルの横にある その他アイコンを展開して、[アプリと統合をご覧ください。
  4. [Webhook を追加] をクリックします。

  5. [名前] フィールドに「Quickstart Webhook」と入力します。

  6. [アバターの URL] フィールドに、次のように入力します。 https://developers.google.com/chat/images/chat-product-icon.png

  7. [保存] をクリックします。

  8. Webhook URL をコピーするには、 [その他] をクリックし、 リンクをコピー

Webhook スクリプトを作成する

サンプルの Webhook スクリプトは、Webhook が構成されているスペースにメッセージを送信します。 POST リクエストを Webhook URL に送信して登録します。「 Chat API は Message

言語を選択すると、Webhook スクリプトの作成方法を確認できます。

Python

  1. 作業ディレクトリに、quickstart.py という名前のファイルを作成します。

  2. quickstart.py に次のコードを貼り付けます。

    python/webhook/quickstart.py
    from json import dumps
    from httplib2 import Http
    
    # Copy the webhook URL from the Chat space where the webhook is registered.
    # The values for SPACE_ID, KEY, and TOKEN are set by Chat, and are included
    # when you copy the webhook URL.
    
    def main():
        """Google Chat incoming webhook quickstart."""
        url = "https://chat.googleapis.com/v1/spaces/SPACE_ID/messages?key=KEY&token=TOKEN"
        app_message = {"text": "Hello from a Python script!"}
        message_headers = {"Content-Type": "application/json; charset=UTF-8"}
        http_obj = Http()
        response = http_obj.request(
            uri=url,
            method="POST",
            headers=message_headers,
            body=dumps(app_message),
        )
        print(response)
    
    
    if __name__ == "__main__":
        main()
  3. url 変数の値を、次の Webhook URL に置き換えます。 Webhook の登録時にコピーしたものを使用します。

Node.js

  1. 作業ディレクトリに、index.js という名前のファイルを作成します。

  2. index.js に次のコードを貼り付けます。

    node/webhook/index.js
    /**
     * Sends asynchronous message to Google Chat
     * @return {Object} response
     */
    async function webhook() {
      const url = "https://chat.googleapis.com/v1/spaces/SPACE_ID/messages"
      const res = await fetch(url, {
        method: "POST",
        headers: {"Content-Type": "application/json; charset=UTF-8"},
        body: JSON.stringify({text: "Hello from a Node script!"})
      });
      return await res.json();
    }
    
    webhook().then(res => console.log(res));
  3. url 変数の値を、次の Webhook URL に置き換えます。 Webhook の登録時にコピーしたものを使用します。

Java

  1. 作業ディレクトリに、pom.xml という名前のファイルを作成します。

  2. pom.xml に、次のコードをコピーして貼り付けます。

    java/webhook/pom.xml
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
    
      <groupId>com.google.chat.webhook</groupId>
      <artifactId>java-webhook-app</artifactId>
      <version>0.1.0</version>
    
      <name>java-webhook-app</name>
      <url>https://github.com/googleworkspace/google-chat-samples/tree/main/java/webhook</url>
    
      <properties>
        <maven.compiler.target>11</maven.compiler.target>
        <maven.compiler.source>11</maven.compiler.source>
      </properties>
    
      <dependencies>
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.9.1</version>
        </dependency>
      </dependencies>
    
      <build>
        <pluginManagement>
          <plugins>
            <plugin>
              <artifactId>maven-compiler-plugin</artifactId>
              <version>3.8.0</version>
            </plugin>
          </plugins>
        </pluginManagement>
      </build>
    </project>
  3. 作業ディレクトリで、次のディレクトリ構造を作成します。 src/main/java

  4. src/main/java ディレクトリに、App.java という名前のファイルを作成します。

  5. App.java に次のコードを貼り付けます。

    java/webhook/src/main/java/com/google/chat/webhook/App.java
    import com.google.gson.Gson;
    import java.net.http.HttpClient;
    import java.net.http.HttpRequest;
    import java.net.http.HttpResponse;
    import java.util.Map;
    import java.net.URI;
    
    public class App {
      private static final String URL = "https://chat.googleapis.com/v1/spaces/AAAAGCYeSRY/messages";
      private static final Gson gson = new Gson();
      private static final HttpClient client = HttpClient.newHttpClient();
    
      public static void main(String[] args) throws Exception {
        String message = gson.toJson(Map.of("text", "Hello from Java!"));
    
        HttpRequest request = HttpRequest.newBuilder(
            URI.create(URL))
            .header("accept", "application/json; charset=UTF-8")
            .POST(HttpRequest.BodyPublishers.ofString(message))
            .build();
    
        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
    
        System.out.println(response.body());
      }
    }
  6. URL 変数の値は、先ほど作成した Webhook URL に置き換えます。 Webhook を登録したときにコピーされた名前を使用します。

Apps Script

  1. ブラウザで Apps Script

  2. [新しいプロジェクト] をクリックします。

  3. 次のコードを貼り付けます。

    apps-script/webhook/webhook.gs
    function webhook() {
      const url = "https://chat.googleapis.com/v1/spaces/SPACE_ID/messages"
      const options = {
        "method": "post",
        "headers": {"Content-Type": "application/json; charset=UTF-8"},
        "payload": JSON.stringify({"text": "Hello from Apps Script!"})
      };
      const response = UrlFetchApp.fetch(url, options);
      console.log(response);
    }
  4. url 変数の値は、先ほど作成した Webhook URL に置き換えます。 Webhook を登録したときにコピーされた名前を使用します。

Webhook スクリプトを実行する

CLI でスクリプトを実行します。

Python

  python3 quickstart.py

Node.js

  node index.js

Java

  mvn compile exec:java -Dexec.mainClass=App

Apps Script

  • [実行] をクリックします。

コードを実行すると、Webhook はユーザーが操作しているスペースにメッセージを送信します。 登録しました。

メッセージ スレッドを開始または返信する

  1. 具体的にご記入ください spaces.messages.thread.threadKey メッセージリクエストの本文に指定します。Google Cloud コンソールから スレッドに返信する場合は、threadKey に次の値を使用します。

    • スレッドを開始する場合は、threadKey を任意の文字列に設定します。ただし、 スレッドに返信するには、この値をメモしておきます。

    • スレッドに返信する場合は、スレッドへの返信時に設定された threadKey を 開始されました。たとえば、スペースが 最初のメッセージに MY-THREAD が使用されました。MY-THREAD を設定します。

  2. 指定された threadKey が見つからない場合のスレッドの動作を定義します。

    • スレッドに返信したり、新しいスレッドを開始したりします。追加 messageReplyOption=REPLY_MESSAGE_FALLBACK_TO_NEW_THREAD パラメータを Webhook URL を入力します。この URL パラメータを渡すと、Chat が 指定した threadKey を使用して既存のスレッドを検索します。1 つ そのスレッドへの返信としてメッセージが投稿されます。いずれも そのスレッドに対応する新しいスレッドが threadKey

    • スレッドに返信するか、何もしません。追加 Webhook URL に messageReplyOption=REPLY_MESSAGE_OR_FAIL パラメータを追加します。 この URL パラメータを渡すと、Chat が 指定した threadKey を使用して既存のスレッドを検索します。1 つ そのスレッドへの返信としてメッセージが投稿されます。いずれも メールは送信されません。

    詳しくは、messageReplyOption をご覧ください。

次のコードサンプルは、メッセージ スレッドの開始または返信を行います。

Python

python/webhook/thread-reply.py
from json import dumps
from httplib2 import Http

# Copy the webhook URL from the Chat space where the webhook is registered.
# The values for SPACE_ID, KEY, and TOKEN are set by Chat, and are included
# when you copy the webhook URL.
#
# Then, append messageReplyOption=REPLY_MESSAGE_FALLBACK_TO_NEW_THREAD to the
# webhook URL.


def main():
    """Google Chat incoming webhook that starts or replies to a message thread."""
    url = "https://chat.googleapis.com/v1/spaces/SPACE_ID/messages?key=KEY&token=TOKEN&messageReplyOption=REPLY_MESSAGE_FALLBACK_TO_NEW_THREAD"
    app_message = {
        "text": "Hello from a Python script!",
        # To start a thread, set threadKey to an arbitratry string.
        # To reply to a thread, specify that thread's threadKey value.
        "thread": {"threadKey": "THREAD_KEY_VALUE"},
    }
    message_headers = {"Content-Type": "application/json; charset=UTF-8"}
    http_obj = Http()
    response = http_obj.request(
        uri=url,
        method="POST",
        headers=message_headers,
        body=dumps(app_message),
    )
    print(response)


if __name__ == "__main__":
    main()

Node.js

node/webhook/thread-reply.js
/**
 * Sends asynchronous message to Google Chat
 * @return {Object} response
 */
async function webhook() {
  const url = "https://chat.googleapis.com/v1/spaces/SPACE_ID/messages?key=KEY&token=TOKEN&messageReplyOption=REPLY_MESSAGE_FALLBACK_TO_NEW_THREAD"
  const res = await fetch(url, {
    method: "POST",
    headers: {"Content-Type": "application/json; charset=UTF-8"},
    body: JSON.stringify({
      text: "Hello from a Node script!",
      thread: {threadKey: "THREAD_KEY_VALUE"}
    })
  });
  return await res.json();
}

webhook().then(res => console.log(res));

Apps Script

apps-script/webhook/thread-reply.gs
function webhook() {
  const url = "https://chat.googleapis.com/v1/spaces/SPACE_ID/messages?key=KEY&token=TOKEN&messageReplyOption=REPLY_MESSAGE_FALLBACK_TO_NEW_THREAD"
  const options = {
    "method": "post",
    "headers": {"Content-Type": "application/json; charset=UTF-8"},
    "payload": JSON.stringify({
      "text": "Hello from Apps Script!",
      "thread": {"threadKey": "THREAD_KEY_VALUE"}
    })
  };
  const response = UrlFetchApp.fetch(url, options);
  console.log(response);
}