使用 Cloud Functions 建構 HTTP Google Chat 應用程式

本頁說明如何建立 HTTP Chat 應用程式。實作此架構的方法有幾種。您可以在 Google Cloud 中使用 Cloud Functions、Cloud Run 和 App Engine。在這個快速入門導覽課程中,您將編寫及部署 Chat 應用程式用來回應使用者訊息的 Cloud 函式

在這個架構中,您可以將 Chat 設定為使用 HTTP 與 Google Cloud 或內部部署伺服器整合,如下圖所示:

在地端部署伺服器中使用網路服務的 Chat 應用程式架構。

在上圖中,與 HTTP Chat 應用程式互動的使用者俱備下列資訊流程:

  1. 使用者透過即時訊息或 Chat 聊天室,將 Chat 訊息傳送至 Chat 應用程式。
  2. 系統會將 HTTP 要求傳送至網路伺服器,而該伺服器即為包含 Chat 應用程式邏輯的雲端或內部部署系統。
  3. 您可以選擇將 Chat 應用程式邏輯與 Google Workspace 服務 (例如日曆和試算表)、其他 Google 服務 (如 Google 地圖、YouTube 和 Vertex AI) 或其他網路服務整合 (例如專案管理系統或票證工具)。
  4. 網路伺服器將 HTTP 回應傳回 Chat 中的 Chat 應用程式服務。
  5. 系統會將回應傳送給使用者。
  6. 或者,Chat 應用程式可以呼叫 Chat API,以非同步方式發布訊息或執行其他作業。

這個架構可讓您靈活使用系統中現有的程式庫和元件,因為這些 Chat 應用程式可使用不同的程式設計語言設計。

目標

  • 設定環境。
  • 建立及部署 Cloud 函式。
  • 將應用程式發布到 Chat。
  • 測試應用程式。

必要條件

  • 擁有 Google Workspace 機構存取權的 Google Workspace 帳戶,且該機構允許在未經驗證的 Google Cloud 函式叫用中叫用 Google Chat

設定環境

使用 Google API 前,請先在 Google Cloud 專案中啟用這些 API。您可以在單一 Google Cloud 專案中啟用一或多個 API。
  • 在 Google Cloud 控制台中啟用 Google Chat API、Cloud Build API、Cloud Functions API、Cloud Pub/Sub API、Cloud Logging API、Artifact Registry API 和 Cloud Run API。

    啟用 API

建立及部署 Cloud 函式

建立及部署 Cloud 函式,以產生含有傳送者顯示名稱和顯示圖片圖片的 Chat 資訊卡。Chat 應用程式收到訊息時,就會執行函式並回覆資訊卡。

如要為 Chat 應用程式建立及部署函式,請完成下列步驟:

Node.js

  1. 前往 Google Cloud 控制台中的「Cloud Functions」頁面:

    前往 Cloud Functions 頁面

    請確認您已選取 Chat 應用程式的專案。

  2. 按一下 「建立函式」

  3. 在「建立函式」頁面中設定函式:

    1. 在「環境」中,選取「第 2 代」
    2. 在「Function name」(函式名稱) 中輸入 QuickStartChatApp
    3. 在「區域」中選取地區。
    4. 選取「驗證」下方的「允許未經驗證的叫用」
    5. 點選「下一步」。
  4. 在「執行階段」中,選取「Node.js 20」

  5. 在「原始碼」中,選取「內嵌編輯器」

  6. 在「進入點」中刪除預設文字,然後輸入 helloChat

  7. index.js 的內容替換為下列程式碼:

    節點/avatar-app/index.js
    /**
     * Google Cloud Function that responds to messages sent from a
     * Google Chat room.
     *
     * @param {Object} req Request sent from Google Chat room
     * @param {Object} res Response to send back
     */
    exports.helloChat = function helloChat(req, res) {
      if (req.method === 'GET' || !req.body.message) {
        res.send('Hello! This function is meant to be used in a Google Chat ' +
          'Room.');
      }
    
      const sender = req.body.message.sender.displayName;
      const image = req.body.message.sender.avatarUrl;
    
      const data = createMessage(sender, image);
    
      res.send(data);
    };
    
    /**
     * Creates a card with two widgets.
     * @param {string} displayName the sender's display name
     * @param {string} imageUrl the URL for the sender's avatar
     * @return {Object} a card with the user's avatar.
     */
    function createMessage(displayName, imageUrl) {
      const cardHeader = {
        title: `Hello ${displayName}!`,
      };
    
      const avatarWidget = {
        textParagraph: {text: 'Your avatar picture: '},
      };
    
      const avatarImageWidget = {
        image: {imageUrl},
      };
    
      const avatarSection = {
        widgets: [
          avatarWidget,
          avatarImageWidget,
        ],
      };
    
      return {
        text: 'Here\'s your avatar',
        cardsV2: [{
          cardId: 'avatarCard',
          card: {
            name: 'Avatar Card',
            header: cardHeader,
            sections: [avatarSection],
          }
        }],
      };
    }

  8. 按一下「部署」

