Créer une application Google Chat HTTP

Cette page explique comment créer un module complémentaire Google Workspace qui fonctionne dans Google Chat à l'aide d'un service HTTP.

Ce guide de démarrage rapide vous explique comment créer un service HTTP à l'aide des services Google Cloud. Pour créer l'application Chat, vous devez écrire et déployer une fonction Cloud Run que l'application Chat utilise pour répondre au message d'un utilisateur.

Avec une architecture HTTP, vous configurez Chat pour qu'il s'intègre à Google Cloud ou à un serveur sur site à l'aide de HTTP, comme illustré dans le schéma suivant :

Architecture d'une application Chat utilisant un service Web sur un serveur sur site.

Dans le diagramme précédent, un utilisateur qui interagit avec une application de chat HTTP suit le flux d'informations suivant :

  1. Un utilisateur envoie un message dans Chat à une application Chat, soit dans un message privé, soit dans un espace Chat.
  2. Une requête HTTP est envoyée à un serveur Web qui est un système cloud ou sur site contenant la logique de l'application Chat.
  3. La logique de l'application Chat peut éventuellement s'intégrer aux services Google Workspace (comme Agenda et Sheets), à d'autres services Google (comme Maps, YouTube et Vertex AI) ou à d'autres services Web (comme un système de gestion de projet ou un outil de gestion des tickets).
  4. Le serveur Web renvoie une réponse HTTP au service de l'application Chat dans Chat.
  5. La réponse est envoyée à l'utilisateur.
  6. L'application Chat peut également appeler l'API Chat pour publier des messages de manière asynchrone ou effectuer d'autres opérations.

Cette architecture vous permet d'utiliser les bibliothèques et composants existants dans votre système, car ces applications de chat peuvent être conçues à l'aide de différents langages de programmation.

Objectifs

  • configurer votre environnement ;
  • Créer et déployer une fonction Cloud Run
  • Configurez un module complémentaire Google Workspace pour l'application Chat.
  • Testez l'application.

Prérequis

Configurer l'environnement

Avant d'utiliser les API Google, vous devez les activer dans un projet Google Cloud. Vous pouvez activer une ou plusieurs API dans un même projet Google Cloud.
  • Dans la console Google Cloud, activez les API Cloud Build, Cloud Functions, Cloud Pub/Sub, Cloud Logging, Artifact Registry et Cloud Run.

    Activer les API

Créer et déployer une fonction Cloud Run

Créez et déployez une fonction Cloud Run qui génère une fiche Chat avec le nom à afficher et l'image d'avatar de l'expéditeur. Lorsque l'application Chat reçoit un message, elle exécute la fonction et répond avec la fiche.

Pour créer et déployer la fonction de votre application Chat, procédez comme suit :

Node.js

  1. Dans la console Google Cloud, accédez à la page Cloud Run :

    Accédez à Cloud Run

    Assurez-vous que le projet de votre application Chat est sélectionné.

  2. Cliquez sur Écrire une fonction.

  3. Sur la page Créer un service, configurez votre fonction :

    1. Dans le champ Service name (Nom du compte de service), saisissez addonchatapp.
    2. Dans la liste Région, sélectionnez une région.
    3. Dans la liste Environnement d'exécution, sélectionnez la version la plus récente de Node.js.
    4. Dans la section Authentification, sélectionnez Exiger l'authentification.
    5. Cliquez sur Créer et attendez que Cloud Run crée le service. La console vous redirige vers l'onglet Source.
  4. Dans l'onglet Source :

    1. Dans Point d'entrée, supprimez le texte par défaut et saisissez avatarApp.
    2. Remplacez le contenu du fichier index.js par le code suivant :
    node/chat/avatar-app/index.js
    import { http } from '@google-cloud/functions-framework';
    
    // The ID of the slash command "/about".
    // You must use the same ID in the Google Chat API configuration.
    const ABOUT_COMMAND_ID = 1;
    
    /**
     * Handle requests from Google Workspace add on
     *
     * @param {Object} req Request sent by Google Chat
     * @param {Object} res Response to be sent back to Google Chat
     */
    http('avatarApp', (req, res) => {
      const chatEvent = req.body.chat;
      let message;
      if (chatEvent.appCommandPayload) {
        message = handleAppCommand(chatEvent);
      } else {
        message = handleMessage(chatEvent);
      }
      res.send({ hostAppDataAction: { chatDataAction: { createMessageAction: {
        message: message
      }}}});
    });
    
    /**
     * Responds to an APP_COMMAND event in Google Chat.
     *
     * @param {Object} event the event object from Google Chat
     * @return the response message object.
     */
    function handleAppCommand(event) {
      switch (event.appCommandPayload.appCommandMetadata.appCommandId) {
        case ABOUT_COMMAND_ID:
          return {
            text: 'The Avatar app replies to Google Chat messages.'
          };
      }
    }
    
    /**
     * Responds to a MESSAGE event in Google Chat.
     *
     * @param {Object} event the event object from Google Chat
     * @return the response message object.
     */
    function handleMessage(event) {
      // Stores the Google Chat user as a variable.
      const chatUser = event.messagePayload.message.sender;
      const displayName = chatUser.displayName;
      const avatarUrl = chatUser.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 }
            }]}]
          }
        }]
      };
    }
    1. Cliquez sur Enregistrer et redéployer.

