Compila una app HTTP de Google Chat

En esta página, se explica cómo crear una app de chat HTTP. Existen diferentes formas de implementar esta arquitectura. En Google Cloud, puedes usar Cloud Run y App Engine. En esta guía de inicio rápido, escribirás e implementarás una función de Cloud Run que la app de Chat usa para responder el mensaje de un usuario.

Con esta arquitectura, configuras Chat para que se integre con Google Cloud o un servidor local a través de HTTP, como se muestra en el siguiente diagrama:

Arquitectura de una app de Chat que usa un servicio web en un servidor local.

En el diagrama anterior, un usuario que interactúa con una app de chat HTTP tiene el siguiente flujo de información:

  1. Un usuario envía un mensaje en Chat a una app de Chat, ya sea en un mensaje directo o en un espacio de Chat.
  2. Se envía una solicitud HTTP a un servidor web que es un sistema en la nube o local que contiene la lógica de la app de Chat.
  3. De manera opcional, la lógica de la app de Chat puede integrarse con los servicios de Google Workspace (como Calendario y Hojas de cálculo), otros servicios de Google (como Maps, YouTube y Vertex AI) o con otros servicios web (como un sistema de administración de proyectos o una herramienta de tickets).
  4. El servidor web envía una respuesta HTTP al servicio de la app de Chat en Chat.
  5. La respuesta se entrega al usuario.
  6. De manera opcional, la app de Chat puede llamar a la API de Chat para publicar mensajes de forma asíncrona o realizar otras operaciones.

Esta arquitectura te brinda la flexibilidad de usar bibliotecas y componentes existentes que ya se encuentran en tu sistema, ya que estas apps de chat se pueden diseñar con diferentes lenguajes de programación.

Objetivos

  • Configura el entorno.
  • Crea e implementa una función de Cloud Run.
  • Publica la app en Chat.
  • Probar la app

Requisitos previos

Configura el entorno

Antes de usar las APIs de Google, debes activarlas en un proyecto de Google Cloud. Puedes activar una o más APIs en un solo proyecto de Google Cloud.
  • En la consola de Google Cloud, habilita la API de Google Chat, la API de Cloud Build, la API de Cloud Functions, la API de Cloud Pub/Sub, la API de Cloud Logging, la API de Artifact Registry y la API de Cloud Run.

    Habilitar las API

Crea e implementa una función de Cloud Run

Crea e implementa una función de Cloud Run que genere una tarjeta de chat con el nombre visible y la imagen de avatar del remitente. Cuando la app de Chat recibe un mensaje, ejecuta la función y responde con la tarjeta.

Para crear e implementar la función de tu app de Chat, completa los siguientes pasos:

