Receber e responder a interações do usuário

Nesta página, descrevemos como seu app do Google Chat pode receber e responder às interações dos usuários no Google Chat.

Para criar interfaces interativas para apps de chat, use os seguintes componentes:

  • Gatilhos: as maneiras como os usuários do Google Chat podem invocar um app do Chat, como adicionar a um espaço ou enviar uma mensagem.
  • Objetos de evento: os dados que os apps de chat recebem de acionadores ou interações da interface.
  • Ações: as maneiras como os apps de chat podem responder a interações, como enviar mensagens ou retornar uma interface do usuário baseada em cards.
O app do Chat recebe um objeto de evento de um gatilho "Adicionado ao espaço"
Figura 1: quando um usuário adiciona um app do Chat a um espaço, o gatilho Adicionado ao espaço é acionado e envia um objeto de evento. Para responder com uma mensagem, o app Chat processa o objeto de evento e retorna uma ação que cria a mensagem.

Os apps de chat podem criar e mostrar interfaces das seguintes maneiras:

Pré-requisitos

Como funcionam as interações do usuário

Quando um usuário interage com um app do Chat, o Google Chat invoca um gatilho configurado e envia um objeto de evento ao endpoint ou função do app do Chat. O app Chat processa o objeto de evento e pode retornar uma ação de forma síncrona em até 30 segundos ou responder de forma assíncrona usando a API do Chat.

O diagrama a seguir demonstra como os apps do Google Chat processam e respondem às interações do usuário:

Arquitetura de como os apps do Google Chat processam as interações do usuário.

Gatilhos

Os gatilhos são as maneiras específicas que os usuários invocam um app do Chat usando a interface do Chat, como @menções ou comandos de apps.

A tabela a seguir mostra os gatilhos do Chat, uma descrição e como os apps do Chat normalmente respondem:

Gatilho Descrição Resposta típica
Adicionado ao espaço

Um usuário adiciona o app do Chat a um espaço ou um administrador do Google Workspace instala o app do Chat em espaços de mensagens diretas para usuários na organização. Para saber mais sobre os apps do Chat instalados por administradores, consulte Instalar apps do Marketplace no seu domínio na documentação da Central de Ajuda do Admin do Google Workspace.

O app Chat envia uma mensagem de integração que explica o que ele faz e como os usuários no espaço podem interagir com ele.
Mensagem

Um usuário interage com o app Chat em uma mensagem de uma das seguintes maneiras:

  • Envia uma mensagem em um espaço de mensagem direta com o app Chat.
  • @menciona o app do Chat em qualquer tipo de espaço.
  • Envia uma mensagem que contém um link que corresponde ao padrão do URL para prévia de links.
  • Digita texto no menu de multisseleção de um widget selectionInput.
O app Chat responde com base no conteúdo da mensagem. Por exemplo, um app de chat responde com uma mensagem, anexa um card de prévia de link ou sugere itens em um menu de seleção múltipla.
Removido do espaço

Um usuário remove o app Chat de um espaço ou um administrador do Google Workspace desinstala o app Chat para um usuário na organização.

Os usuários não podem remover apps do Chat instalados pelo administrador. Se um usuário já tiver instalado o app Chat, ele permanecerá instalado, mesmo que um administrador do Google Workspace tente desinstalá-lo.

O app Chat remove todas as notificações recebidas configuradas para o espaço, como a exclusão de um webhook, e limpa qualquer armazenamento interno. Os apps de chat não podem responder com mensagens a esse gatilho porque não fazem mais parte do espaço.
Comando do app

Um usuário invoca um comando do app Chat (como um comando de barra, um comando rápido ou uma ação de mensagem).

O app Chat responde ao comando. Por exemplo, ele responde com uma mensagem ou abre uma caixa de diálogo.
App Home

Um usuário abre a guia Início em uma mensagem direta individual com o app Chat ou interage com um widget no card da página inicial.

O app Chat retorna um objeto RenderActions que envia um card da página inicial (pushCard) ou atualiza o card da página inicial exibido (updateCard).

Configure os endpoints ou as funções de callback desses gatilhos no console do Google Cloud, na página Configuração da API Chat. Para instruções detalhadas, consulte Configurar a API Google Chat.