Python

  1. Dans la console Google Cloud, accédez à la page Cloud Run :

    Accédez à Cloud Run

    Assurez-vous que le projet de votre application Chat est sélectionné.

  2. Cliquez sur Écrire une fonction.

  3. Sur la page Créer un service, configurez votre fonction :

    1. Dans le champ Service name (Nom du compte de service), saisissez addonchatapp.
    2. Dans la liste Région, sélectionnez une région.
    3. Dans la liste Environnement d'exécution, sélectionnez la version la plus récente de Python.
    4. Dans la section Authentification, sélectionnez Exiger l'authentification.
    5. Cliquez sur Créer et attendez que Cloud Run crée le service. La console vous redirige vers l'onglet Source.
  4. Dans l'onglet Source :

    1. Dans Point d'entrée, supprimez le texte par défaut et saisissez avatar_app.
    2. Remplacez le contenu du fichier main.py par le code suivant :
    python/chat/avatar-app/main.py
    from typing import Any, Mapping
    
    import flask
    import functions_framework
    
    # The ID of the slash command "/about".
    # You must use the same ID in the Google Chat API configuration.
    ABOUT_COMMAND_ID = 1
    
    @functions_framework.http
    def avatar_app(req: flask.Request) -> Mapping[str, Any]:
      """Handle requests from Google Workspace add on
    
      Args:
        flask.Request req: the request sent by Google Chat
    
      Returns:
        Mapping[str, Any]: the response to be sent back to Google Chat
      """
      chat_event = req.get_json(silent=True)["chat"]
      if chat_event and "appCommandPayload" in chat_event:
        message = handle_app_command(chat_event)
      else:
        message = handle_message(chat_event)
      return { "hostAppDataAction": { "chatDataAction": { "createMessageAction": {
          "message": message
      }}}}
    
    def handle_app_command(event: Mapping[str, Any]) -> Mapping[str, Any]:
      """Responds to an APP_COMMAND event in Google Chat.
    
      Args:
        Mapping[str, Any] event: the event object from Google Chat
    
      Returns:
        Mapping[str, Any]: the response message object.
      """
      if event["appCommandPayload"]["appCommandMetadata"]["appCommandId"] == ABOUT_COMMAND_ID:
        return {
          "text": "The Avatar app replies to Google Chat messages.",
        }
      return {}
    
    def handle_message(event: Mapping[str, Any]) -> Mapping[str, Any]:
      """Responds to a MESSAGE event in Google Chat.
    
      Args:
        Mapping[str, Any] event: the event object from Google Chat
    
      Returns:
        Mapping[str, Any]: the response message object.
      """
      # Stores the Google Chat user as a variable.
      chat_user = event["messagePayload"]["message"]["sender"]
      display_name = chat_user.get("displayName", "")
      avatar_url = chat_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 }},
            ]}]
          }
        }]
      }
    1. Cliquez sur Enregistrer et redéployer.