Node.js

  1. En la consola de Google Cloud, ve a la página Cloud Run:

    Ir a Cloud Run

    Asegúrate de que esté seleccionado el proyecto de tu app de Chat.

  2. Haz clic en Escribe una función.

  3. En la página Crear servicio, configura tu función:

    1. En el campo Nombre del servicio, ingresa quickstartchatapp.
    2. En la lista Región, selecciona una región.
    3. En la lista Entorno de ejecución, selecciona la versión más reciente de Node.js.
    4. En la sección Autenticación, selecciona Autenticación obligatoria.
    5. Haz clic en Crear y espera a que Cloud Run cree el servicio. La consola te redirecciona a la pestaña Fuente.
  4. En la pestaña Fuente, haz lo siguiente:

    1. En Punto de entrada, borra el texto predeterminado y, luego, ingresa avatarApp.
    2. Reemplaza el contenido de index.js con el código que se muestra a continuación:

      node/avatar-app/index.js
      const functions = require('@google-cloud/functions-framework');
      
      // Command IDs (configure these in Google Chat API)
      const ABOUT_COMMAND_ID = 1; // ID for the "/about" slash command
      const HELP_COMMAND_ID = 2; // ID for the "Help" quick command
      
      /**
       * Google Cloud Function that handles HTTP requests from Google Chat.
       *
       * @param {Object} req - The HTTP request object sent from Google Chat.
       * @param {Object} res - The HTTP response object.
       */
      functions.http('avatarApp', (req, res) => {
        const event = req.body;
      
        if (event.appCommandMetadata) {
          handleAppCommands(event, res);
        } else {
          handleRegularMessage(event, res);
        }
      });
      
      /**
       * Handles slash and quick commands.
       *
       * @param {Object} event - The Google Chat event.
       * @param {Object} res - The HTTP response object.
       */
      function handleAppCommands(event, res) {
        const {appCommandId, appCommandType} = event.appCommandMetadata;
      
        switch (appCommandId) {
          case ABOUT_COMMAND_ID:
            return res.send({
              privateMessageViewer: event.user,
              text: 'The Avatar app replies to Google Chat messages.'
            });
          case HELP_COMMAND_ID:
            return res.send({
              privateMessageViewer: event.user,
              text: 'The Avatar app replies to Google Chat messages.'
            });
        }
      }
      
      /**
       * Handles regular messages (not commands).
       *
       * @param {Object} event - The Google Chat event.
       * @param {Object} res - The HTTP response object.
       */
      function handleRegularMessage(event, res) {
        const messageData = createMessage(event.user);
        res.send(messageData);
      }
      
      /**
       * Creates a card message with the user's avatar.
       *
       * @param {Object} user - The user who sent the message.
       * @param {string} user.displayName - The user's display name.
       * @param {string} user.avatarUrl - The URL of the user's avatar.
       * @return {Object} - The card message object.
       */
      function createMessage({displayName, avatarUrl}) {
        return {
          text: 'Here\'s your avatar',
          cardsV2: [{
            cardId: 'avatarCard',
            card: {
              name: 'Avatar Card',
              header: {
                title: `Hello ${displayName}!`,
              },
              sections: [{
                widgets: [
                  {textParagraph: {text: 'Your avatar picture:'}},
                  {image: {imageUrl: avatarUrl}},
                ],
              }],
            },
          }],
        };
      }

    3. Haz clic en Guardar y volver a implementar.

Python

  1. En la consola de Google Cloud, ve a la página Cloud Run:

    Ir a Cloud Run

    Asegúrate de que esté seleccionado el proyecto de tu app de Chat.

  2. Haz clic en Escribe una función.

  3. En la página Crear servicio, configura tu función:

    1. En el campo Nombre del servicio, ingresa quickstartchatapp.
    2. En la lista Región, selecciona una región.
    3. En la lista Entorno de ejecución, selecciona la versión más reciente de Python.
    4. En la sección Autenticación, selecciona Autenticación obligatoria.
    5. Haz clic en Crear y espera a que Cloud Run cree el servicio. La consola te redirecciona a la pestaña Fuente.
  4. En la pestaña Fuente, haz lo siguiente:

    1. En Punto de entrada, borra el texto predeterminado y, luego, ingresa avatar_app.
    2. Reemplaza el contenido de main.py con el código que se muestra a continuación:

      python/avatar-app/main.py
      from typing import Any, Mapping
      
      import flask
      import functions_framework
      
      # Command IDs (configure these in Google Chat API)
      ABOUT_COMMAND_ID = 1  # ID for the "/about" slash command
      HELP_COMMAND_ID = 2  # ID for the "Help" quick command
      
      
      @functions_framework.http
      def avatar_app(req: flask.Request) -> Mapping[str, Any]:
          """Google Cloud Function that handles HTTP requests from Google Chat.
      
          Args:
              flask.Request: the request
      
          Returns:
              Mapping[str, Any]: the response
          """
          event = req.get_json(silent=True)
      
          if event and "appCommandMetadata" in event:
              return handle_app_commands(event)
          else:
              return handle_regular_message(event)
      
      
      def handle_app_commands(event: Mapping[str, Any]) -> Mapping[str, Any]:
          """Handles slash and quick commands.
      
          Args:
              Mapping[str, Any] event: The Google Chat event.
      
          Returns:
              Mapping[str, Any]: the response
          """
          app_command_id = event["appCommandMetadata"]["appCommandId"]
      
          if app_command_id == ABOUT_COMMAND_ID:
              return {
                  "privateMessageViewer": event["user"],
                  "text": "The Avatar app replies to Google Chat messages.",
              }
          elif app_command_id == HELP_COMMAND_ID:
              return {
                  "privateMessageViewer": event["user"],
                  "text": "The Avatar app replies to Google Chat messages.",
              }
          return {}
      
      
      
      
      def handle_regular_message(event: Mapping[str, Any]) -> Mapping[str, Any]:
          """Handles regular messages (not commands).
      
          Args:
              Mapping[str, Any] event: The Google Chat event.
      
          Returns:
              Mapping[str, Any]: the response
          """
      
          if not event or "user" not in event:
              return "Invalid request."
      
          message_data = create_message(event["user"])
          return message_data
      
      
      def create_message(user: Mapping[str, Any]) -> Mapping[str, Any]:
          """Creates a card message with the user's avatar.
      
          Args:
              Mapping[str, Any] user: The user who sent the message.
      
          Returns:
              Mapping[str, Any]: a card with the user's avatar.
          """
          display_name = user.get("displayName", "")
          avatar_url = user.get("avatarUrl", "")
      
          return {
              "text": "Here's your avatar",
              "cardsV2": [
                  {
                      "cardId": "avatarCard",
                      "card": {
                          "name": "Avatar Card",
                          "header": {"title": f"Hello {display_name}!"},
                          "sections": [
                              {
                                  "widgets": [
                                      {"textParagraph": {"text": "Your avatar picture:"}},
                                      {"image": {"imageUrl": avatar_url}},
                                  ]
                              }
                          ],
                      },
                  }
              ],
          }

    3. Haz clic en Guardar y volver a implementar.