Configurar comandos iniciais

Os comandos iniciais ajudam os usuários a descobrir a funcionalidade do seu app Chat quando eles abrem uma mensagem direta individual vazia com o app. É possível configurar até três comandos iniciais.

Para adicionar e configurar comandos de ativação:

  1. No console do Google Cloud, acesse a página Configuração da API Chat:

    Acessar a página de configuração da API Chat

  2. Em Recursos interativos, encontre Comandos iniciais e clique em Adicionar um comando.

  3. No campo Classificação (1 a 3), insira um número de 1 a 3 para especificar a ordem de exibição.

  4. Em Seleção de tipo, escolha como o comando vai se comportar:

    • Comando de texto: preenche a barra de criação com texto predefinido quando o usuário clica no ícone de comando.
    • Prompt de comando: executa um comando de barra ou rápido registrado quando clicado. Não é possível selecionar comandos que exigem argumentos adicionais.
  5. Configure o comando com base na sua seleção de tipo:

    • Se você selecionou "Comando de texto":

      1. Em Título, insira o título do comando exibido no ícone (até 30 caracteres).
      2. Em Texto do comando, insira o texto preenchido na barra de escrita (até 60 caracteres).
      3. Opcional: adicione títulos e textos localizados para usuários em outros idiomas:
      4. Em Comandos localizados, clique em Adicionar um idioma.
      5. Em Idioma, selecione uma opção no menu suspenso.
      6. Em Título localizado, insira o título localizado (até 30 caracteres).
      7. Em Texto do comando localizado, insira o texto do comando localizado (até 60 caracteres).
      8. Repita para adicionar mais idiomas conforme necessário.
    • Se você selecionou "Prompt de comando":

      1. Em Comando de barra / Comando rápido, selecione o comando no menu suspenso.
  6. Clique em Concluído e depois em Salvar na parte de baixo da página.

Processar novas tentativas de chamadas HTTP para seu serviço

Se uma solicitação HTTPS para seu serviço falhar (como um tempo limite, uma falha temporária de rede ou um código de status HTTPS não 2xx), o Google Chat poderá tentar fazer a entrega algumas vezes em alguns minutos, mas isso não é garantido. Como resultado, um app de chat pode receber o mesmo evento algumas vezes em determinadas situações. Se a solicitação for concluída, mas retornar uma carga útil de resposta inválida, o Google Chat não vai tentar de novo.

Objetos de evento

Os apps de chat recebem objetos de evento quando um acionador do Chat é executado ou quando os usuários do Chat interagem com uma interface do app (por exemplo, clicando em um botão ou enviando uma caixa de diálogo). O objeto de evento permite usar dados de interação para responder ou atualizar uma interface.

Payloads de objetos de evento

Cada objeto de evento do Chat inclui um commonEventObject com detalhes do host e da plataforma (hostApp: "CHAT", clientPlatform, userLocale, userTimezone, parameters e formInputs) e um objeto chat que contém contexto específico do Chat:

  • Para um gatilho de página inicial do app (quando um usuário abre a guia Início em uma mensagem direta individual com o app Chat), o objeto chat contém chat.user e chat.eventTime sem um campo de união payload. Quando um usuário clica em um botão no card da página inicial, o objeto de evento inclui chat.buttonClickedPayload junto com commonEventObject.parameters (e commonEventObject.formInputs se o card tiver entradas de formulário).
  • Para interações de espaço e mensagem (Adicionado ao espaço, Mensagem, Removido do espaço, Comando do app ou interações de botão e widget), o objeto chat inclui chat.user, chat.space, chat.eventTime e o payload de interação correspondente:
    • messagePayload: contém o space, message e configCompleteRedirectUri quando um usuário envia uma mensagem.
    • addedToSpacePayload: contém space, interactionAdd e configCompleteRedirectUri quando o app do Chat é adicionado a um espaço.
    • removedFromSpacePayload: contém o space quando o app do Chat é removido de um espaço.
    • buttonClickedPayload: contém space, message, isDialogEvent e dialogEventType quando um usuário clica em um botão em um card ou caixa de diálogo.
    • widgetUpdatedPayload: contém o space quando um usuário interage com um widget, como digitar em um menu de seleção múltipla com uma fonte de dados externa.
    • appCommandPayload: contém space, message, appCommandMetadata, isDialogEvent, dialogEventType e configCompleteRedirectUri quando um usuário invoca um comando de app.