Python

  1. 前往 Google Cloud 控制台中的「Cloud Functions」頁面:

    前往 Cloud Functions 頁面

    請確認您已選取 Chat 應用程式的專案。

  2. 按一下 「建立函式」

  3. 在「建立函式」頁面中設定函式:

    1. 在「Function name」(函式名稱) 中輸入 QuickStartChatApp
    2. 在「觸發條件類型」中,選取「HTTP」
    3. 選取「驗證」下方的「允許未經驗證的叫用」
    4. 點按「儲存」
    5. 點選「下一步」。
  4. 在「執行階段」中,選取「Python 3.10」

  5. 在「原始碼」中,選取「內嵌編輯器」

  6. 在「進入點」中刪除預設文字,然後輸入 hello_chat

  7. main.py 的內容替換為下列程式碼:

    python/avatar-app/main.py
    from typing import Any, Mapping
    
    import flask
    import functions_framework
    
    
    # Google Cloud Function that responds to messages sent in
    # Google Chat.
    #
    # @param {Object} req Request sent from Google Chat.
    # @param {Object} res Response to send back.
    @functions_framework.http
    def hello_chat(req: flask.Request) -> Mapping[str, Any]:
      if req.method == "GET":
        return "Hello! This function must be called from Google Chat."
    
      request_json = req.get_json(silent=True)
    
      display_name = request_json["message"]["sender"]["displayName"]
      avatar = request_json["message"]["sender"]["avatarUrl"]
    
      response = create_message(name=display_name, image_url=avatar)
    
      return response
    
    
    # Creates a card with two widgets.
    # @param {string} name the sender's display name.
    # @param {string} image_url the URL for the sender's avatar.
    # @return {Object} a card with the user's avatar.
    def create_message(name: str, image_url: str) -> Mapping[str, Any]:
      avatar_image_widget = {"image": {"imageUrl": image_url}}
      avatar_text_widget = {"textParagraph": {"text": "Your avatar picture:"}}
      avatar_section = {"widgets": [avatar_text_widget, avatar_image_widget]}
    
      header = {"title": f"Hello {name}!"}
    
      cards = {
          "text": "Here's your avatar",
          "cardsV2": [
              {
                  "cardId": "avatarCard",
                  "card": {
                      "name": "Avatar Card",
                      "header": header,
                      "sections": [avatar_section],
                  },
              }
          ]
      }
    
      return cards

  8. 按一下「部署」

