Compila una app de Google Chat detrás de un firewall con Pub/Sub

En esta página, se explica cómo crear una app de Chat con Pub/Sub. Este tipo de arquitectura de una app de Chat es útil si tu organización tiene un firewall, lo que puede impedir que Chat si envías mensajes a la app de Chat usa el API de Google Workspace Events. Sin embargo, arquitectura de la nube tiene las siguientes limitaciones debido al hecho de que estas Las apps de chat solo pueden enviar y recibir mensajes mensajes asíncronos:

  • No se pueden usar diálogos en los mensajes. En su lugar, usa un mensaje de tarjeta.
  • No se pueden actualizar tarjetas individuales con una respuesta síncrona. En su lugar, actualiza todo el mensaje llamando al patch .

En el siguiente diagrama, se muestra la arquitectura de una App de chat compilada con Pub/Sub:

Arquitectura de una app de Chat implementada con Pub/Sub

En el diagrama anterior, un usuario interactúa con una instancia La app de Chat tiene el siguiente flujo de información:

  1. Un usuario envía un mensaje en Chat a un App de Chat, ya sea en un mensaje directo o en una Un espacio de Chat o un evento en un espacio de Chat para los que la app de Chat tiene suscripción.

  2. Chat envía el mensaje a un tema de Pub/Sub.

  3. Un servidor de aplicaciones, que puede ser un sistema local o en la nube que contiene la lógica de la app de Chat, se suscribe tema de Pub/Sub para recibir el mensaje a través del firewall.

  4. Si lo deseas, la app de Chat puede llamar al Chat para publicar mensajes de forma asíncrona o realizar otras las operaciones.

Requisitos previos

Java

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 y la API de Pub/Sub.

    Habilitar las API

Cómo configurar Pub/Sub

  1. Crea un tema de Pub/Sub a los que la API de Chat puede enviar mensajes. Te recomendamos que utilices un solo tema por app de Chat.

  2. Otorga permiso a Chat para publicar al tema asignando el rol de Publicador de Pub/Sub a lo siguiente: cuenta de servicio:

    chat-api-push@system.gserviceaccount.com
    
  3. Crea una cuenta de servicio para que la app de Chat la autorice con Pub/Sub y Chatear y guardar el archivo de claves privadas en tu directorio de trabajo.

  4. Crea una suscripción de extracción al tema.

  5. Asigna el rol de suscriptor de Pub/Sub en la suscripción para la cuenta de servicio que creaste antes.

Escribe el guion