Para saber mais sobre objetos de evento de complementos no Chat e em outros aplicativos do Google Workspace, consulte Objetos de evento.

Entregar uma resposta

Esta seção explica como os apps do Chat usam ações para responder de forma síncrona às interações do usuário.

Para responder com uma ação, um app do Chat precisa responder em até 30 segundos, e a resposta precisa ser aplicada ao espaço em que a interação ocorreu. Essas respostas síncronas não exigem autenticação. Se o app do Chat precisar de mais de 30 segundos ou agir fora do espaço, configure a autenticação e responda de forma assíncrona usando a API Google Chat.

Para responder às interações do usuário de forma síncrona, seu app de chat processa o objeto de evento recebido e retorna um dos seguintes objetos JSON:

A tabela a seguir mostra como os apps do Chat podem responder com ações. Os apps do Chat podem retornar objetos JSON diretamente ou criar a resposta usando AddOnResponseService e CardService do Apps Script.

Resposta do app de chat Ação necessária para retornar (JSON) Ação necessária para retornar (Apps Script)
Enviar uma mensagem ou atualizar uma mensagem. DataActions (createMessageAction ou updateMessageAction) DataActionsResponse
Visualizar links em mensagens enviadas por usuários do Chat em um espaço. DataActions (updateInlinePreviewAction) DataActionsResponse
Renderizar ou atualizar uma página inicial na guia Início de uma mensagem direta. RenderActions (pushCard ou updateCard) ActionResponse
Abrir, atualizar ou fechar uma caixa de diálogo. RenderActions (pushCard, updateCard ou endNavigation: "CLOSE_DIALOG"); ActionResponse
Para coletar informações de um card ou caixa de diálogo, sugira itens de seleção com base no que os usuários digitam em um menu de seleção múltipla. RenderActions (modifyCard) ActionResponse
Solicite configuração ou autorização para um serviço externo. AuthorizationError (basic_authorization_prompt) AuthorizationException

Enviar uma mensagem

Os apps de chat podem responder com uma mensagem a qualquer um dos seguintes gatilhos ou interações:

  • Gatilhos demensagens, como quando os usuários mencionam com @ou enviam mensagens diretas para um app do Chat.
  • Acionadores de "Adicionado ao espaço", como quando os usuários instalam o app Chat no Google Workspace Marketplace ou o adicionam a um espaço.
  • Comandos de app acionam, por exemplo, quando os usuários invocam um comando de barra ou um comando rápido.
  • Cliques em botões de cards em mensagens ou caixas de diálogo. Por exemplo, quando os usuários inserem informações e clicam em "Enviar".

Os apps de chat podem incluir qualquer um dos seguintes elementos em uma mensagem:

  • Texto que contém hiperlinks, @menções e emojis. Consulte Formatar mensagens.
  • Um ou mais cards, que podem aparecer em uma mensagem ou abrir em uma nova janela como uma caixa de diálogo. Consulte Criar cards para apps do Google Chat.
  • Um ou mais widgets de acessórios, que são botões que aparecem depois de qualquer texto ou cards em uma mensagem.

Para responder com uma mensagem, retorne DataActions com um objeto CreateMessageAction:

{
  "hostAppDataAction": {
    "chatDataAction": {
      "createMessageAction": {
        "message": <var>MESSAGE</var>
      }
    }
  }
}

Substitua MESSAGE por um recurso Message da API Chat.

No exemplo a seguir, um app do Chat cria e envia uma mensagem de texto de integração sempre que é adicionado a um espaço respondendo ao gatilho Adicionado ao espaço com DataActions:

Node.js

/**
 * Sends an onboarding message when the Chat app is added to a space.
 *
 * @param {Object} req The request object from Google Chat.
 * @param {Object} res The response object from the Chat app.
 */