Java

  1. En la consola de Google Cloud, ve a la página Cloud Run:

    Ir a Cloud Run

    Asegúrate de que esté seleccionado el proyecto de tu app de Chat.

  2. Haz clic en Escribe una función.

  3. En la página Crear servicio, configura tu función:

    1. En el campo Nombre del servicio, ingresa quickstartchatapp.
    2. En la lista Región, selecciona una región.
    3. En la lista Entorno de ejecución, selecciona la versión más reciente de Java.
    4. En la sección Autenticación, selecciona Autenticación obligatoria.
    5. Haz clic en Crear y espera a que Cloud Run cree el servicio. La consola te redirecciona a la pestaña Fuente.
  4. En la pestaña Fuente, haz lo siguiente:

    1. En Punto de entrada, borra el texto predeterminado y, luego, ingresa App.
    2. Se cambia el nombre de src/main/java/com/example/Example.java a src/main/java/AvatarApp.java.
    3. Reemplaza el contenido de AvatarApp.java con el código que se muestra a continuación:

      java/avatar-app/src/main/java/AvatarApp.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.api.services.chat.v1.model.User;
      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 AvatarApp implements HttpFunction {
        private static final Gson gson = new Gson();
      
        // Command IDs (configure these in Google Chat API)
        private static final int ABOUT_COMMAND_ID = 1; // ID for the "/about" slash command
        private static final int HELP_COMMAND_ID = 2; // ID for the "Help" quick command
      
        @Override
        public void service(HttpRequest request, HttpResponse response) throws Exception {
          JsonObject event = gson.fromJson(request.getReader(), JsonObject.class);
      
          if (event.has("appCommandMetadata")) {
            handleAppCommands(event, response);
          } else {
            handleRegularMessage(event, response);
          }
        }
      
        /**
         * Handles slash and quick commands.
         *
         * @param event    The Google Chat event.
         * @param response The HTTP response object.
         */
        private void handleAppCommands(JsonObject event, HttpResponse response) throws Exception {
          int appCommandId = event.getAsJsonObject("appCommandMetadata").get("appCommandId").getAsInt();
      
          switch (appCommandId) {
            case ABOUT_COMMAND_ID:
              Message aboutMessage = new Message();
              aboutMessage.setText("The Avatar app replies to Google Chat messages.");
              aboutMessage.setPrivateMessageViewer(new User()
                  .setName(event.getAsJsonObject("user").get("name").getAsString()));
              response.getWriter().write(gson.toJson(aboutMessage));
              return;
            case HELP_COMMAND_ID:
              Message helpMessage = new Message();
              helpMessage.setText("The Avatar app replies to Google Chat messages.");
              helpMessage.setPrivateMessageViewer(new User()
                  .setName(event.getAsJsonObject("user").get("name").getAsString()));
              response.getWriter().write(gson.toJson(helpMessage));
              return;
          }
        }
      
        /**
         * Handles regular messages (not commands).
         *
         * @param event    The Google Chat event.
         * @param response The HTTP response object.
         */
        private void handleRegularMessage(JsonObject event, HttpResponse response) throws Exception {
      
          if (!event.has("user")) {
            response.getWriter().write("Invalid request.");
            return;
          }
      
          JsonObject user = event.getAsJsonObject("user");
          String displayName = user.has("displayName") ? user.get("displayName").getAsString() : "";
          String avatarUrl = user.has("avatarUrl") ? user.get("avatarUrl").getAsString() : "";
          Message message = createMessage(displayName, avatarUrl);
          response.getWriter().write(gson.toJson(message));
        }
      
        /**
         * Creates a card message with the user's avatar.
         *
         * @param displayName The user's display name.
         * @param avatarUrl   The URL of the user's avatar.
         * @return The card message object.
         */
        private Message createMessage(String displayName, String avatarUrl) {
          return new Message()
              .setText("Here's your avatar")
              .setCardsV2(List.of(new CardWithId()
                  .setCardId("avatarCard")
                  .setCard(new GoogleAppsCardV1Card()
                      .setName("Avatar Card")
                      .setHeader(new GoogleAppsCardV1CardHeader()
                          .setTitle(String.format("Hello %s!", displayName)))
                      .setSections(List.of(new GoogleAppsCardV1Section().setWidgets(List.of(
                          new GoogleAppsCardV1Widget()
                              .setTextParagraph(new GoogleAppsCardV1TextParagraph()
                                  .setText("Your avatar picture:")),
                          new GoogleAppsCardV1Widget()
                              .setImage(new GoogleAppsCardV1Image().setImageUrl(avatarUrl)))))))));
        }
      }

    4. Reemplaza el contenido de pom.xml con el código que se muestra a continuación:

      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/maven-v4_0_0.xsd">
        <modelVersion>4.0.0</modelVersion>
      
        <groupId>gcfv2</groupId>
        <artifactId>avatar-app</artifactId>
        <version>0.0.1</version>
        <name>Avatar App</name>
      
        <properties>
          <maven.compiler.release>21</maven.compiler.release>
        </properties>
      
        <dependencies>
          <dependency>
            <groupId>com.google.cloud.functions</groupId>
            <artifactId>functions-framework-api</artifactId>
            <version>1.1.4</version>
          </dependency>
      
          <!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
          <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.12.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-rev20250116-2.0.0</version>
          </dependency>
      
        </dependencies>
      
      </project>

    5. Haz clic en Guardar y volver a implementar.

