Kartennachricht erstellen

Zusätzlich zu SMS können Google Chat-Apps Kartennachrichten in Gruppenbereichen und für Nutzer erstellen. Karten unterstützen ein definiertes Layout, interaktive UI-Elemente wie Schaltflächen und Rich Media wie Bilder.

Mithilfe von Kartennachrichten haben Sie folgende Möglichkeiten:

  • Detaillierte Informationen präsentieren
  • Informationen von Nutzern erfassen
  • Nutzer anleiten, den nächsten Schritt zu tun

In dieser Anleitung wird beschrieben, wie Sie Kartennachrichten synchron (eine Echtzeitantwort auf ein Google Chat-Ereignis wie das Empfangen einer Nachricht von einem Nutzer oder das Hinzufügen zu einem Gruppenbereich) synchron erstellen und asynchron an die Anwendung senden, indem sie die Anwendung über die Google Chat API an einen Gruppenbereich oder einen Nutzer senden.

Voraussetzungen

Sie benötigen Folgendes, um die Kartennachrichten in diesem Leitfaden zu erstellen:

Node.js

Hinweis:Die Node.js-Codebeispiele in diesem Leitfaden sind als Google Cloud Functions-Funktion ausgeführt.

Python

Hinweis:Die Python-Codebeispiele in dieser Anleitung sind für die Ausführung als Google Cloud Functions-Funktion mit Python 3.9 geschrieben.

Apps Script

Aufbau einer Kartennachricht

Jede Karte, ob in Form eines Dialogfelds oder einer Nachricht, ist ein JSON-Objekt der Ressource spaces.messages in der Google Chat API.

Das JSON-Kartenobjekt besteht aus folgenden Elementen:

  1. Ein Array namens cardsV2[] mit einem oder mehreren CardWithId-Objekten.
  2. Ein cardId-Objekt, das zur Identifizierung der Karte und zum Umfang innerhalb einer bestimmten Nachricht verwendet wird. (Karten in verschiedenen Nachrichten können dieselbe ID haben.)
  3. Ein card-Objekt, das aus Folgendem besteht:

    • Ein header-Objekt, das z. B. einen Titel, einen Untertitel und ein Avatarbild angibt.
    • Ein oder mehrere section-Objekte, die jeweils mindestens ein Widget enthalten.
    • Ein oder mehrere widget-Objekte. Jedes Widget ist ein zusammengesetztes Objekt, das Text, Bilder, Schaltflächen und andere Objekttypen darstellen kann.

Sehen Sie sich als Beispiel die Objekte header, section und widget in der folgenden Kartennachricht an:

Eine Chat-App, die mit einer Kartennachricht in einem Chatbereich eine Umfrage ausführt

Der folgende Code stellt die JSON-Datei der Kartennachricht dar:

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",
                            }
                          ],
                        }
                      }
                    },
                  ],
                }
              },
            ],
          },
        ],
      },
    }
  ],
}

Synchrone Kartennachricht erstellen

In diesem Beispiel erstellt ein Nutzer eine Chatnachricht in Chat und die App sendet eine einfache synchrone Kartennachricht mit dem Namen und Avatarbild des Absenders.

Eine Chat-App, die mit einer Karte antwortet, auf der der Anzeigename und das Avatarbild des Absenders zu sehen sind.

In den folgenden Codebeispielen werden die Node.js- und Python-Anwendungen in Google Cloud Functions gehostet. Das Apps Script-Beispiel wird in Google Apps Script gehostet.

Eine vollständige Anleitung zum Erstellen und Bereitstellen einer Chat-App finden Sie unter Chat-App erstellen.

Node.js

Knoten/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) -> Mapping[str, Any]:
  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],
      }
    }],
  };
}

Asynchrone Kartennachricht mit der Chat API erstellen

In diesem Beispiel wird asynchron eine Nachricht mit der Chat API erstellt und an einen Gruppenbereich gesendet, dem die Chat App hinzugefügt wird:

Eine mit der Google Chat API erstellte Kartennachricht.
Abbildung 1: Mit der Chat API erstellte Kartennachricht.