Java

  1. 前往 Google Cloud 控制台中的「Cloud Functions」頁面:

    前往 Cloud Functions 頁面

    請確認您已選取 Chat 應用程式的專案。

  2. 按一下 「建立函式」

  3. 在「建立函式」頁面中設定函式:

    1. 在「Function name」(函式名稱) 中輸入 QuickStartChatApp
    2. 在「觸發條件類型」中,選取「HTTP」
    3. 選取「驗證」下方的「允許未經驗證的叫用」
    4. 點按「儲存」
    5. 點選「下一步」。
  4. 在「執行階段」中,選取「Java 11」

  5. 在「原始碼」中,選取「內嵌編輯器」

  6. 在「進入點」中刪除預設文字,然後輸入 HelloChat

  7. src/main/java/com/example/Example.java 重新命名為 src/main/java/HelloChat.java

  8. 使用下列程式碼取代 HelloChat.java 的內容:

    java/avatar-app/src/main/java/HelloChat.java
    import com.google.api.services.chat.v1.model.CardWithId;
    import com.google.api.services.chat.v1.model.GoogleAppsCardV1Card;
    import com.google.api.services.chat.v1.model.GoogleAppsCardV1CardHeader;
    import com.google.api.services.chat.v1.model.GoogleAppsCardV1Image;
    import com.google.api.services.chat.v1.model.GoogleAppsCardV1Section;
    import com.google.api.services.chat.v1.model.GoogleAppsCardV1TextParagraph;
    import com.google.api.services.chat.v1.model.GoogleAppsCardV1Widget;
    import com.google.api.services.chat.v1.model.Message;
    import com.google.cloud.functions.HttpFunction;
    import com.google.cloud.functions.HttpRequest;
    import com.google.cloud.functions.HttpResponse;
    import com.google.gson.Gson;
    import com.google.gson.JsonObject;
    import java.util.List;
    
    public class HelloChat implements HttpFunction {
      private static final Gson gson = new Gson();
    
      @Override
      public void service(HttpRequest request, HttpResponse response) throws Exception {
        JsonObject body = gson.fromJson(request.getReader(), JsonObject.class);
    
        if (request.getMethod().equals("GET") || !body.has("message")) {
          response.getWriter().write("Hello! This function must be called from Google Chat.");
          return;
        }
    
        JsonObject sender = body.getAsJsonObject("message").getAsJsonObject("sender");
        String displayName = sender.has("displayName") ? sender.get("displayName").getAsString() : "";
        String avatarUrl = sender.has("avatarUrl") ? sender.get("avatarUrl").getAsString() : "";
        Message message = createMessage(displayName, avatarUrl);
    
        response.getWriter().write(gson.toJson(message));
      }
    
      Message createMessage(String displayName, String avatarUrl) {
        GoogleAppsCardV1CardHeader cardHeader = new GoogleAppsCardV1CardHeader();
        cardHeader.setTitle(String.format("Hello %s!", displayName));
    
        GoogleAppsCardV1TextParagraph textParagraph = new GoogleAppsCardV1TextParagraph();
        textParagraph.setText("Your avatar picture: ");
    
        GoogleAppsCardV1Widget avatarWidget = new GoogleAppsCardV1Widget();
        avatarWidget.setTextParagraph(textParagraph);
    
        GoogleAppsCardV1Image image = new GoogleAppsCardV1Image();
        image.setImageUrl(avatarUrl);
    
        GoogleAppsCardV1Widget avatarImageWidget = new GoogleAppsCardV1Widget();
        avatarImageWidget.setImage(image);
    
        GoogleAppsCardV1Section section = new GoogleAppsCardV1Section();
        section.setWidgets(List.of(avatarWidget, avatarImageWidget));
    
        GoogleAppsCardV1Card card = new GoogleAppsCardV1Card();
        card.setName("Avatar Card");
        card.setHeader(cardHeader);
        card.setSections(List.of(section));
    
        CardWithId cardWithId = new CardWithId();
        cardWithId.setCardId("previewLink");
        cardWithId.setCard(card);
    
        Message message = new Message();
        message.setText("Here's your avatar");
        message.setCardsV2(List.of(cardWithId));
    
        return message;
      }
    }

  9. pom.xml 的內容替換為下列程式碼:

    java/avatar-app/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>cloudfunctions</groupId>
      <artifactId>http-function</artifactId>
      <version>1.0-SNAPSHOT</version>
    
      <properties>
        <maven.compiler.target>11</maven.compiler.target>
        <maven.compiler.source>11</maven.compiler.source>
      </properties>
    
      <dependencies>
        <dependency>
          <groupId>com.google.cloud.functions</groupId>
          <artifactId>functions-framework-api</artifactId>
          <version>1.0.1</version>
        </dependency>
    
        <!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.9.1</version>
        </dependency>
    
        <!-- https://mvnrepository.com/artifact/com.google.apis/google-api-services-chat -->
        <dependency>
          <groupId>com.google.apis</groupId>
          <artifactId>google-api-services-chat</artifactId>
          <version>v1-rev20230115-2.0.0</version>
        </dependency>
      </dependencies>
    
      <!-- Required for Java 11 functions in the inline editor -->
      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.1</version>
            <configuration>
              <excludes>
                <exclude>.google/</exclude>
              </excludes>
            </configuration>
          </plugin>
        </plugins>
      </build>
    </project>

  10. 按一下「部署」

