Compila una app HTTP de Google Chat

En esta página, se explica cómo compilar un complemento de Google Workspace que funcione en Google Chat con un servicio HTTP. En Google Chat, los complementos aparecen para los usuarios como apps de Google Chat. Para obtener más información, consulta la descripción general de la extensión de Google Chat.

En esta guía de inicio rápido, se muestra cómo compilar un servicio HTTP con los servicios de Google Cloud. Para compilar la app de Chat, escribes e implementas una Cloud Function que la app de Chat usa para responder el mensaje de un usuario.

Con una arquitectura HTTP, 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 local o en la nube que contiene la lógica de la app de Chat.
  3. De manera opcional, la lógica de la app de Chat se puede integrar 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 generación 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 manera asíncrona o realizar otras operaciones.

Esta arquitectura te brinda la flexibilidad de usar bibliotecas y componentes existentes 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 Cloud Function.
  • Configura un complemento de Google Workspace para la app de Chat.
  • Prueba 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 Cloud Function

Crear e implementar una Cloud Function 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 Functions.

    Ir a Cloud Functions

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

  2. Haz clic en Crear función.

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

    1. En Entorno, selecciona Función de Cloud Run.
    2. En Nombre de la función, ingresa AddOnChatApp.
    3. En Región, selecciona una región.
    4. En Autenticación, selecciona Solicitar autenticación.
    5. Haz clic en Siguiente.
  4. En Entorno de ejecución, selecciona la versión más reciente de Node.js.

  5. En Código fuente, selecciona Editor directo.

  6. En Punto de entrada, borra el texto predeterminado y escribe avatarApp.

  7. Reemplaza el contenido de index.js con el código que se muestra a continuación:

    /**
     * Google Cloud Function that responds to messages sent from a
     * Google Chat space.
     *
     * @param {Object} req Request sent from Google Chat space
     * @param {Object} res Response to send back
     */
    exports.avatarApp = function avatarApp(req, res) {
        if (req.method === 'GET' || !req.body.chat) {
            return res.send('Hello! This function is meant to be used ' +
                'in a Google Chat Space.');
        }
    
        // Stores the Google Chat event as a variable.
        const chatMessage = req.body.chat.messagePayload.message;
    
        // Replies with the sender's avatar in a card.
        const displayName = chatMessage.sender.displayName;
        const avatarUrl = chatMessage.sender.avatarUrl;
        res.send({ hostAppDataAction: { chatDataAction: { createMessageAction: { message: {
            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 }
                        }]
                    }]
                }
            }]
        }}}}});
    };
    
  8. Haz clic en Implementar.

Python

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

    Ir a Cloud Functions

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

  2. Haz clic en Crear función.

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

    1. En Entorno, selecciona Función de Cloud Run.
    2. En Nombre de la función, ingresa AddOnChatApp.
    3. En Región, selecciona una región.
    4. En Autenticación, selecciona Solicitar autenticación.
    5. Haz clic en Siguiente.
  4. En Entorno de ejecución, selecciona la versión más reciente de Python.

  5. En Código fuente, selecciona Editor directo.

  6. En Punto de entrada, borra el texto predeterminado y escribe avatar_app.

  7. Reemplaza el contenido de main.py con el código que se muestra a continuación:

    from typing import Any, Mapping
    
    import flask
    import functions_framework
    
    @functions_framework.http
    def avatar_app(req: flask.Request) -> Mapping[str, Any]:
        """Google Cloud Function that handles requests from Google Chat
    
        Args:
            flask.Request: the request
    
        Returns:
            Mapping[str, Any]: the response
        """
        if req.method == "GET":
            return "Hello! This function must be called from Google Chat."
    
        request_json = req.get_json(silent=True)
    
        # Stores the Google Chat event as a variable.
        chat_message = request_json["chat"]["messagePayload"]["message"]
    
        # Replies with the sender's avatar in a card.
        display_name = chat_message["sender"]["displayName"]
        avatar_url = chat_message["sender"]["avatarUrl"]
        return { "hostAppDataAction": { "chatDataAction": { "createMessageAction": { "message": {
            "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 }
                        }]
                    }]
                }
            }]
        }}}}}
    
  8. Haz clic en Implementar.