Java

  1. Dans la console Google Cloud, accédez à la page Cloud Run :

    Accédez à Cloud Run

    Assurez-vous que le projet de votre application Chat est sélectionné.

  2. Cliquez sur Écrire une fonction.

  3. Sur la page Créer un service, configurez votre fonction :

    1. Dans le champ Service name (Nom du compte de service), saisissez addonchatapp.
    2. Dans la liste Région, sélectionnez une région.
    3. Dans la liste Runtime (Environnement d'exécution), sélectionnez la version la plus récente de Java.
    4. Dans la section Authentification, sélectionnez Exiger l'authentification.
    5. Cliquez sur Créer et attendez que Cloud Run crée le service. La console vous redirige vers l'onglet Source.
  4. Dans l'onglet Source :

    1. Dans Point d'entrée, supprimez le texte par défaut et saisissez App.
    2. Renommez le fichier Java par défaut en src/main/java/com/google/chat/avatar/App.java.
    3. Remplacez le contenu du fichier App.java par le code suivant :
    java/chat/avatar-app/src/main/java/com/google/chat/avatar/App.java
    package com.google.chat.avatar;
    
    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 App implements HttpFunction {
      // The ID of the slash command "/about".
      // You must use the same ID in the Google Chat API configuration.
      private static final int ABOUT_COMMAND_ID = 1;
    
      private static final Gson gson = new Gson();
    
      /**
       * Handle requests from Google Workspace add on
       * 
       * @param request the request sent by Google Chat
       * @param response the response to be sent back to Google Chat
       */
      @Override
      public void service(HttpRequest request, HttpResponse response) throws Exception {
        JsonObject event = gson.fromJson(request.getReader(), JsonObject.class);
        JsonObject chatEvent = event.getAsJsonObject("chat");
        Message message;
        if (chatEvent.has("appCommandPayload")) {
          message = handleAppCommand(chatEvent);
        } else {
          message = handleMessage(chatEvent);
        }
        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));
      }
    
      /**
       * Handles an APP_COMMAND event in Google Chat.
       *
       * @param event the event object from Google Chat
       * @return the response message object.
       */
      private Message handleAppCommand(JsonObject event) throws Exception {
        switch (event.getAsJsonObject("appCommandPayload")
          .getAsJsonObject("appCommandMetadata").get("appCommandId").getAsInt()) {
          case ABOUT_COMMAND_ID:
            return new Message()
              .setText("The Avatar app replies to Google Chat messages.");
          default:
            return null;
        }
      }
    
      /**
       * Handles a MESSAGE event in Google Chat.
       *
       * @param event the event object from Google Chat
       * @return the response message object.
       */
      private Message handleMessage(JsonObject event) throws Exception {
        // Stores the Google Chat user as a variable.
        JsonObject chatUser = event.getAsJsonObject("messagePayload").getAsJsonObject("message").getAsJsonObject("sender");
        String displayName = chatUser.has("displayName") ? chatUser.get("displayName").getAsString() : "";
        String avatarUrl = chatUser.has("avatarUrl") ? chatUser.get("avatarUrl").getAsString() : "";
        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)))))))));
      }
    }
  5. Remplacez le contenu du fichier pom.xml par le code suivant :

    java/chat/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>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.1.4</version>
        </dependency>
        <dependency>
          <groupId>com.google.code.gson</groupId>
          <artifactId>gson</artifactId>
          <version>2.9.1</version>
        </dependency>
        <dependency>
          <groupId>com.google.apis</groupId>
          <artifactId>google-api-services-chat</artifactId>
          <version>v1-rev20230115-2.0.0</version>
        </dependency>
      </dependencies>
    
      <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>
    1. Cliquez sur Enregistrer et redéployer.

La page d'informations du service Cloud Run s'ouvre. Attendez que la fonction soit déployée.

Configurer le module complémentaire

Une fois la fonction Cloud Run déployée, procédez comme suit pour créer un module complémentaire et déployer l'application Google Chat :

  1. Dans la console Google Cloud, accédez à la page Cloud Run :

    Accédez à Cloud Run

    Vérifiez que le projet pour lequel vous avez activé Cloud Run est sélectionné.

  2. Dans la liste des fonctions, cliquez sur addonchatapp.

  3. Sur la page Détails du service, copiez l'URL de la fonction. L'URL se termine par run.app.

  4. Dans le champ de recherche Google Cloud, recherchez "API Google Chat", puis cliquez sur API Google Chat et sur Gérer.

    Accéder à l'API Chat

  5. Cliquez sur Configuration et configurez l'application Google Chat :

    1. Dans le champ Nom de l'application, saisissez Add-on Chat app.
    2. Dans URL de l'avatar, saisissez https://developers.google.com/workspace/add-ons/images/quickstart-app-avatar.png.
    3. Dans Description, saisissez Add-on Chat app.
    4. Sous Fonctionnalité, sélectionnez Rejoindre des espaces et des conversations de groupe.
    5. Sous Paramètres de connexion, sélectionnez URL du point de terminaison HTTP.
    6. Copiez l'adresse e-mail du compte de service. Vous aurez besoin de cette adresse e-mail lorsque vous autoriserez votre module complémentaire à appeler votre fonction.
    7. Sous Déclencheurs, sélectionnez Utiliser une URL de point de terminaison HTTP commune pour tous les déclencheurs, puis collez l'URL du déclencheur de fonction Cloud Run dans la zone de texte.
    8. Sous Visibilité, sélectionnez Rendre cette application Google Chat accessible à certains utilisateurs et groupes de votre domaine, puis saisissez votre adresse e-mail.
    9. Sous Journaux, sélectionnez Enregistrer les erreurs dans Logging.
  6. Cliquez sur Enregistrer.