Cloud Functions 詳細資料頁面會開啟,並顯示兩個進度指標:一個用於建構,另一個用於服務。當兩個進度指標都消失且以勾號取代時,就表示您的函式已部署完成且準備就緒。

將應用程式發布到 Google Chat

部署 Cloud 函式後,請按照下列步驟將其轉換為 Google Chat 應用程式:

  1. 在 Google Cloud 控制台中,依序點選「選單」圖示 >「Cloud Functions」

    前往 Cloud Functions 頁面

    請確保選取的是已啟用 Cloud Functions 的專案。

  2. 在函式清單中,按一下「QuickStartChatApp」QuickStartChatApp

  3. 按一下「觸發條件」分頁標籤。

  4. 在「HTTPS」下方複製網址。

  5. 搜尋「Google Chat API」,然後依序按一下「Google Chat API」和「管理」

    前往 Chat API

  6. 按一下「設定」並設定 Google Chat 應用程式:

    1. 在「應用程式名稱」中輸入 Quickstart App
    2. 在「Avatar URL」(顯示圖片網址) 中輸入 https://developers.google.com/chat/images/quickstart-app-avatar.png
    3. 在「說明」中輸入 Quickstart app
    4. 在「功能」下方,選取「接收 1:1 訊息」和「加入聊天室和群組對話」
    5. 在「Connection settings」下方,選取「App URL」,並將 Cloud 函式觸發條件的網址貼到方塊中。
    6. 在「顯示設定」下方,選取「將這個 Google Chat 應用程式提供給網域中的特定使用者和群組」,然後輸入您的電子郵件地址。
    7. 在「記錄檔」下方,選取「將錯誤記錄到 Logging」
  7. 點按「儲存」

Chat 應用程式已準備就緒,可以在 Chat 中接收及回覆訊息了。

測試 Chat 應用程式

如要測試 Chat 應用程式,請透過 Chat 應用程式開啟即時訊息聊天室並傳送訊息:

  1. 使用您新增為信任測試人員時提供的 Google Workspace 帳戶,開啟 Google Chat。

    前往 Google Chat

  2. 按一下「發起即時通訊」圖示
  3. 在「Add 1 or more people」欄位中,輸入 Chat 應用程式的名稱。
  4. 從搜尋結果中選取 Chat 應用程式。系統隨即會開啟即時訊息。

  5. 在與應用程式相關的新即時訊息中輸入 Hello,然後按下 enter

Chat 應用程式的回應包含資訊卡訊息,顯示傳送者的名稱和顯示圖片,如下圖所示:

即時通訊應用程式回覆的資訊卡內容包含傳送者的顯示名稱和顯示圖片

如要新增信任的測試人員並進一步瞭解如何測試互動功能,請參閱「測試 Google Chat 應用程式的互動式功能」。

疑難排解

如果 Google Chat 應用程式或卡片傳回錯誤,Chat 介面會顯示「發生錯誤」或「無法處理您的要求」的訊息。有時 Chat UI 不會顯示任何錯誤訊息,但即時通訊應用程式或資訊卡產生非預期的結果,例如資訊卡訊息可能不會顯示。

雖然 Chat UI 可能不會顯示錯誤訊息,但我們提供描述性的錯誤訊息和記錄資料,協助您修正啟用 Chat 應用程式錯誤記錄功能時發生的錯誤。如要瞭解如何查看、偵錯及修正錯誤,請參閱「疑難排解及修正 Google Chat 錯誤」。

清除所用資源

如要避免系統向您的 Google Cloud 帳戶收取本教學課程中所用資源的費用,建議您刪除 Cloud 專案。

  1. 在 Google Cloud 控制台中,前往「Manage resources」(管理資源) 頁面。依序點選「Menu」圖示 >「IAM & Admin」>「管理資源」

    前往 Resource Manager

  2. 在專案清單中選取要刪除的專案,然後按一下「Delete」(刪除)
  3. 在對話方塊中輸入專案 ID,然後按一下「Shut down」(關閉) 來刪除專案。