Receber e responder a interações com o app Google Chat

Esta página descreve como o app do Google Chat pode receber e responder às interações do usuário, também conhecidas como eventos de interação com o app do Google Chat.

Um evento de interação com o app do Google Chat representa qualquer ação realizada por um usuário para invocar ou interagir com esse app, como @mencionar um app do Chat ou adicioná-lo a um espaço. Quando os usuários interagem com um app do Chat, o Google Chat envia um evento de interação a ele. O app do Chat pode usar o evento para processar a interação e criar uma resposta.

Por exemplo, os apps de chat usam eventos de interação para:

Exemplo de um evento de interação Resposta típica de um app de chat
Um usuário invoca um app de chat @mencionando-o ou usando um comando de barra. O app do Chat processa o que a mensagem diz para criar uma mensagem. Por exemplo, um app do Chat responde ao comando /about com uma mensagem que explica as tarefas que ele pode realizar.
Um usuário adiciona um app do Chat a um espaço. O app do 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. O app do Chat remove todas as notificações recebidas configuradas para o espaço (como a exclusão de um webhook) e limpa qualquer armazenamento interno.
Um usuário clica em um botão em um card ou em uma caixa de diálogo enviada pelo app do Chat. O app do Chat processa e armazena todos os dados enviados pelo usuário ou retorna outro card ou caixa de diálogo.

Para cada tipo de interação do usuário, o Google Chat envia um tipo diferente de evento de interação. Por exemplo, o Google Chat usa o tipo de evento MESSAGE para qualquer interação em que um usuário invoque o app do Chat em uma mensagem. Para mais detalhes, consulte Tipos de eventos de interação no app Google Chat.

Esta página explica como fazer o seguinte:

  • Configure seu app do Chat para receber eventos.
  • Processe o evento de interação na infraestrutura.
  • Se apropriado, responda aos eventos de interação.

Receber eventos de interação no app do Chat

Esta seção descreve como receber e processar eventos de interação para seu app do Chat.

Configurar o app do Chat para receber eventos de interação

Nem todos os apps do Chat são interativos. Por exemplo, os webhooks de entrada só podem enviar mensagens de saída e não podem responder aos usuários. Se você estiver criando um app do Chat interativo, escolha um endpoint que permita que o app do Chat receba, processe e responda a eventos de interação. Para saber mais sobre como projetar seu app do Chat, consulte Arquiteturas de implementação de apps do Chat.

Se você criou um app do Chat interativo, configure a API Google Chat para que ele possa enviar eventos de interação:

  1. No console do Google Cloud, abra a página da API Google Chat:

    Acessar a página da API Google Chat

  2. Clique na guia Configuração.
  3. Na seção Recursos interativos, clique no botão Ativar recursos interativos para ativar o recurso.
  4. Em Funcionalidade, marque uma ou ambas as caixas de seleção a seguir:
    1. Receber mensagens individuais: permite que os usuários interajam com seu app do Chat em espaços de mensagens diretas (DM). Seu app do Chat recebe eventos de interação sempre que um usuário envia uma mensagem no espaço de mensagens diretas.
    2. Participar de espaços e conversas em grupo: permite que os usuários adicionem e removam seu app do Chat de espaços com mais de uma pessoa. O app do Chat recebe eventos de interação sempre que é adicionado ou removido do espaço e sempre que os usuários @mencionam ou usam um comando de barra no espaço.
  5. Em Configurações de conexão, especifique para onde o Google Chat envia eventos de interação no app do Chat.
  6. Opcional: em comandos de barra, adicione e configure um ou mais comandos de barra. Para mais informações, consulte Configurar comandos de barra.
  7. Opcional: em Visualizações de links, adicione e configure um ou mais padrões do URL que o app do Chat visualiza. Para mais informações, consulte Visualizar links.
  8. Clique em Salvar.

Seu app do Chat agora está configurado para receber eventos de interação do Google Chat.

Autenticar solicitações do Google Chat

No caso de apps criados em endpoints HTTP, esta seção explica como verificar se as solicitações para o endpoint vêm do Google Chat.

Para enviar eventos de interação ao endpoint do app do Chat, o Google faz solicitações ao serviço. Para verificar se a solicitação vem do Google, o Google Chat inclui um token do portador no cabeçalho Authorization de cada solicitação HTTPS para o endpoint. Exemplo:

POST
Host: yourappurl.com
Authorization: Bearer AbCdEf123456
Content-Type: application/json
User-Agent: Google-Dynamite

A string AbCdEf123456 no exemplo acima é o token de autorização do portador. Esse é um token criptográfico produzido pelo Google. Você pode verificar seu token do portador usando uma biblioteca de cliente das APIs do Google de código aberto:

Para os tokens do portador enviados nas solicitações do Google Chat, o emissor é chat@system.gserviceaccount.com e o campo audience está definido como o número do projeto do Google Cloud que você usou para criar seu app do Chat. Por exemplo, se o número do projeto do Cloud do seu app do Chat for 1234567890, o campo audience no token do portador será 1234567890.

Se o token não for verificado para o app do Chat, seu serviço responderá à solicitação com um código de resposta HTTPS 401 (Unauthorized).

Java

import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.Collections;

import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken;
import com.google.api.client.googleapis.auth.oauth2.GoogleIdTokenVerifier;
import com.google.api.client.googleapis.auth.oauth2.GooglePublicKeysManager;
import com.google.api.client.http.apache.ApacheHttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.jackson.JacksonFactory;