Java

  1. En una CLI, proporciona credenciales de cuenta de servicio:

    export GOOGLE_APPLICATION_CREDENTIALS=SERVICE_ACCOUNT_FILE_PATH
    
  2. En una CLI, proporciona el ID del proyecto de Google Cloud:

    export PROJECT_ID=PROJECT_ID
    
  3. En una CLI, proporciona el ID de suscripción para la suscripción de Pub/Sub que que creaste anteriormente:

    export SUBSCRIPTION_ID=SUBSCRIPTION_ID
    
  4. En el directorio de trabajo, crea un archivo llamado pom.xml.

  5. En el archivo pom.xml, pega el siguiente código:

    java/pub-sub-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>com.google.chat</groupId>
      <artifactId>pub-sub-app</artifactId>
      <version>0.1.0</version>
    
      <name>pub-sub-app-java</name>
    
      <properties>
        <maven.compiler.release>21</maven.compiler.release>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
      </properties>
    
      <dependencies>
        <!-- Google Chat GAPIC library -->
        <dependency>
          <groupId>com.google.api.grpc</groupId>
          <artifactId>proto-google-cloud-chat-v1</artifactId>
          <version>0.8.0</version>
        </dependency>
        <dependency>
          <groupId>com.google.api</groupId>
          <artifactId>gax</artifactId>
          <version>2.48.1</version>
        </dependency>
        <dependency>
          <groupId>com.google.cloud</groupId>
          <artifactId>google-cloud-chat</artifactId>
          <version>0.1.0</version>
        </dependency>
        <!-- Google Cloud Pub/Sub library -->
        <dependency>
          <groupId>com.google.cloud</groupId>
          <artifactId>google-cloud-pubsub</artifactId>
        <version>1.125.8</version>
        </dependency>
        <!-- JSON utilities -->
        <dependency>
          <groupId>com.fasterxml.jackson.core</groupId>
          <artifactId>jackson-databind</artifactId>
          <version>2.14.2</version>
        </dependency>
      </dependencies>
    
    </project>
  6. En tu directorio de trabajo, crea la estructura de directorio src/main/java.

  7. En el directorio src/main/java, crea un archivo llamado Main.java.

  8. En Main.java, pega el siguiente código:

    java/pub-sub-app/src/main/java/Main.java
    import com.fasterxml.jackson.databind.JsonNode;
    import com.fasterxml.jackson.databind.ObjectMapper;
    import com.google.api.gax.core.FixedCredentialsProvider;
    import com.google.auth.oauth2.GoogleCredentials;
    import com.google.chat.v1.ChatServiceClient;
    import com.google.chat.v1.ChatServiceSettings;
    import com.google.chat.v1.CreateMessageRequest;
    import com.google.chat.v1.CreateMessageRequest.MessageReplyOption;
    import com.google.chat.v1.Message;
    import com.google.chat.v1.Thread;
    import com.google.cloud.pubsub.v1.AckReplyConsumer;
    import com.google.cloud.pubsub.v1.MessageReceiver;
    import com.google.cloud.pubsub.v1.Subscriber;
    import com.google.pubsub.v1.ProjectSubscriptionName;
    import com.google.pubsub.v1.PubsubMessage;
    import java.io.FileInputStream;
    import java.util.Collections;
    
    public class Main {
    
      public static final String PROJECT_ID_ENV_PROPERTY = "PROJECT_ID";
      public static final String SUBSCRIPTION_ID_ENV_PROPERTY = "SUBSCRIPTION_ID";
      public static final String CREDENTIALS_PATH_ENV_PROPERTY = "GOOGLE_APPLICATION_CREDENTIALS";
    
      public static void main(String[] args) throws Exception {
        ProjectSubscriptionName subscriptionName =
            ProjectSubscriptionName.of(
                System.getenv(Main.PROJECT_ID_ENV_PROPERTY),
                System.getenv(Main.SUBSCRIPTION_ID_ENV_PROPERTY));
    
        // Instantiate app, which implements an asynchronous message receiver.
        EchoApp echoApp = new EchoApp();
    
        // Create a subscriber for <var>SUBSCRIPTION_ID</var> bound to the message receiver
        final Subscriber subscriber = Subscriber.newBuilder(subscriptionName, echoApp).build();
        System.out.println("Subscriber is listening to events...");
        subscriber.startAsync();
    
        // Wait for termination
        subscriber.awaitTerminated();
      }
    }
    
    /**
     * A demo app which implements {@link MessageReceiver} to receive messages. It simply echoes the
     * incoming messages.
     */
    class EchoApp implements MessageReceiver {
    
      // Path to the private key JSON file of the service account to be used for posting response
      // messages to Google Chat.
      // In this demo, we are using the same service account for authorizing with Cloud Pub/Sub to
      // receive messages and authorizing with Google Chat to post messages. If you are using
      // different service accounts, please set the path to the private key JSON file of the service
      // account used to post messages to Google Chat here.
      private static final String SERVICE_ACCOUNT_KEY_PATH =
          System.getenv(Main.CREDENTIALS_PATH_ENV_PROPERTY);
    
      // Developer code for Google Chat API scope.
      private static final String GOOGLE_CHAT_API_SCOPE = "https://www.googleapis.com/auth/chat.bot";
    
      private static final String ADDED_RESPONSE = "Thank you for adding me!";
    
      ChatServiceClient chatServiceClient;
    
      EchoApp() throws Exception {
        GoogleCredentials credential =
            GoogleCredentials.fromStream(new FileInputStream(SERVICE_ACCOUNT_KEY_PATH))
                .createScoped(Collections.singleton(GOOGLE_CHAT_API_SCOPE));
    
        // Create the ChatServiceSettings with the app credentials
        ChatServiceSettings chatServiceSettings =
            ChatServiceSettings.newBuilder()
                .setCredentialsProvider(FixedCredentialsProvider.create(credential))
                .build();
    
        // Set the Chat service client
        chatServiceClient = ChatServiceClient.create(chatServiceSettings);
      }
    
      // Called when a message is received by the subscriber.
      @Override
      public void receiveMessage(PubsubMessage pubsubMessage, AckReplyConsumer consumer) {
        System.out.println("Id : " + pubsubMessage.getMessageId());
        // Handle incoming message, then ack/nack the received message
        try {
          ObjectMapper mapper = new ObjectMapper();
          JsonNode dataJson = mapper.readTree(pubsubMessage.getData().toStringUtf8());
          System.out.println("Data : " + dataJson.toString());
          handle(dataJson);
          consumer.ack();
        } catch (Exception e) {
          System.out.println(e);
          consumer.nack();
        }
      }
    
      // Send message to Google Chat based on the type of event.
      public void handle(JsonNode eventJson) throws Exception {
        CreateMessageRequest createMessageRequest;
        switch (eventJson.get("type").asText()) {
          case "ADDED_TO_SPACE":
            // An app can also be added to a space by @mentioning it in a message. In that case, we fall
            // through to the MESSAGE case and let the app respond. If the app was added using the
            // invite flow, we just post a thank you message in the space.
            if (!eventJson.has("message")) {
              createMessageRequest =
                  CreateMessageRequest.newBuilder()
                      .setParent(eventJson.get("space").get("name").asText())
                      .setMessage(Message.newBuilder().setText(ADDED_RESPONSE).build())
                      .build();
              break;
            }
          case "MESSAGE":
            // In case of message, post the response in the same thread.
            createMessageRequest =
                CreateMessageRequest.newBuilder()
                    .setParent(eventJson.get("space").get("name").asText())
                    .setMessageReplyOption(MessageReplyOption.REPLY_MESSAGE_FALLBACK_TO_NEW_THREAD)
                    .setMessage(
                        Message.newBuilder()
                            .setText(
                                "You said: `" + eventJson.get("message").get("text").asText() + "`")
                            .setThread(
                                Thread.newBuilder()
                                    .setName(
                                        eventJson.get("message").get("thread").get("name").asText())
                                    .build())
                            .build())
                    .build();
            break;
          case "REMOVED_FROM_SPACE":
          default:
            // Do nothing
            return;
        }
    
        // Post the response to Google Chat.
        chatServiceClient.createMessage(createMessageRequest);
      }
    }