Autoriza a Google Chat para invocar tu función

Para autorizar a Google Chat a invocar tu función, agrega la cuenta de servicio de Google Chat con el rol de Invocador de Cloud Run.

  1. En la consola de Google Cloud, ve a la página Cloud Run:

    Ir a Cloud Run

  2. En la lista de servicios de Cloud Run, selecciona la casilla de verificación junto a la función receptora. (No hagas clic en la función).

  3. Haz clic en Permisos. Se abrirá el panel Permisos.

  4. Haz clic en Agregar principal.

  5. En Principales nuevas, ingresa chat@system.gserviceaccount.com.

  6. En Selecciona un rol, selecciona Cloud Run > Invocador de Cloud Run.

  7. Haz clic en Guardar.

Configura la app de Chat

Después de implementar la función de Cloud Run, sigue estos pasos para convertirla en una app de Google Chat:

  1. En la consola de Google Cloud, ve a la página Cloud Run:

    Ir a Cloud Run

    Asegúrate de que el proyecto para el que habilitaste Cloud Run esté seleccionado.

  2. En la lista de servicios, haz clic en quickstartchatapp.

  3. En la página Detalles del servicio, copia la URL de la función.

  4. Busca “API de Google Chat”, haz clic en API de Google Chat y, luego, en Administrar.

    Ir a la API de Chat

  5. Haz clic en Configuración y configura la app de Google Chat:

    1. Desmarca la opción Crea esta app de Chat como complemento de Google Workspace. Se abrirá un diálogo en el que se te pedirá que confirmes la acción. En el diálogo que aparece, haz clic en Inhabilitar.
    2. En Nombre de la app, ingresa Quickstart App.
    3. En URL del avatar, ingresa https://developers.google.com/chat/images/quickstart-app-avatar.png.
    4. En Descripción, ingresa Quickstart app.
    5. En Funcionalidad, selecciona Unirse a espacios y conversaciones grupales.
    6. En Configuración de la conexión, selecciona URL del extremo HTTP.
    7. En Activadores, selecciona Usar una URL de extremo HTTP común para todos los activadores y pega la URL del activador de la función de Cloud Run en el cuadro.
    8. En Visibilidad, selecciona Hacer que esta app de Chat esté disponible para personas y grupos específicos de tu dominio y escribe tu dirección de correo electrónico.
    9. En Registros, selecciona Registrar errores en Logging.
  6. Haz clic en Guardar.

