En esta guía, se explica cómo usar la API de Google Chat para crear mensajes que contengan tarjetas interactivas en nombre de los usuarios, adjuntar tarjetas a mensajes existentes y actualizar esas tarjetas de forma asíncrona.
Crear y actualizar tarjetas es útil cuando deseas hacer lo siguiente:
- Publica una tarjeta que representa una tarea o un recurso externo en nombre de un usuario.
- Adjunta una tarjeta a un mensaje de usuario existente para proporcionar contexto o flujos de trabajo interactivos.
- Actualizar el estado de la tarjeta (por ejemplo, de "En curso" a "Completada") según eventos externos, sin esperar la interacción del usuario
- Actualiza el contenido de una tarjeta en un mensaje del usuario, como una vista previa del vínculo.
Requisitos previos
Node.js
- Una cuenta de Google Workspace para empresas o Enterprise con acceso a Google Chat
- Configura tu entorno:
- Crea un proyecto de Google Cloud
- Configura la pantalla de consentimiento de OAuth.
- Habilita y configura la API de Google Chat con un nombre, un ícono y una descripción para tu app de Chat.
- Instala la biblioteca cliente de las APIs de Google de Node.js.
- Crea credenciales de acceso según cómo quieras autenticarte en tu solicitud a la API de Google Chat:
- Para autenticarte como usuario de Chat, crea credenciales de ID de cliente de OAuth y guárdalas como un archivo JSON llamado
credentials.jsonen tu directorio local. - Para autenticarte como la app de Chat, crea credenciales de cuenta de servicio y guárdalas como un archivo JSON llamado
credentials.json.
- Para autenticarte como usuario de Chat, crea credenciales de ID de cliente de OAuth y guárdalas como un archivo JSON llamado
- Elige un alcance de autorización según si deseas autenticarte como usuario o como la app de Chat.
Python
- Una cuenta de Google Workspace para empresas o Enterprise con acceso a Google Chat
- Configura tu entorno:
- Crea un proyecto de Google Cloud
- Configura la pantalla de consentimiento de OAuth.
- Habilita y configura la API de Google Chat con un nombre, un ícono y una descripción para tu app de Chat.
- Instala la biblioteca cliente de las APIs de Google de Python.
- Crea credenciales de acceso según cómo quieras autenticarte en tu solicitud a la API de Google Chat:
- Para autenticarte como usuario de Chat, crea credenciales de ID de cliente de OAuth y guárdalas como un archivo JSON llamado
credentials.jsonen tu directorio local. - Para autenticarte como la app de Chat, crea credenciales de cuenta de servicio y guárdalas como un archivo JSON llamado
credentials.json.
- Para autenticarte como usuario de Chat, crea credenciales de ID de cliente de OAuth y guárdalas como un archivo JSON llamado
- Elige un alcance de autorización según si deseas autenticarte como usuario o como la app de Chat.
Java
- Una cuenta de Google Workspace para empresas o Enterprise con acceso a Google Chat
- Configura tu entorno:
- Crea un proyecto de Google Cloud
- Configura la pantalla de consentimiento de OAuth.
- Habilita y configura la API de Google Chat con un nombre, un ícono y una descripción para tu app de Chat.
- Instala la biblioteca cliente de la API de Google de Java.
- Crea credenciales de acceso según cómo quieras autenticarte en tu solicitud a la API de Google Chat:
- Para autenticarte como usuario de Chat, crea credenciales de ID de cliente de OAuth y guárdalas como un archivo JSON llamado
credentials.jsonen tu directorio local. - Para autenticarte como la app de Chat, crea credenciales de cuenta de servicio y guárdalas como un archivo JSON llamado
credentials.json.
- Para autenticarte como usuario de Chat, crea credenciales de ID de cliente de OAuth y guárdalas como un archivo JSON llamado
- Elige un alcance de autorización según si deseas autenticarte como usuario o como la app de Chat.
Apps Script
- Una cuenta de Google Workspace para empresas o Enterprise con acceso a Google Chat
- Configura tu entorno:
- Crea un proyecto de Google Cloud
- Configura la pantalla de consentimiento de OAuth.
- Habilita y configura la API de Google Chat con un nombre, un ícono y una descripción para tu app de Chat.
- Crea un proyecto independiente de Apps Script y activa el servicio de Chat avanzado.
- En esta guía, debes usar la autenticación de usuario o de app. Para autenticarte como la app de Chat, crea credenciales de cuenta de servicio. Para conocer los pasos, consulta Cómo autenticar y autorizar como una app de Google Chat.
- Elige un alcance de autorización según si deseas autenticarte como usuario o como la app de Chat.
Crea un mensaje de tarjeta en nombre de un usuario
Para crear un mensaje con tarjetas en nombre de un usuario, usa la autenticación de usuarios.
Para crear el mensaje, especifica lo siguiente en tu solicitud:
- Es el alcance de autorización
chat.messages.createochat.messages. - El campo
cardsV2en el recursoMessage, que contiene los datos de la tarjeta. - El
cardIdde cada tarjeta, que es obligatorio para las actualizaciones asíncronas.
En el siguiente ejemplo, se muestra cómo crear un mensaje con una tarjeta en nombre de un usuario:
Node.js
/**
* This sample shows how to create a message with a card on behalf of a user.
*/
const {google} = require('googleapis');
const {auth} = require('google-auth-library');
async function main() {
// Create a client
const authClient = await auth.getClient({
scopes: ['https://www.googleapis.com/auth/chat.messages.create']
});
google.options({auth: authClient});
// Initialize the Chat API
const chat = google.chat({version: 'v1'});
// The space to create the message in.
const parent = 'spaces/SPACE_NAME';
// Create the request
const request = {
parent: parent,
requestBody: {
text: 'Here is a card created on my behalf:',
cardsV2: [{
cardId: 'unique-card-id',
card: {
header: {
title: 'Card Title',
subtitle: 'Card Subtitle'
},
sections: [{
widgets: [{
textParagraph: {
text: 'This card is attached to a user message.'
}
}]
}]
}
}]
}
};
// Call the API
const response = await chat.spaces.messages.create(request);
// Handle the response
console.log(response.data);
}
main().catch(console.error);
Python
"""
This sample shows how to create a message with a card on behalf of a user.
"""
from google.oauth2 import service_account
from googleapiclient.discovery import build
import google.auth
def create_message_with_card():
# Create a client
scopes = ["https://www.googleapis.com/auth/chat.messages.create"]
credentials, _ = google.auth.default(scopes=scopes)
# Build the service endpoint for Chat API.
service = build('chat', 'v1', credentials=credentials)
# The space to create the message in.
parent = "spaces/SPACE_NAME"
# Create the request
result = service.spaces().messages().create(
parent=parent,
body={
'text': 'Here is a card created on my behalf:',
'cardsV2': [{
'cardId': 'unique-card-id',
'card': {
'header': {
'title': 'Card Title',
'subtitle': 'Card Subtitle'
},
'sections': [{
'widgets': [{
'textParagraph': {
'text': 'This card is attached to a user message.'
}
}]
}]
}
}]
}
).execute()
print(result)
if __name__ == "__main__":
create_message_with_card()
Java
/**
* This sample shows how to create a message with a card on behalf of a user.
*/
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.http.GenericUrl;
import com.google.api.client.http.HttpRequest;
import com.google.api.client.http.HttpRequestFactory;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.http.json.JsonHttpContent;
import com.google.api.client.json.gson.GsonFactory;
import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
public class CreateMessageWithCard {
public static void main(String[] args) throws Exception {
HttpTransport transport = GoogleNetHttpTransport.newTrustedTransport();
GsonFactory jsonFactory = GsonFactory.getDefaultInstance();
GoogleCredentials credentials = GoogleCredentials.getApplicationDefault()
.createScoped(Arrays.asList("https://www.googleapis.com/auth/chat.messages.create"));
HttpRequestFactory requestFactory = transport.createRequestFactory(new HttpCredentialsAdapter(credentials));
String parent = "spaces/SPACE_NAME";
GenericUrl url = new GenericUrl("https://chat.googleapis.com/v1/" + parent + "/messages");
// Construct the message body
Map<String, Object> message = new HashMap<>();
message.put("text", "Here is a card created on my behalf:");
Map<String, Object> header = new HashMap<>();
header.put("title", "Card Title");
header.put("subtitle", "Card Subtitle");
Map<String, Object> textParagraph = new HashMap<>();
textParagraph.put("text", "This card is attached to a user message.");
Map<String, Object> widget = new HashMap<>();
widget.put("textParagraph", textParagraph);
Map<String, Object> section = new HashMap<>();
section.put("widgets", Collections.singletonList(widget));
Map<String, Object> card = new HashMap<>();
card.put("header", header);
card.put("sections", Collections.singletonList(section));
Map<String, Object> cardWithId = new HashMap<>();
cardWithId.put("cardId", "unique-card-id");
cardWithId.put("card", card);
message.put("cardsV2", Collections.singletonList(cardWithId));
HttpRequest request = requestFactory.buildPostRequest(url, new JsonHttpContent(jsonFactory, message));
System.out.println(request.execute().parseAsString());
}
}
Apps Script
/**
* This sample shows how to create a message with a card on behalf of a user.
*/
function createMessageWithCard() {
const parent = 'spaces/SPACE_NAME';
const url = `https://chat.googleapis.com/v1/${parent}/messages`;
const message = {
text: 'Here is a card created on my behalf:',
cardsV2: [{
cardId: 'unique-card-id',
card: {
header: {
title: 'Card Title',
subtitle: 'Card Subtitle'
},
sections: [{
widgets: [{
textParagraph: {
text: 'This card is attached to a user message.'
}
}]
}]
}
}]
};
const options = {
method: 'post',
headers: {
Authorization: 'Bearer ' + ScriptApp.getOAuthToken()
},
contentType: 'application/json',
payload: JSON.stringify(message),
muteHttpExceptions: true
};
try {
const response = UrlFetchApp.fetch(url, options);
console.log(response.getContentText());
} catch (err) {
console.log('Failed to create message: ' + err.message);
}
}
Adjunta tarjetas a un mensaje existente en nombre de un usuario
Para adjuntar tarjetas a un mensaje existente en nombre de un usuario, llama al método patch con la autenticación del usuario.
Para adjuntar tarjetas a un mensaje, especifica lo siguiente en tu solicitud:
- Es el permiso de autorización
chat.messages. - El
namedel mensaje que se actualizará, en el formatospaces/{space}/messages/{message}. - El
updateMaskse estableció encards_v2. Cuando se actualiza un mensaje con autenticación del usuario,cards_v2debe ser el único campo en la máscara de actualización. No puedes actualizar los mensajestextycards_v2en la misma solicitud. - El campo
cardsV2en el recursoMessage, que contiene los datos de la tarjeta. - El
cardIdde cada tarjeta, que se requiere para las actualizaciones asíncronas posteriores.
En el siguiente ejemplo, se muestra cómo adjuntar una tarjeta a un mensaje existente en nombre de un usuario:
Node.js
/**
* This sample shows how to attach a card to an existing message on behalf of a user.
*/
const {google} = require('googleapis');
const {auth} = require('google-auth-library');
async function main() {
// Create a client with user credentials
const authClient = await auth.getClient({
scopes: ['https://www.googleapis.com/auth/chat.messages']
});
google.options({auth: authClient});
// Initialize the Chat API
const chat = google.chat({version: 'v1'});
// The message to update.
const messageName = 'spaces/SPACE_NAME/messages/MESSAGE_ID';
// Create the request
const request = {
name: messageName,
updateMask: 'cards_v2',
requestBody: {
cardsV2: [{
cardId: 'unique-card-id',
card: {
header: {
title: 'Card Title',
subtitle: 'Card Subtitle'
},
sections: [{
widgets: [{
textParagraph: {
text: 'This card was attached to an existing user message.'
}
}]
}]
}
}]
}
};
// Call the API
const response = await chat.spaces.messages.patch(request);
// Handle the response
console.log(response.data);
}
main().catch(console.error);
Python
"""
This sample shows how to attach a card to an existing message on behalf of a user.
"""
from googleapiclient.discovery import build
import google.auth
def attach_card_to_message():
# Create a client with user credentials
scopes = ["https://www.googleapis.com/auth/chat.messages"]
credentials, _ = google.auth.default(scopes=scopes)
# Build the service endpoint for Chat API.
service = build('chat', 'v1', credentials=credentials)
# The message to update.
message_name = "spaces/SPACE_NAME/messages/MESSAGE_ID"
# Create the request
result = service.spaces().messages().patch(
name=message_name,
updateMask="cards_v2",
body={
'cardsV2': [{
'cardId': 'unique-card-id',
'card': {
'header': {
'title': 'Card Title',
'subtitle': 'Card Subtitle'
},
'sections': [{
'widgets': [{
'textParagraph': {
'text': 'This card was attached to an existing user message.'
}
}]
}]
}
}]
}
).execute()
print(result)
if __name__ == "__main__":
attach_card_to_message()
Java
/**
* This sample shows how to attach a card to an existing message on behalf of a user.
*/
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.http.GenericUrl;
import com.google.api.client.http.HttpRequest;
import com.google.api.client.http.HttpRequestFactory;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.http.json.JsonHttpContent;
import com.google.api.client.json.gson.GsonFactory;
import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
public class AttachCardToMessage {
public static void main(String[] args) throws Exception {
HttpTransport transport = GoogleNetHttpTransport.newTrustedTransport();
GsonFactory jsonFactory = GsonFactory.getDefaultInstance();
GoogleCredentials credentials = GoogleCredentials.getApplicationDefault()
.createScoped(Arrays.asList("https://www.googleapis.com/auth/chat.messages"));
HttpRequestFactory requestFactory = transport.createRequestFactory(new HttpCredentialsAdapter(credentials));
String messageName = "spaces/SPACE_NAME/messages/MESSAGE_ID";
GenericUrl url = new GenericUrl("https://chat.googleapis.com/v1/" + messageName + "?updateMask=cards_v2");
// Construct the card body
Map<String, Object> header = new HashMap<>();
header.put("title", "Card Title");
header.put("subtitle", "Card Subtitle");
Map<String, Object> textParagraph = new HashMap<>();
textParagraph.put("text", "This card was attached to an existing user message.");
Map<String, Object> widget = new HashMap<>();
widget.put("textParagraph", textParagraph);
Map<String, Object> section = new HashMap<>();
section.put("widgets", Collections.singletonList(widget));
Map<String, Object> card = new HashMap<>();
card.put("header", header);
card.put("sections", Collections.singletonList(section));
Map<String, Object> cardWithId = new HashMap<>();
cardWithId.put("cardId", "unique-card-id");
cardWithId.put("card", card);
Map<String, Object> message = new HashMap<>();
message.put("cardsV2", Collections.singletonList(cardWithId));
HttpRequest request = requestFactory.buildPatchRequest(url, new JsonHttpContent(jsonFactory, message));
System.out.println(request.execute().parseAsString());
}
}
Apps Script
/**
* This sample shows how to attach a card to an existing message on behalf of a user.
*/
function attachCardToMessage() {
const messageName = 'spaces/SPACE_NAME/messages/MESSAGE_ID';
const url = `https://chat.googleapis.com/v1/${messageName}?updateMask=cards_v2`;
const message = {
cardsV2: [{
cardId: 'unique-card-id',
card: {
header: {
title: 'Card Title',
subtitle: 'Card Subtitle'
},
sections: [{
widgets: [{
textParagraph: {
text: 'This card was attached to an existing user message.'
}
}]
}]
}
}]
};
const options = {
method: 'patch',
headers: {
Authorization: 'Bearer ' + ScriptApp.getOAuthToken()
},
contentType: 'application/json',
payload: JSON.stringify(message),
muteHttpExceptions: true
};
try {
const response = UrlFetchApp.fetch(url, options);
console.log(response.getContentText());
} catch (err) {
console.log('Failed to attach card: ' + err.message);
}
}
Actualiza las tarjetas de forma asíncrona
Después de crear un mensaje con tarjetas o adjuntar tarjetas a un mensaje existente, puedes actualizar las tarjetas de forma asíncrona con la autenticación de la app. Esto permite que tu app actualice el contenido de la tarjeta sin necesidad de la interacción del usuario. Solo la app de Chat que agregó la tarjeta al mensaje del usuario puede reemplazarla. Si un usuario edita el texto del mensaje, se quitarán las tarjetas propiedad de la app y tu app ya no podrá actualizarlas.
Cuando las tarjetas se actualizan de forma asíncrona, Google Chat muestra un indicador de Editado junto a la atribución de la tarjeta para informar a los usuarios que el contenido de la tarjeta se actualizó independientemente del mensaje.
Para actualizar las tarjetas, llama al método replaceCards con lo siguiente:
- Es el permiso de autorización
chat.bot. - Es el
namedel mensaje que se actualizará. - Es la nueva lista
cardsV2. Esto reemplaza todas las tarjetas existentes en el mensaje. Si proporcionas una lista vacía, se quitarán las tarjetas. Si quitas todas las tarjetas, no podrás usarreplaceCardspara volver a agregarlas. En su lugar, usaUpdateMessagecon autenticación del usuario para adjuntar tarjetas nuevas.
En el siguiente ejemplo, se muestra cómo actualizar las tarjetas de un mensaje:
Node.js
/**
* This sample shows how to update cards on a message.
*/
const {google} = require('googleapis');
const {auth} = require('google-auth-library');
async function main() {
// Create a client with app credentials
const authClient = await auth.getClient({
scopes: ['https://www.googleapis.com/auth/chat.bot']
});
google.options({auth: authClient});
// Initialize the Chat API
const chat = google.chat({version: 'v1'});
// The message to update.
const messageName = 'spaces/SPACE_NAME/messages/MESSAGE_ID';
// Create the request
const request = {
name: messageName,
requestBody: {
cardsV2: [{
cardId: 'unique-card-id',
card: {
header: {
title: 'Updated Card Title',
subtitle: 'Updated Card Subtitle'
},
sections: [{
widgets: [{
textParagraph: {
text: 'The card content has been updated asynchronously.'
}
}]
}]
}
}]
}
};
// Call the API
await chat.spaces.messages.replaceCards(request);
console.log('Cards updated.');
}
main().catch(console.error);
Python
"""
This sample shows how to update cards on a message.
"""
from google.oauth2 import service_account
from googleapiclient.discovery import build
import google.auth
def replace_message_cards():
# Create a client with app credentials
scopes = ["https://www.googleapis.com/auth/chat.bot"]
credentials, _ = google.auth.default(scopes=scopes)
# Build the service endpoint for Chat API.
service = build('chat', 'v1', credentials=credentials)
# The message to update.
message_name = "spaces/SPACE_NAME/messages/MESSAGE_ID"
# Create the request
result = service.spaces().messages().replaceCards(
name=message_name,
body={
'cardsV2': [{
'cardId': 'unique-card-id',
'card': {
'header': {
'title': 'Updated Card Title',
'subtitle': 'Updated Card Subtitle'
},
'sections': [{
'widgets': [{
'textParagraph': {
'text': 'The card content has been updated asynchronously.'
}
}]
}]
}
}]
}
).execute()
print("Cards updated.")
if __name__ == "__main__":
replace_message_cards()
Java
/**
* This sample shows how to update cards on a message.
*/
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.http.GenericUrl;
import com.google.api.client.http.HttpRequest;
import com.google.api.client.http.HttpRequestFactory;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.http.json.JsonHttpContent;
import com.google.api.client.json.gson.GsonFactory;
import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
public class ReplaceMessageCards {
public static void main(String[] args) throws Exception {
HttpTransport transport = GoogleNetHttpTransport.newTrustedTransport();
GsonFactory jsonFactory = GsonFactory.getDefaultInstance();
GoogleCredentials credentials = GoogleCredentials.getApplicationDefault()
.createScoped(Arrays.asList("https://www.googleapis.com/auth/chat.bot"));
HttpRequestFactory requestFactory = transport.createRequestFactory(new HttpCredentialsAdapter(credentials));
String messageName = "spaces/SPACE_NAME/messages/MESSAGE_ID";
GenericUrl url = new GenericUrl("https://chat.googleapis.com/v1/" + messageName + ":replaceCards");
// Construct the body
Map<String, Object> header = new HashMap<>();
header.put("title", "Updated Card Title");
header.put("subtitle", "Updated Card Subtitle");
Map<String, Object> textParagraph = new HashMap<>();
textParagraph.put("text", "The card content has been updated asynchronously.");
Map<String, Object> widget = new HashMap<>();
widget.put("textParagraph", textParagraph);
Map<String, Object> section = new HashMap<>();
section.put("widgets", Collections.singletonList(widget));
Map<String, Object> card = new HashMap<>();
card.put("header", header);
card.put("sections", Collections.singletonList(section));
Map<String, Object> cardWithId = new HashMap<>();
cardWithId.put("cardId", "unique-card-id");
cardWithId.put("card", card);
Map<String, Object> body = new HashMap<>();
body.put("cardsV2", Collections.singletonList(cardWithId));
HttpRequest request = requestFactory.buildPostRequest(url, new JsonHttpContent(jsonFactory, body));
request.execute();
System.out.println("Cards updated.");
}
}
Apps Script
/**
* This sample shows how to update cards on a message.
*/
function replaceMessageCards() {
const messageName = 'spaces/SPACE_NAME/messages/MESSAGE_ID';
const url = `https://chat.googleapis.com/v1/${messageName}:replaceCards`;
const request = {
cardsV2: [{
cardId: 'unique-card-id',
card: {
header: {
title: 'Updated Card Title',
subtitle: 'Updated Card Subtitle'
},
sections: [{
widgets: [{
textParagraph: {
text: 'The card content has been updated asynchronously.'
}
}]
}]
}
}]
};
const options = {
method: 'post',
headers: {
Authorization: 'Bearer ' + ScriptApp.getOAuthToken()
},
contentType: 'application/json',
payload: JSON.stringify(request),
muteHttpExceptions: true
};
try {
const response = UrlFetchApp.fetch(url, options);
console.log('Cards updated.');
} catch (err) {
console.log('Failed to update cards: ' + err.message);
}
}
Limitaciones
Cuando se crean mensajes con tarjetas en nombre de un usuario o se actualizan tarjetas, la app de Chat debe ser miembro del espacio. Este requisito se aplica en los siguientes casos:
- Crear un mensaje con tarjetas en nombre de un usuario
- Adjuntar tarjetas a un mensaje existente en nombre de un usuario
- Reemplazar o actualizar las tarjetas de un mensaje
Este requisito es diferente de otras APIs que usan la autenticación del usuario, que, por lo general, no requieren que la app sea miembro del espacio.
Cuando se actualiza un mensaje con autenticación del usuario, si se especifica
cards_v2enupdateMask, no se pueden actualizar otros campos (comotext) en la misma solicitud.El método
replaceCardsadmite el reemplazo y la eliminación de tarjetas, y puedes agregar tarjetas adicionales mientras las reemplazas, pero no puedes agregar tarjetas a un mensaje que aún no las tenga. Para adjuntar tarjetas a un mensaje que no las tiene, usaUpdateMessagecon autenticación del usuario.Atribución y propiedad de la tarjeta:
- Las tarjetas adjuntas a un mensaje del usuario se atribuyen a la app de Chat que las adjuntó y son propiedad de esta, como se indica en el campo
CardWithId.ownerde solo salida. - La app de Chat solo puede reemplazar las tarjetas que adjuntó a un mensaje, no las que adjuntaron otras apps de Chat.
- Las tarjetas adjuntas a un mensaje del usuario se atribuyen a la app de Chat que las adjuntó y son propiedad de esta, como se indica en el campo
Si un usuario edita el texto del mensaje, se quitarán las tarjetas propiedad de la app de Chat y ya no podrás actualizarlas.