Java

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

    Ir a Cloud Functions

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

  2. Haz clic en Crear función.

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

    1. En Entorno, selecciona Función de Cloud Run.
    2. En Nombre de la función, ingresa AddOnChatApp.
    3. En Región, selecciona una región.
    4. En Autenticación, selecciona Solicitar autenticación.
    5. Haz clic en Siguiente.
  4. En Entorno de ejecución, selecciona la versión más reciente de Java.

  5. En Código fuente, selecciona Editor directo.

  6. En Punto de entrada, borra el texto predeterminado y escribe AvatarApp.

  7. Cambia el nombre del archivo Java predeterminado a src/main/java/AvatarApp.java.

  8. Reemplaza el contenido de AvatarApp.java con el código que se muestra a continuación:

    import java.util.List;
    
    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;
    
    public class AvatarApp 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("chat")) {
                response.getWriter().write("Hello! This function is meant to be used " +
                    "in a Google Chat Space..");
                return;
            }
    
            // Stores the Google Chat event as a variable.
            JsonObject chatMessage = body.getAsJsonObject("chat")
                .getAsJsonObject("messagePayload").getAsJsonObject("message");
    
            // Replies with the sender's avatar in a card.
            String displayName = chatMessage.getAsJsonObject("sender").get("displayName").getAsString();
            String avatarUrl = chatMessage.getAsJsonObject("sender").get("avatarUrl").getAsString();
            Message message = createMessage(displayName, avatarUrl);
    
            JsonObject createMessageAction = new JsonObject();
            createMessageAction.add("message", gson.fromJson(gson.toJson(message), JsonObject.class));
    
            JsonObject chatDataAction = new JsonObject();
            chatDataAction.add("createMessageAction", createMessageAction);
    
            JsonObject hostAppDataAction = new JsonObject();
            hostAppDataAction.add("chatDataAction", chatDataAction);
    
            JsonObject dataActions = new JsonObject();
            dataActions.add("hostAppDataAction", hostAppDataAction);
            response.getWriter().write(gson.toJson(dataActions));
        }
    
        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("avatarCard");
            cardWithId.setCard(card);
    
            Message message = new Message();
            message.setText("Here's your avatar");
            message.setCardsV2(List.of(cardWithId));
    
            return message;
        }
    }
    
  9. Reemplaza el contenido de pom.xml con el código que se muestra a continuación:

    <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</groupId>
        <artifactId>avatar-app</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <properties>
            <maven.compiler.target>17</maven.compiler.target>
            <maven.compiler.source>17</maven.compiler.source>
        </properties>
    
        <dependencies>
            <dependency>
            <groupId>com.google.cloud.functions</groupId>
            <artifactId>functions-framework-api</artifactId>
            <version>1.0.4</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 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. Haz clic en Implementar.

Se abrirá la página de detalles de Cloud Functions, y tu función aparecerá con dos indicadores de progreso: uno para la compilación y otro para el servicio. Cuando ambos indicadores de progreso desaparezcan y se reemplacen por una marca de verificación, tu función estará implementada y lista.

Otorga autorización a Google Chat para que invoque tu función

Para autorizar el complemento de Google Workspace para que invoque tu función, agrega la cuenta de servicio del complemento de Google Workspace 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 la dirección de correo electrónico de la cuenta de servicio del complemento de Google Workspace asociada a tu proyecto.

  6. En Selecciona una función, selecciona Cloud Run > Invocador de Cloud Run.

  7. Haz clic en Guardar.

Configura el complemento

Después de implementar la función de Cloud Functions, sigue estos pasos para crear un complemento y, luego, implementar la app de Google Chat:

  1. En la consola de Google Cloud, haz clic en Menú > Cloud Functions.

    Ir a Cloud Functions

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

  2. En la lista de funciones, haz clic en AddOnChatApp.

  3. Hacer clic en la pestaña Activadores

  4. En HTTPS, copia la URL.

  5. Busca “API de Google Chat” y haz clic en API de Google Chat. Luego, haz clic en Administrar.

    Ir a la API de Chat

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

    1. En Nombre de la app, ingresa Add-on Chat app.
    2. En URL del avatar, ingresa https://developers.google.com/chat/images/quickstart-app-avatar.png.
    3. En Descripción, ingresa Add-on Chat app.
    4. En Funcionalidad, selecciona Recibir mensajes 1:1 y Unirse a espacios y conversaciones grupales.
    5. En Configuración de la conexión, selecciona URL del extremo HTTP y pega la URL del activador de Cloud Functions en el cuadro.
    6. En Authentication Audience, selecciona HTTP endpoint URL.
    7. En Visibilidad, selecciona Hacer que esta app de Google Chat esté disponible para personas y grupos específicos en tu dominio y escribe tu dirección de correo electrónico.
    8. En Registros, selecciona Registrar errores en Logging.
  7. 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.

    Ve a Google Chat

  2. Haz clic en Nuevo chat.
  3. En el campo Agregar 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.

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

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

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

Solucionar problemas

Cuando una app de Google Chat o una tarjeta muestran un error, la interfaz de Chat muestra un mensaje que dice "Se produjo un error". o "No se puede 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.

Aunque es posible que no se muestre un mensaje de error en la IU de Chat, los mensajes de error descriptivos y los datos de registro están disponibles para ayudarte a corregir errores cuando se activa el registro de errores de las apps de Chat. Si necesitas ayuda para ver, depurar y corregir errores, consulta Cómo solucionar problemas y corregir 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.

    Ve al Administrador de recursos.

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