La app de Chat está lista para recibir y responder mensajes en Chat.

Prueba tu app de Chat

Para probar tu app de Chat, abre un espacio de mensajes directos con la app de Chat y envía un mensaje:

  1. Abre Google Chat con la cuenta de Google Workspace que proporcionaste cuando te agregaste como verificador de confianza.

    Ir a Google Chat

  2. Haz clic en Nuevo chat.
  3. En el campo Agrega 1 o más personas, escribe el nombre de tu app de Chat.
  4. Selecciona tu app de Chat en los resultados. Se abrirá un mensaje directo.

  5. En el nuevo mensaje directo con la app, escribe Hello y presiona enter.

La respuesta de la app de Chat contiene un mensaje de tarjeta que muestra el nombre y la imagen del avatar del remitente, como se muestra en la siguiente imagen:

App de Chat que responde con una tarjeta en la que se muestran el nombre visible y la imagen de avatar del remitente

Para agregar verificadores de confianza y obtener más información sobre las pruebas de funciones interactivas, consulta Cómo probar funciones interactivas para apps de Google Chat.

Solucionar problemas

Cuando una app o una tarjeta de Google Chat muestra un error, la interfaz de Chat muestra un mensaje que dice "Se produjo un error". o "No se pudo procesar tu solicitud". A veces, la IU de Chat no muestra ningún mensaje de error, pero la app o la tarjeta de Chat producen un resultado inesperado. Por ejemplo, es posible que no aparezca un mensaje de la tarjeta.

Si bien es posible que no se muestre un mensaje de error en la IU de Chat, hay mensajes de error descriptivos y datos de registro disponibles para ayudarte a corregir errores cuando se activa el registro de errores para las apps de Chat. Para obtener ayuda para ver, depurar y corregir errores, consulta Soluciona y corrige errores de Google Chat.

Limpia

Para evitar que se apliquen cargos a tu cuenta de Google Cloud por los recursos que usaste en este instructivo, te recomendamos que borres el proyecto de Cloud.

  1. En la consola de Google Cloud, ve a la página Administrar recursos. Haz clic en Menú > IAM y administración > Administrar recursos.

    Ir al administrador de recursos

  2. En la lista de proyectos, selecciona el proyecto que deseas borrar y haz clic en Borrar .
  3. En el diálogo, escribe el ID del proyecto y, luego, haz clic en Cerrar para borrar el proyecto.