/** Tool for verifying JWT Tokens for Apps in Google Chat. */
public class JWTVerify {
  // Bearer Tokens received by apps will always specify this issuer.
  static String CHAT_ISSUER = "chat@system.gserviceaccount.com";

  // Url to obtain the public certificate for the issuer.
  static String PUBLIC_CERT_URL_PREFIX =
      "https://www.googleapis.com/service_accounts/v1/metadata/x509/";

  // Intended audience of the token, which is the project number of the app.
  static String AUDIENCE = "1234567890";

  // Get this value from the request's Authorization HTTPS header.
  // For example, for "Authorization: Bearer AbCdEf123456" use "AbCdEf123456"
  static String BEARER_TOKEN = "AbCdEf123456";

  public static void main(String[] args) throws GeneralSecurityException, IOException {
    JsonFactory factory = new JacksonFactory();

    GooglePublicKeysManager.Builder keyManagerBuilder =
        new GooglePublicKeysManager.Builder(new ApacheHttpTransport(), factory);

    String certUrl = PUBLIC_CERT_URL_PREFIX + CHAT_ISSUER;
    keyManagerBuilder.setPublicCertsEncodedUrl(certUrl);

    GoogleIdTokenVerifier.Builder verifierBuilder =
        new GoogleIdTokenVerifier.Builder(keyManagerBuilder.build());
    verifierBuilder.setIssuer(CHAT_ISSUER);
    GoogleIdTokenVerifier verifier = verifierBuilder.build();

    GoogleIdToken idToken = GoogleIdToken.parse(factory, BEARER_TOKEN);
    if (idToken == null) {
      System.out.println("Token cannot be parsed");
      System.exit(-1);
    }

    // Verify valid token, signed by CHAT_ISSUER.
    if (!verifier.verify(idToken)
        || !idToken.verifyAudience(Collections.singletonList(AUDIENCE))
        || !idToken.verifyIssuer(CHAT_ISSUER)) {
      System.out.println("Invalid token");
      System.exit(-1);
    }

    // Token originates from Google and is targeted to a specific client.
    System.out.println("The token is valid");
  }
}

Python

import sys

from oauth2client import client

# Bearer Tokens received by apps will always specify this issuer.
CHAT_ISSUER = 'chat@system.gserviceaccount.com'

# Url to obtain the public certificate for the issuer.
PUBLIC_CERT_URL_PREFIX = 'https://www.googleapis.com/service_accounts/v1/metadata/x509/'

# Intended audience of the token, which will be the project number of the app.
AUDIENCE = '1234567890'

# Get this value from the request's Authorization HTTPS header.
# For example, for 'Authorization: Bearer AbCdEf123456' use 'AbCdEf123456'.
BEARER_TOKEN = 'AbCdEf123456'

try:
  # Verify valid token, signed by CHAT_ISSUER, intended for a third party.
  token = client.verify_id_token(
      BEARER_TOKEN, AUDIENCE, cert_uri=PUBLIC_CERT_URL_PREFIX + CHAT_ISSUER)

  if token['iss'] != CHAT_ISSUER:
    sys.exit('Invalid issuee')
except:
  sys.exit('Invalid token')

# Token originates from Google and is targeted to a specific client.
print 'The token is valid'

Processar novas tentativas de chamada 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 que não seja 2xx), o Google Chat poderá tentar entregar algumas vezes em alguns minutos, mas isso não é garantido. Como resultado, um app do Chat pode receber a mesma mensagem algumas vezes em determinadas situações. Se a solicitação for concluída com êxito, mas retornar um payload de mensagem inválido, o Google Chat não repetirá a solicitação.

Processar ou responder a eventos de interação

Esta seção explica como os apps do Google Chat podem processar e responder a eventos de interação.

Depois que seu app do Chat receber um evento de interação do Google Chat, ele poderá responder de várias maneiras. Em muitos casos, os apps interativos do Chat respondem ao usuário com uma mensagem. O app Google Chat também pode procurar algumas informações em uma fonte de dados, registrar as informações do evento de interação ou qualquer outra coisa. Esse comportamento de processamento é essencialmente o que define o app Google Chat.

Para cada evento de interação, os apps do Chat recebem um corpo da solicitação, que é o payload JSON que representa o evento. Use as informações para processar uma resposta. Para exemplos de payloads de eventos, consulte Tipos de eventos de interação com o app do Chat.

O diagrama a seguir demonstra como o app Google Chat normalmente processa ou responde a diferentes tipos de eventos de interação:

Arquitetura de como os apps do Google Chat processam eventos de interação.

Resposta em tempo real

Com os eventos de interação, os apps do Chat podem responder em tempo real ou de forma síncrona. Respostas síncronas não exigem autenticação.

Para criar respostas síncronas a eventos de interação, consulte os seguintes guias:

Para responder de forma síncrona, um app do Chat precisa responder em até 30 segundos, e a resposta precisa ser postada no espaço em que a interação ocorreu. Caso contrário, o app do Chat poderá responder de forma assíncrona.

Responder de forma assíncrona

Às vezes, os apps de chat precisam responder a um evento de interação após 30 segundos ou realizar tarefas fora do espaço em que o evento de interação foi gerado. Por exemplo, um app do Chat pode precisar responder ao usuário depois de concluir uma tarefa de longa duração. Nesse caso, os apps do Chat podem responder de forma assíncrona chamando a API Google Chat.

Para criar uma mensagem usando a API Chat, consulte Criar uma mensagem. Para guias sobre como usar outros métodos da API Chat, consulte a Visão geral da API Chat.