Publica la app en Chat

  1. En la consola de Google Cloud, ve a Menú &gt; APIs y Servicios &gt; APIs habilitadas y Servicios &gt; API de Google Chat &gt; Configuración.

    Ir a Configuración

  2. Configura la app de Chat para Pub/Sub:

    1. En Nombre de la app, ingresa Quickstart App.
    2. En URL del avatar, escribe https://developers.google.com/chat/images/quickstart-app-avatar.png.
    3. En Descripción, ingresa Quickstart 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 Cloud Pub/Sub y pega el el nombre del tema de Pub/Sub que creaste anteriormente.
    6. En Visibilidad, selecciona Permitir que esta app de Google Chat esté disponible para personas y grupos específicos de tu dominio y, luego, ingresa tu dirección de correo electrónico.
    7. En Registros, selecciona Registrar errores en Logging.
  3. Haz clic en Guardar.

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

Ejecuta la secuencia de comandos:

En la CLI, cambia al directorio de trabajo y ejecuta la secuencia de comandos:

Java

mvn compile exec:java -Dexec.mainClass=Main

Cuando ejecutas el código, la app comienza a escuchar los mensajes publicados al tema de Pub/Sub.

Prueba tu app de Chat

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

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

    Ir a Google Chat

  2. Haz clic en Nuevo chat.
  3. En el campo Add 1 or more people, escribe el nombre de tu App de Chat
  4. Selecciona tu app de Chat en los resultados. Un se abrirá un mensaje.

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

Para agregar verificadores de confianza y obtener más información para probar funciones interactivas, consulta Prueba las funciones interactivas para Apps de Google Chat.

Solucionar problemas

Cuando una app de Google Chat o card muestra un error, el En la interfaz de Chat, aparece un mensaje que dice “Se produjo un error”. o "No se pudo procesar la solicitud". A veces, la IU de Chat no muestra ningún mensaje de error, pero la app de Chat la tarjeta produce un resultado inesperado; Por ejemplo, es posible que un mensaje de tarjeta no para que aparezca la opción.

Aunque es posible que no aparezca 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 de las apps de Chat. Para obtener ayuda sobre la visualización, la depuración y la corrección de errores, consulta Soluciona problemas y corrige errores de Google Chat.

Limpia

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

  1. En la consola de Google Cloud, ve a la página Administrar recursos. Haz clic en Menú &gt; IAM y Administrador &gt; Administrar recursos.

    Ir a Resource Manager

  2. En la lista de proyectos, elige el proyecto que quieres borrar y haz clic en Borra .
  3. En el diálogo, escribe el ID del proyecto y, luego, haz clic en Cerrar para borrarlo. el proyecto.