Criar uma mensagem de cartão

Além de mensagens de texto, os apps do Google Chat podem criar mensagens de card nos espaços e para os usuários. Os cards são compatíveis com um layout definido, elementos interativos da IU, como botões, e rich media, como imagens.

Use mensagens de cartão para fazer o seguinte:

  • Apresentar informações detalhadas
  • Coletar informações dos usuários
  • Oriente os usuários a dar o próximo passo

Neste guia, descrevemos como criar mensagens de cartão de forma síncrona (uma resposta em tempo real para um evento do Google Chat, como receber uma mensagem de um usuário ou ser adicionada a um espaço) e de forma assíncrona (enviar uma mensagem do app para um espaço ou usuário sem uma solicitação usando a API Google Chat).

Pré-requisitos

Para criar as mensagens do cartão neste guia, você precisa do seguinte:

Node.js

Observação: as amostras de código Node.js neste guia são escritas para serem executadas como uma Função do Google Cloud.

Python

Observação: as amostras de código Python neste guia foram escritas para serem executadas como uma Função do Google Cloud usando o Python 3.9.

Apps Script

Anatomia de uma mensagem de card

Cada cartão, seja uma caixa de diálogo ou uma mensagem, é um objeto JSON no recurso spaces.messages na API Google Chat.

O objeto JSON do cartão consiste no seguinte:

  1. Uma matriz chamada cardsV2[], que contém um ou mais objetos CardWithId.
  2. Um cardId, usado para identificar o cartão e o escopo de uma determinada mensagem. Cartões em mensagens diferentes podem ter o mesmo ID.
  3. Um objeto card, que consiste no seguinte:

    • Um objeto header que especifica itens como título, subtítulo e imagem no estilo avatar.
    • Um ou mais objetos section, cada um contendo pelo menos um widget.
    • Um ou mais objetos widget. Cada widget é um objeto composto que pode representar texto, imagens, botões e outros tipos de objetos.

Como exemplo, observe os objetos header, section e widget na seguinte mensagem do card:

Um app de chat executando uma enquete em um espaço do Chat com uma mensagem de card

O código a seguir representa o JSON da mensagem do cartão:

JSON

{
  "cardsV2": [
    {
      "cardId": "unique-card-id",
      "card": {
        "header": {
          "title": "Sasha",
          "subtitle": "Software Engineer",
          "imageUrl":
          "https://developers.google.com/chat/images/quickstart-app-avatar.png",
          "imageType": "CIRCLE",
          "imageAltText": "Avatar for Sasha",
        },
        "sections": [
          {
            "header": "Contact Info",
            "collapsible": true,
            "uncollapsibleWidgetsCount": 1,
            "widgets": [
              {
                "decoratedText": {
                  "startIcon": {
                    "knownIcon": "EMAIL",
                  },
                  "text": "sasha@example.com",
                }
              },
              {
                "decoratedText": {
                  "startIcon": {
                    "knownIcon": "PERSON",
                  },
                  "text": "<font color=\"#80e27e\">Online</font>",
                },
              },
              {
                "decoratedText": {
                  "startIcon": {
                    "knownIcon": "PHONE",
                  },
                  "text": "+1 (555) 555-1234",
                }
              },
              {
                "buttonList": {
                  "buttons": [
                    {
                      "text": "Share",
                      "onClick": {
                        "openLink": {
                          "url": "https://example.com/share",
                        }
                      }
                    },
                    {
                      "text": "Edit",
                      "onClick": {
                        "action": {
                          "function": "goToView",
                          "parameters": [
                            {
                              "key": "viewType",
                              "value": "EDIT",
                            }
                          ],
                        }
                      }
                    },
                  ],
                }
              },
            ],
          },
        ],
      },
    }
  ],
}

Criar uma mensagem de cartão síncrona

Neste exemplo, o usuário cria uma mensagem no app Chat e o app responde enviando uma mensagem de cartão simples e síncrona mostrando o nome e a imagem de avatar do remetente:

Um app de chat respondendo com um card que exibe o nome de exibição e a imagem de avatar do remetente.

Nas amostras de código a seguir, os aplicativos Node.js e Python são hospedados no Google Cloud Functions. O exemplo do Apps Script está hospedado no Google Apps Script.

Para instruções completas que descrevem como criar e implantar um app de chat, consulte Criar um app de chat.

Node.js

node/avatar-bot/index.js
/**
 * Google Cloud Function that responds to messages sent from a
 * Hangouts Chat room.
 *
 * @param {Object} req Request sent from Hangouts Chat room
 * @param {Object} res Response to send back
 */