exports.cymbalApp = function cymbalApp(req, res) {
  const chatEvent = req.body.chat;
  // Send an onboarding message when added to a Chat space
  if (chatEvent.addedToSpacePayload) {
    res.json({ hostAppDataAction: { chatDataAction: { createMessageAction: { message: {
      text: 'Hi, Cymbal at your service. I help you manage your calendar ' +
        'from Google Chat. Take a look at your schedule today by typing ' +
        '`/checkCalendar`, or schedule a meeting with `/scheduleMeeting`. ' +
        'To learn what else I can do, type `/help`.'
    }}}}});
  }
};

Python

from flask import Flask, request, json
app = Flask(__name__)

@app.route('/', methods=['POST'])
def cymbal_app():
  """Sends an onboarding message when the Chat app is added to a space.

  Returns:
    Mapping[str, Any]: The response object from the Chat app.
  """
  chat_event = request.get_json()["chat"]
  if "addedToSpacePayload" in chat_event:
    return json.jsonify({ "hostAppDataAction": { "chatDataAction": {
      "createMessageAction": { "message": {
        "text": 'Hi, Cymbal at your service. I help you manage your calendar ' +
        'from Google Chat. Take a look at your schedule today by typing ' +
        '`/checkCalendar`, or schedule a meeting with `/scheduleMeeting`. ' +
        'To learn what else I can do, type `/help`.'
      }}
    }}})

Java

@SpringBootApplication
@RestController
public class App {
  public static void main(String[] args) {
    SpringApplication.run(App.class, args);
  }

  /*
   * Sends an onboarding message when the Chat app is added to a space.
   *
   * @return The response object from the Chat app.
   */
  @PostMapping("/")
  @ResponseBody
  public GenericJson onEvent(@RequestBody JsonNode event) throws Exception {
    JsonNode chatEvent = event.at("/chat");
    if (!chatEvent.at("/addedToSpacePayload").isEmpty()) {
      return new GenericJson() { {
        put("hostAppDataAction", new GenericJson() { {
          put("chatDataAction", new GenericJson() { {
            put("createMessageAction", new GenericJson() { {
              put("message", new Message().setText(
                "Hi, Cymbal at your service. I help you manage your calendar " +
                "from Google Chat. Take a look at your schedule today by typing " +
                "`/checkCalendar`, or schedule a meeting with `/scheduleMeeting`. " +
                "To learn what else I can do, type `/help`."
              ));
            } });
          } });
        } });
      } };
    }
    return new GenericJson();
  }
}

Apps Script

/**
 * Sends an onboarding message when the Chat app is added to a space.
 *
 * @param {Object} event The event object from Google Chat.
 * @return {Object} Response from the Chat app.
 */
function onAddedToSpace(event) {
  return { hostAppDataAction: { chatDataAction: { createMessageAction: { message: {
    text: 'Hi, Cymbal at your service. I help you manage your calendar ' +
          'from Google Chat. Take a look at your schedule today by typing ' +
          '`/checkCalendar`, or schedule a meeting with `/scheduleMeeting`. ' +
          'To learn what else I can do, type `/help`.'
  }}}}};
}

O exemplo de código retorna a seguinte mensagem de texto:

Exemplo de mensagem de integração.

Atualizar uma mensagem

Os apps de chat também podem atualizar as mensagens enviadas. Por exemplo, um app do Chat pode atualizar uma mensagem depois que um usuário envia uma caixa de diálogo ou clica em um botão em um card em uma mensagem.

Para atualizar uma mensagem do app do Chat em resposta a uma interação, retorne DataActions com um UpdateMessageAction:

{
  "hostAppDataAction": {
    "chatDataAction": {
      "updateMessageAction": {
        "message": <var>MESSAGE</var>
      }
    }
  }
}

Substitua MESSAGE por um recurso Message da API Chat.

Os apps do Chat também podem atualizar uma mensagem enviada por um usuário para anexar um card de prévia de link usando updateInlinePreviewAction. Para mais detalhes, consulte Links de visualização.

Responder de forma assíncrona usando a API Google Chat