Python

  1. Erstellen Sie in Ihrem Arbeitsverzeichnis eine Datei mit dem Namen chat_create_card_message.py.
  2. Fügen Sie den folgenden Code in chat_create_card_message.py ein:

    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. Ersetzen Sie im Code SPACE durch einen Namen für einen Gruppenbereich, den Sie über die Methode spaces.list() in der Chat API oder über die URL eines Gruppenbereichs abrufen können.

  4. Erstellen Sie in Ihrem Arbeitsverzeichnis das Beispiel und führen Sie es aus:

    python3 chat_create_card_message.py
    

Weitere Informationen zum Arbeiten mit Nachrichten in der Chat API finden Sie unter:

Dialogfeld öffnen

Dialogfelder sind kartenbasierte Schnittstellen mit Fenster, über die Chat-Apps mit Nutzern interagieren können. Apps können sequenzielle Dialogfelder öffnen, um Nutzern dabei zu helfen, mehrstufige Prozesse auszuführen. Apps können Dialogfelder als Reaktion auf einen Schaltflächenklick auf eine Kartennachricht oder als Reaktion auf einen Slash-Befehl öffnen.

Dialogfelder sind für viele Arten von Nutzerinteraktionen nützlich, darunter:

  • Informationen von Nutzern erfassen
  • Nutzer mit Webdiensten authentifizieren
  • Einstellungen für die Chat-App konfigurieren

In diesem Beispiel öffnet eine Chat-App ein Dialogfeld, mit dem ein Nutzer einen neuen Kontakt für sein Adressbuch erstellen kann:

Dialogfeld mit verschiedenen Widgets.

Informationen zum Implementieren von Dialogfeldern finden Sie unter Dialogfelder öffnen.

Kartenformatierung

Es gibt verschiedene Möglichkeiten, die Darstellung von Karten zu formatieren.

Formatierung von Kartentext

Bei Innenkarten unterstützen die meisten Textfelder grundlegende Textformatierungen mithilfe eines kleinen Teils der HTML-Tags.

Die unterstützten Tags und ihr Zweck werden in der folgenden Tabelle aufgeführt:

Format Beispiel Gerendertes Ergebnis
Fett "This is <b>bold</b>." Das ist fett.
Kursiv "This is <i>italics</i>." Das ist kursiv.
Unterstreichen "This is <u>underline</u>." Dies ist Unterstrich.
Durchstreichen "This is <s>strikethrough</s>." Das ist durchgestrichen.
Schriftfarbe "This is <font color=\"#FF0000\">red font</text>." Das ist rote Schriftart.
Hyperlink "This is a <a href=\"https://www.google.com\">hyperlink</a>." Dies ist ein Hyperlink.
Uhrzeit "This is a time format: <time>2023-02-16 15:00</time>." Das hat folgendes Format: .
Zeilenvorschub "This is the first line. <br> This is a new line. Dies ist die erste Zeile.
Dies ist eine neue Zeile.

Der Text einer einfachen Nachricht wird mit einer anderen Markup-Syntax geparst, die für menschliche Nutzer optimiert ist. Weitere Informationen finden Sie unter SMS erstellen.

Integrierte Symbole

Die Widgets DecoratedText und ButtonList unterstützen das Element icon, mit dem eines der integrierten Symbole angegeben wird, die in Google Chat verfügbar sind:

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

In der folgenden Tabelle sind die integrierten Symbole aufgeführt, die für Kartennachrichten verfügbar sind:

Flugmodus KURZMARKE
BUS CAR
UHRZEIT BESTÄTIGUNG_NUMBER_ICON
DESCRIPTION Dollar
E-MAIL VERANSTALTUNG
Flüge flug_fliegen
HOTEL HOTEL_ROOM_TYPE
EINLADEN MAP_PIN
MITGLIEDSCHAFT MEHRERE
PERSON SMARTPHONE
RESTAURANT_ICON SHOPPING_WARENKORB
Stern Geschäft
TICKET TRAINIEREN
VIDEOKAMERA VIDEO_PLAY

Benutzerdefinierte Symbole

Mit den Widgets DecoratedText und ButtonList können Sie die integrierten Symbole verwenden oder eigene benutzerdefinierte Symbole definieren. Verwenden Sie das Element iconUrl wie hier gezeigt, um ein benutzerdefiniertes Symbol anzugeben:

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