Создайте HTTP-приложение Google Chat с облачными функциями.

На этой странице объясняется, как создать приложение HTTP Chat. Существуют разные способы реализации этой архитектуры. В Google Cloud вы можете использовать Cloud Functions, Cloud Run и App Engine. В этом кратком руководстве вы напишете и развернете облачную функцию , которую приложение Chat использует для ответа на сообщение пользователя.

В этой архитектуре вы настраиваете Chat для интеграции с Google Cloud или локальным сервером с помощью HTTP, как показано на следующей схеме:

Архитектура приложения чата, использующего веб-службу на локальном сервере.

На предыдущей диаграмме пользователь, взаимодействующий с приложением HTTP Chat, имеет следующий поток информации:

  1. Пользователь отправляет сообщение в Chat в приложение Chat либо в прямом сообщении, либо в чат-группе.
  2. HTTP-запрос отправляется на веб-сервер, который является облачной или локальной системой и содержит логику приложения Chat.
  3. При желании логику приложения Chat можно интегрировать со службами Google Workspace (например, Календарем и Таблицами), другими службами Google (например, Картами, YouTube и Vertex AI) или другими веб-службами (например, системой управления проектами или инструментом продажи билетов).
  4. Веб-сервер отправляет ответ HTTP обратно в службу приложения Chat в Chat.
  5. Ответ доставляется пользователю.
  6. При желании приложение Chat может вызывать API Chat для асинхронной публикации сообщений или выполнения других операций.

Эта архитектура дает вам возможность использовать существующие библиотеки и компоненты, которые уже существуют в вашей системе, поскольку эти приложения чата могут быть разработаны с использованием разных языков программирования.

Цели

  • Настройте свою среду.
  • Создайте и разверните облачную функцию.
  • Опубликуйте приложение в чате.
  • Протестируйте приложение.

Предварительные условия

Настройка среды

Прежде чем использовать API Google, вам необходимо включить их в проекте Google Cloud. Вы можете включить один или несколько API в одном проекте Google Cloud.
  • В консоли Google Cloud включите API Google Chat, API Cloud Build, API облачных функций, API Cloud Pub/Sub, API облачного ведения журналов, API реестра артефактов и API Cloud Run.

    Включите API

Создайте и разверните облачную функцию

Создайте и разверните облачную функцию, которая генерирует карточку чата с отображаемым именем отправителя и изображением аватара. Когда приложение чата получает сообщение, оно запускает функцию и отвечает картой.

Чтобы создать и развернуть функцию для вашего приложения чата, выполните следующие шаги:

Node.js

  1. В консоли Google Cloud перейдите на страницу «Функции облака»:

    Перейти к облачным функциям

    Убедитесь, что выбран проект для вашего приложения Chat.

  2. Нажмите Создать функцию .

  3. На странице «Создать функцию» настройте свою функцию:

    1. В разделе «Среда» выберите «2-е поколение» .
    2. В поле «Имя функции» введите QuickStartChatApp .
    3. В разделе «Регион» выберите регион.
    4. В разделе «Аутентификация» выберите «Требовать аутентификацию» .
    5. Нажмите "Далее .
  4. В Runtime выберите самую последнюю версию Node.js.

  5. В разделе «Исходный код» выберите «Встроенный редактор» .

  6. В Точке входа удалите текст по умолчанию и введите helloChat .

  7. Замените содержимое index.js следующим кодом:

    узел/аватар-приложение/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. Нажмите «Развернуть» .

Питон

  1. В консоли Google Cloud перейдите на страницу «Функции облака»:

    Перейти к облачным функциям

    Убедитесь, что выбран проект для вашего приложения Chat.

  2. Нажмите Создать функцию .

  3. На странице «Создать функцию» настройте свою функцию:

    1. В разделе «Среда» выберите «2-е поколение» .
    2. В поле «Имя функции» введите QuickStartChatApp .
    3. В разделе «Регион» выберите регион.
    4. В разделе «Аутентификация» выберите «Требовать аутентификацию» .
    5. Нажмите "Далее .
  4. В Runtime выберите самую последнюю версию Python.

  5. В разделе «Исходный код» выберите «Встроенный редактор» .

  6. В Точке входа удалите текст по умолчанию и введите hello_chat .

  7. Замените содержимое main.py следующим кодом:

    python/аватар-приложение/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. Нажмите «Развернуть» .

Джава

  1. В консоли Google Cloud перейдите на страницу «Функции облака»:

    Перейти к облачным функциям

    Убедитесь, что выбран проект для вашего приложения Chat.

  2. Нажмите Создать функцию .

  3. На странице «Создать функцию» настройте свою функцию:

    1. В разделе «Среда» выберите «2-е поколение» .
    2. В поле «Имя функции» введите QuickStartChatApp .
    3. В разделе «Регион» выберите регион.
    4. В разделе «Аутентификация» выберите «Требовать аутентификацию» .
    5. Нажмите "Далее .
  4. В Runtime выберите самую последнюю версию Java.

  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/аватар-приложение/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. Нажмите «Развернуть» .