Em vez de retornar uma ação de forma síncrona, os apps do Chat podem precisar chamar a API Google Chat para responder a uma interação ou enviar mensagens proativas. Por exemplo, os apps do Chat precisam chamar a API Google Chat para fazer o seguinte:

  • Responder a uma interação após 30 segundos (por exemplo, depois de concluir uma tarefa de longa duração).
  • Enviar mensagens em uma programação ou notificações sobre mudanças em recursos externos.
  • Realizar tarefas fora do espaço em que a interação ocorreu.
  • Realizar tarefas no Chat que não estão disponíveis como ações síncronas, como listar espaços ou adicionar participantes a um espaço.
  • Realizar tarefas em nome de um usuário do Chat (o que exige autenticação do usuário).

Ao responder a uma interação após 30 segundos, para evitar uma mensagem de erro voltada ao usuário informando que o app Chat não está respondendo, você precisa confirmar o recebimento do objeto de evento em até 30 segundos retornando uma resposta vazia:

Node.js

async function onEvent(req, res) {
  // Trigger asynchronous job that will respond using the Google Chat API.
  ...

  // Respond with an empty response to the Google Chat platform.
  return res.send({});
};

Python

def on_event(event) -> dict:
  # Trigger asynchronous job that will respond using the Google Chat API.
  ...

  // Respond with an empty response to the Google Chat platform.
  return {}

Java

public String onEvent(JsonNode event) {
  // Trigger asynchronous job that will respond using the Google Chat API.
  ...

  // Respond with an empty response to the Google Chat platform.
  return "{}";
}

Apps Script

function onEvent(event) {
  // Trigger asynchronous job that will respond using the Google Chat API.
  ...

  // Respond with an empty response to the Google Chat platform.
  return null;
}

Para enviar uma mensagem usando a API Chat, configure a autenticação e chame o método spaces.messages.create. Para ver as etapas, consulte Enviar uma mensagem. Para guias sobre como usar outros métodos da API Chat, consulte a visão geral da API Chat.

Apps de chat que não são complementos: recebem e respondem às interações do usuário

Os apps de chat que não são complementos do Google Workspace recebem eventos de interação da API Chat (Event) em vez de objetos de evento de complementos do Google Workspace (EventObject) e respondem retornando um recurso Message em vez de uma ação.

Para fazer upgrade de um app do Chat que não é um complemento para a estrutura de complementos do Google Workspace, consulte Converter um app do Google Chat em um complemento do Google Workspace.

Tipos de eventos de interação

Para cada tipo de interação do usuário, o Google Chat envia a um app de chat que não é um complemento um objeto Event cujo tipo é representado pelo campo eventType:

Interação do usuário eventType Resposta típica de um app de chat que não é um complemento
Um usuário envia uma mensagem para um app do Chat. Por exemplo, ele @menciona o app do Chat ou usa um comando de barra. MESSAGE O app Chat responde com base no conteúdo da mensagem. Por exemplo, um app do Chat responde ao comando de barra /about com uma mensagem que explica as tarefas que ele pode realizar.
Um usuário adiciona um app do Chat a um espaço. ADDED_TO_SPACE O app Chat envia uma mensagem de integração que explica o que ele faz e como os usuários no espaço podem interagir com ele.
Um usuário remove um app do Chat de um espaço. REMOVED_FROM_SPACE O app Chat remove todas as notificações recebidas configuradas para o espaço (como excluir um webhook) e limpa qualquer armazenamento interno.
Um usuário clica em um botão em um card de uma mensagem do app, caixa de diálogo ou página inicial do app Google Chat. CARD_CLICKED O app Chat processa e armazena os dados enviados pelo usuário ou retorna outro card.
Um usuário abre a página inicial do app Chat clicando na guia Página inicial em uma mensagem individual. APP_HOME O app Chat retorna um card estático ou interativo da página inicial.
Um usuário envia um formulário na página inicial do app Chat. SUBMIT_FORM O app Chat processa e armazena os dados enviados pelo usuário ou retorna outro card.
Um usuário invoca um comando usando um comando rápido. APP_COMMAND O app Chat responde com base no comando que foi invocado. Por exemplo, um app do Chat responde ao comando Sobre com uma mensagem que explica as tarefas que o app pode realizar.