Ensuite, autorisez l'application Chat à appeler la fonction Cloud Run.

Autoriser Google Chat à appeler votre fonction

Pour autoriser le module complémentaire Google Workspace à appeler votre fonction, ajoutez le compte de service du module complémentaire Google Workspace avec le rôle Demandeur de service Cloud Run.

  1. Dans la console Google Cloud, accédez à la page Cloud Run :

    Accédez à Cloud Run

  2. Dans la liste des services Cloud Run, cochez la case en regard de la fonction de réception. (Ne cliquez pas directement sur la fonction.)

  3. Cliquez sur Autorisations. Le panneau Autorisations s'ouvre.

  4. Cliquez sur Ajouter un compte principal.

  5. Dans Nouveaux comptes principaux, saisissez l'adresse e-mail du compte de service du module complémentaire Google Workspace associé à votre application Chat.

    L'adresse e-mail du compte de service se trouve sur la page de configuration de l'API Chat, sous Paramètres de connexion > URL du point de terminaison HTTP > Adresse e-mail du compte de service :

    Accéder à la configuration de l'API Chat

  6. Dans Sélectionner un rôle, sélectionnez Cloud Run > Demandeur de service Cloud Run.

  7. Cliquez sur Enregistrer.

L'application Chat est prête à recevoir des messages et à y répondre.

Tester votre application Chat

Pour tester votre application Chat, ouvrez un espace de message privé avec l'application Chat et envoyez un message :

  1. Ouvrez Google Chat avec le compte Google Workspace que vous avez fourni lorsque vous vous êtes ajouté en tant que testeur de confiance.

    Accéder à Google Chat

  2. Cliquez sur Nouveau chat.
  3. Dans le champ Ajouter une ou plusieurs personnes, saisissez le nom de votre application Chat.
  4. Sélectionnez votre application Chat dans les résultats. Un message privé s'ouvre.

  5. Dans le nouveau message privé contenant l'application, saisissez Hello, puis appuyez sur enter.

Le message de l'application Chat contient une fiche qui affiche le nom et l'avatar de l'expéditeur, comme illustré dans l'image suivante :

Application de chat répondant avec une fiche comportant le nom à afficher et l&#39;image d&#39;avatar de l&#39;expéditeur

Pour ajouter des testeurs de confiance et en savoir plus sur les tests de fonctionnalités interactives, consultez Tester les fonctionnalités interactives pour les applications Google Chat.

Résoudre les problèmes

Lorsqu'une application ou une fiche Google Chat renvoie une erreur, l'interface Chat affiche le message "Une erreur s'est produite". ou "Impossible de traiter votre demande". Il arrive que l'interface utilisateur de Chat n'affiche aucun message d'erreur, mais que l'application ou la fiche Chat produise un résultat inattendu (par exemple, un message de fiche peut ne pas s'afficher).

Bien qu'un message d'erreur ne s'affiche pas dans l'UI Chat, des messages d'erreur descriptifs et des données de journaux sont disponibles pour vous aider à corriger les erreurs lorsque la journalisation des erreurs pour les applications Chat est activée. Pour obtenir de l'aide concernant l'affichage, le débogage et la correction des erreurs, consultez Résoudre les problèmes et corriger les erreurs Google Chat.

Effectuer un nettoyage

Pour éviter que les ressources utilisées dans ce tutoriel soient facturées sur votre compte Google Cloud, nous vous recommandons de supprimer le projet Cloud.

  1. Dans la console Google Cloud, accédez à la page Gérer les ressources. Cliquez sur Menu > IAM et administration > Gérer les ressources.

    Accéder au gestionnaire de ressources

  2. Dans la liste des projets, sélectionnez celui que vous souhaitez supprimer, puis cliquez sur Supprimer .
  3. Dans la boîte de dialogue, saisissez l'ID du projet, puis cliquez sur Arrêter pour supprimer le projet.