Откроется страница сведений об облачных функциях, и ваша функция появится с двумя индикаторами хода выполнения: один для сборки, а другой для службы. Когда оба индикатора хода выполнения исчезнут и будут заменены галочками, ваша функция развернута и готова.

Разрешите Google Chat вызывать вашу функцию

Чтобы разрешить Google Chat вызывать вашу функцию, добавьте учетную запись службы Google Chat с ролью Cloud Run Invoker .

  1. В консоли Google Cloud перейдите на страницу Cloud Run:

    Перейти в Cloud Run

  2. В списке сервисов Cloud Run установите флажок рядом с функцией приема. (Не нажимайте на саму функцию.)

  3. Нажмите Разрешения . Откроется панель «Разрешения» .

  4. Нажмите Добавить принципала .

  5. В разделе «Новые участники» введите chat@system.gserviceaccount.com .

  6. В разделе «Выберите роль» выберите Cloud Run > Cloud Run Invoker .

  7. Нажмите Сохранить .

Опубликуйте приложение в Google Chat

После развертывания облачной функции выполните следующие действия, чтобы превратить ее в приложение Google Chat:

  1. В консоли Google Cloud нажмите > Функции облака .

    Перейти к облачным функциям

    Убедитесь, что выбран проект, для которого вы включили облачные функции.

  2. В списке функций нажмите QuickStartChatApp .

  3. Откройте вкладку «Триггеры» .

  4. В разделе HTTPS скопируйте URL-адрес.

  5. Найдите «Google Chat API» и нажмите «Google Chat API» , затем нажмите « Управление» .

    Перейти к API чата

  6. Нажмите «Конфигурация» и настройте приложение Google Chat:

    1. В поле «Имя приложения» введите Quickstart App .
    2. В URL-адресе аватара введите https://developers.google.com/chat/images/quickstart-app-avatar.png .
    3. В поле «Описание» введите Quickstart app .
    4. В разделе «Функциональность» выберите «Получать сообщения 1:1» и «Присоединяться к группам и групповым беседам» .
    5. В разделе «Настройки подключения» выберите URL-адрес приложения и вставьте URL-адрес триггера облачной функции в поле.
    6. В разделе «Аудитория аутентификации» выберите URL-адрес приложения .
    7. В разделе «Видимость» выберите «Сделать это приложение Google Chat доступным для определенных людей и групп в вашем домене» и введите свой адрес электронной почты.
    8. В разделе «Журналы» выберите «Записывать ошибки в журнал» .
  7. Нажмите Сохранить .

Приложение Chat готово получать сообщения в Chat и отвечать на них.

Проверьте свое приложение чата

Чтобы протестировать приложение Chat, откройте пространство для прямых сообщений в приложении Chat и отправьте сообщение:

  1. Откройте Google Chat, используя учетную запись Google Workspace, которую вы указали при добавлении себя в качестве доверенного тестировщика.

    Перейти в чат Google

  2. Нажмите новый чат» .
  3. В поле «Добавить 1 или несколько человек» введите название вашего приложения чата.
  4. Выберите приложение чата из результатов. Откроется прямое сообщение.

  5. В новом прямом сообщении с приложением введите Hello и нажмите enter .

Ответ приложения Chat содержит карточное сообщение , в котором отображается имя отправителя и изображение аватара, как показано на следующем изображении:

Приложение чата отвечает карточкой с отображаемым именем отправителя и изображением аватара.

Чтобы добавить доверенных тестировщиков и узнать больше о тестировании интерактивных функций, см. раздел Тестирование интерактивных функций для приложений Google Chat .

Устранение неполадок

Когда приложение или карточка Google Chat возвращает ошибку, в интерфейсе Chat отображается сообщение «Что-то пошло не так». или «Невозможно обработать ваш запрос». Иногда в пользовательском интерфейсе чата не отображается сообщение об ошибке, но приложение или карточка чата выдает неожиданный результат; например, сообщение с карточкой может не появиться.

Хотя сообщение об ошибке может не отображаться в пользовательском интерфейсе чата, доступны описательные сообщения об ошибках и данные журнала, которые помогут вам исправить ошибки, если включено ведение журнала ошибок для приложений чата. Информацию о просмотре, отладке и исправлении ошибок см. в разделе «Устранение неполадок и исправление ошибок Google Chat» .

Очистить

Чтобы избежать списания средств с вашей учетной записи Google Cloud за ресурсы, используемые в этом руководстве, мы рекомендуем вам удалить проект Cloud.

  1. В консоли Google Cloud перейдите на страницу «Управление ресурсами» . > IAM и администрирование > Управление ресурсами .

    Зайдите в диспетчер ресурсов

  2. В списке проектов выберите проект, который хотите удалить, и нажмите « .
  3. В диалоговом окне введите идентификатор проекта и нажмите «Завершить работу» , чтобы удалить проект.