Para conferir todos os eventos de interação compatíveis e exemplos de payloads JSON, consulte Tipos de eventos de interação do app do Chat e a documentação de referência do EventType.

Eventos de interação de caixas de diálogo

Se o app do Chat que não é um complemento abrir caixas de diálogo, o evento de interação vai conter as seguintes informações adicionais que você pode usar para processar uma resposta:

  • O campo isDialogEvent está definido como true.
  • O DialogEventType (REQUEST_DIALOG, SUBMIT_DIALOG ou CANCEL_DIALOG) esclarece se a interação abre ou fecha uma caixa de diálogo ou envia informações de uma caixa de diálogo.

Configurar um app do Chat que não seja um complemento para receber eventos de interação

  1. No console do Google Cloud, acesse a página Configuração da API Chat:

    Acessar a página de configuração da API Chat

  2. Em Recursos interativos, desmarque Criar este app de chat como um complemento do Google Workspace e configure Funcionalidade, um único endpoint de Configurações de conexão (URL do endpoint HTTP, Apps Script, nome do tópico do Cloud Pub/Sub ou Dialogflow), Comandos, Comandos iniciais, Prévias de links e Visibilidade.

  3. Clique em Salvar.

Responder com uma mensagem em um app de chat que não seja um complemento

Para responder de forma síncrona em um app de chat que não é um complemento, retorne um objeto Message diretamente. O exemplo a seguir responde a um evento de interação ADDED_TO_SPACE com uma mensagem de texto:

Node.js

/**
 * Sends an onboarding message when the Chat app is added to a space.
 *
 * @param {Object} req The event object from Chat API.
 * @param {Object} res The response object from the Chat app.
 */
exports.cymbalApp = function cymbalApp(req, res) {
  // Send an onboarding message when added to a Chat space
  if (req.body.type === 'ADDED_TO_SPACE') {
    res.json({
      'text': 'Hi, Cymbal at your service. I help you manage your calendar ' +
        'from Google Chat. Take a look at your schedule today by typing ' +
        '`/checkCalendar`, or schedule a meeting with `/scheduleMeeting`. To ' +
        'learn what else I can do, type `/help`.'
    });
  }
};

Python

from flask import Flask, request, json
app = Flask(__name__)

@app.route('/', methods=['POST'])
def cymbal_app():
  """Sends an onboarding message when the Chat app is added to a space.

  Returns:
    Mapping[str, Any]: The response object from the Chat app.
  """
  event = request.get_json()
  if event['type'] == 'ADDED_TO_SPACE':
    return json.jsonify({
      'text': 'Hi, Cymbal at your service. I help you manage your calendar ' +
      'from Google Chat. Take a look at your schedule today by typing ' +
      '`/checkCalendar`, or schedule a meeting with `/scheduleMeeting`. To ' +
      'learn what else I can do, type `/help`.'
    })
  return json.jsonify({})

Java

@SpringBootApplication
@RestController
public class App {
  public static void main(String[] args) {
    SpringApplication.run(App.class, args);
  }

  /*
   * Sends an onboarding message when the Chat app is added to a space.
   *
   * @return The response object from the Chat app.
   */
  @PostMapping("/")
  @ResponseBody
  public Message onEvent(@RequestBody JsonNode event) {
    switch (event.get("type").asText()) {
      case "ADDED_TO_SPACE":
        return new Message().setText(
          "Hi, Cymbal at your service. I help you manage your calendar " +
          "from Google Chat. Take a look at your schedule today by typing " +
          "`/checkCalendar`, or schedule a meeting with `/scheduleMeeting`. " +
          "To learn what else I can do, type `/help`.");
      default:
        return new Message();
    }
  }
}

Apps Script

/**
 * Sends an onboarding message when the Chat app is added to a space.
 *
 * @param {Object} event The event object from Chat API.
 * @return {Object} Response from the Chat app.
 */
function onAddToSpace(event) {
  return {
    'text': 'Hi, Cymbal at your service. I help you manage your calendar ' +
      'from Google Chat. Take a look at your schedule today by typing ' +
      '`/checkCalendar`, or schedule a meeting with `/scheduleMeeting`. To learn ' +
      'what else I can do, type `/help`.'
  };
}