exports.helloChat = function helloChat(req, res) {
  if (req.method === 'GET' || !req.body.message) {
    res.send('Hello! This function is meant to be used in a Hangouts Chat ' +
      'Room.');
  }

  const sender = req.body.message.sender.displayName;
  const image = req.body.message.sender.avatarUrl;

  const data = createMessage(sender, image);

  res.send(data);
};

/**
 * Creates a card with two widgets.
 * @param {string} displayName the sender's display name
 * @param {string} imageUrl the URL for the sender's avatar
 * @return {Object} a card with the user's avatar.
 */
function createMessage(displayName, imageUrl) {
  const cardHeader = {
    title: `Hello ${displayName}!`,
  };

  const avatarWidget = {
    textParagraph: {text: 'Your avatar picture: '},
  };

  const avatarImageWidget = {
    image: {imageUrl},
  };

  const avatarSection = {
    widgets: [
      avatarWidget,
      avatarImageWidget,
    ],
  };

  return {
    cardsV2: [{
      cardId: 'avatarCard',
      card: {
        name: 'Avatar Card',
        header: cardHeader,
        sections: [avatarSection],
      }
    }],
  };
}

Python

python/avatar-bot/main.py
from typing import Any, Mapping

import flask
import functions_framework

# Google Cloud Function that responds to messages sent in
# Google Chat.
#
# @param {Object} req Request sent from Google Chat.
# @param {Object} res Response to send back.
@functions_framework.http
def hello_chat(req: flask.Request):
    if req.method == "GET":
        return "Hello! This function must be called from Google Chat."

    request_json = req.get_json(silent=True)

    display_name = request_json["message"]["sender"]["displayName"]
    avatar = request_json["message"]["sender"]["avatarUrl"]

    response = create_message(name=display_name, image_url=avatar)

    return response


# Creates a card with two widgets.
# @param {string} name the sender's display name.
# @param {string} image_url the URL for the sender's avatar.
# @return {Object} a card with the user's avatar.
def create_message(name: str, image_url: str) -> Mapping[str, Any]:
    avatar_image_widget = {"image": {"imageUrl": image_url}}
    avatar_text_widget = {"textParagraph": {"text": "Your avatar picture:"}}
    avatar_section = {"widgets": [avatar_text_widget, avatar_image_widget]}

    header = {"title": f"Hello {name}!"}

    cards = {
        "cardsV2": [
            {
                "cardId": "avatarCard",
                "card": {
                    "name": "Avatar Card",
                    "header": header,
                    "sections": [avatar_section],
                },
            }
        ]
    }

    return cards

Apps Script

apps-script/avatar-bot/hello-chat.gs
/**
 * Responds to a MESSAGE event in Google Chat.
 *
 * @param {Object} event the event object from Google Chat
 */
function onMessage(event) {
  const displayName = event.message.sender.displayName;
  const avatarUrl = event.message.sender.avatarUrl;

  return createMessage(displayName, avatarUrl);
}

/**
 * Creates a card with two widgets.
 * @param {string} displayName the sender's display name
 * @param {string} avatarUrl the URL for the sender's avatar
 * @return {Object} a card with the sender's avatar.
 */
function createMessage(displayName, avatarUrl) {
  const cardHeader = {
    title: `Hello ${displayName}!`
  };

  const avatarWidget = {
    textParagraph: {text: 'Your avatar picture: '}
  };

  const avatarImageWidget = {
    image: {imageUrl: avatarUrl}
  };

  const avatarSection = {
    widgets: [
      avatarWidget,
      avatarImageWidget
    ],
  };

  return {
    cardsV2: [{
      cardId: 'avatarCard',
      card: {
        name: 'Avatar Card',
        header: cardHeader,
        sections: [avatarSection],
      }
    }],
  };
}

Criar uma mensagem de cartão assíncrona com a API Chat

Este exemplo cria de maneira assíncrona uma mensagem com a API Chat e a envia para um espaço a que o app Chat é adicionado:

Uma mensagem de card criada com a API Google Chat.
Figura 1: uma mensagem do card criada com a API Chat.

Python

  1. No diretório de trabalho, crie um arquivo chamado chat_create_card_message.py.
  2. Inclua o seguinte código em chat_create_card_message.py:

    from httplib2 import Http
    from oauth2client.service_account import ServiceAccountCredentials
    from apiclient.discovery import build
    
    # Specify required scopes.
    SCOPES = ['https://www.googleapis.com/auth/chat.bot']
    
    # Specify service account details.
    CREDENTIALS = ServiceAccountCredentials.from_json_keyfile_name(
        'service_account.json', SCOPES)
    
    # Build the URI and authenticate with the service account.
    chat = build('chat', 'v1', http=CREDENTIALS.authorize(Http()))
    
    # Create a Chat message.
    result = chat.spaces().messages().create(
    
        # The space to create the message in.
        #
        # Replace SPACE with a space name.
        # Obtain the space name from the spaces resource of Chat API,
        # or from a space's URL.
        parent='spaces/SPACE',
    
        # The message to create.
        body=
        {
          'cardsV2': [{
            'cardId': 'createCardMessage',
            'card': {
              'header': {
                'title': 'A Card Message!',
                'subtitle': 'Created with Chat REST API',
                'imageUrl': 'https://developers.google.com/chat/images/chat-product-icon.png',
                'imageType': 'CIRCLE'
              },
              'sections': [
                {
                  'widgets': [
                    {
                      'buttonList': {
                        'buttons': [
                          {
                            'text': 'Read the docs!',
                            'onClick': {
                              'openLink': {
                                'url': 'https://developers.google.com/chat'
                              }
                            }
                          }
                        ]
                      }
                    }
                  ]
                }
              ]
            }
          }]
        }
    
    ).execute()
    
    print(result)
    
  3. No código, substitua SPACE por um nome de espaço, que você pode acessar no método spaces.list() na API Chat ou no URL de um espaço.

  4. No diretório de trabalho, crie e execute o exemplo:

    python3 chat_create_card_message.py
    

Para saber mais sobre como trabalhar com mensagens na API Chat, consulte:

Abrir uma caixa de diálogo

As caixas de diálogo são interfaces em janelas que os cartões de chat abrem para interagir com os usuários. Para ajudar os usuários a concluir processos em várias etapas, os apps podem abrir caixas de diálogo sequenciais. Os apps podem abrir caixas de diálogo em resposta a um clique no botão em uma mensagem de card ou em resposta a um comando de barra.

As caixas de diálogo são úteis para muitos tipos de interações do usuário, incluindo:

  • Coleta de informações dos usuários
  • Como autenticar usuários com serviços da Web
  • Como definir as configurações do app Chat

Neste exemplo, um app de chat abre uma caixa de diálogo para ajudar o usuário a criar um novo contato para o catálogo de endereços:

Uma caixa de diálogo com uma variedade de widgets diferentes.

Para implementar caixas de diálogo, consulte Abrir caixas de diálogo.

Formatação de cards

Há algumas maneiras diferentes de formatar a aparência dos cartões.

Formatação de texto do card

Nos cards, a maioria dos campos de texto é compatível com a formatação básica de texto usando um pequeno subconjunto de tags HTML.

As tags compatíveis e a finalidade delas são mostradas na tabela a seguir:

Formato Exemplo Resultado renderizado
Negrito "This is <b>bold</b>." Essa opção está em negrito.
Itálico "This is <i>italics</i>." Ela está em itálico.
Sublinhado "This is <u>underline</u>." Isso é um sublinhado.
Tachado "This is <s>strikethrough</s>." Isso é tachado.
Cor da fonte "This is <font color=\"#FF0000\">red font</text>." Esta é a fonte vermelha.
Hiperlink "This is a <a href=\"https://www.google.com\">hyperlink</a>." Este é um hiperlink.
Tempo "This is a time format: <time>2023-02-16 15:00</time>." Este é um formato de hora: .
Nova linha "This is the first line. <br> This is a new line." Esta é a primeira linha.
Esta é uma nova linha.

O corpo do texto de uma mensagem básica é analisado com uma sintaxe de marcação diferente, otimizada para usuários humanos. Para detalhes, consulte Criar uma mensagem de texto.

Ícones integrados

Os widgets DecoratedText e ButtonList são compatíveis com o elemento icon usado para especificar um dos ícones integrados disponíveis no Google Chat:

{
  .
  .
  .
      "knownIcon": "TRAIN",
  .
  .
  .
}

A tabela a seguir lista os ícones integrados que estão disponíveis para as mensagens do cartão:

AIRPLANE MARCADORES
ÔNIBUS CAR (em inglês)
RELÓGIO CONFIRMATION_NUMBER_ICON (em inglês)
DESCRIÇÃO MOEDA
E-MAIL EVENT_SEAT
FLIGHT_ARRIVAL (em inglês) FLIGHT_DEPARTURE (em inglês)
HOTEL HOTEL_ROOM_TYPE
CONVIDAR PIN_MAP
ASSINATURA MULTIPLE_PEOPLE
PESSOA TELEFONE
RESTAURANT_ICON (em inglês) SHOPPING_CART (em inglês)
ESTRELA LOJA
INGRESSO TREINAMENTO
VIDEO_CAMERA (em inglês) VIDEO_PLAY (em inglês)

Ícones personalizados

Os widgets DecoratedText e ButtonList permitem usar os ícones integrados ou definir seus próprios ícones personalizados. Para especificar um ícone personalizado, use o elemento iconUrl, conforme mostrado aqui:

{ . . "iconUrl": "https://developers.google.com/chat/images/quickstart-app-avatar.png" . . }