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 y cómo actualizarlas de forma asíncrona.
Crear y actualizar tarjetas es útil cuando quieres hacer lo siguiente:
- Publicar una tarjeta que represente una tarea o un recurso externo en nombre de un usuario
- Actualizar el estado de la tarjeta (por ejemplo, de "En curso" a "Completada") en función de eventos externos, sin esperar a que el usuario interactúe
- Actualiza el contenido de una tarjeta en un mensaje del usuario, como una vista previa de un vínculo.
Requisitos previos
Node.js
- Una cuenta de Google Workspace de Business 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 para 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 permiso de autorización según si quieres autenticarte como usuario o como la app de Chat.
Python
- Una cuenta de Google Workspace de Business 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 para 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 permiso de autorización según si quieres autenticarte como usuario o como la app de Chat.
Java
- Una cuenta de Google Workspace de Business 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 para 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 permiso de autorización según si quieres autenticarte como usuario o como la app de Chat.
Apps Script
- Una cuenta de Google Workspace de Business 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 de Apps Script independiente 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 Autentícate y autoriza como una app de Google Chat.
- Elige un permiso de autorización según si quieres 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 usuario.
Para crear el mensaje, especifica lo siguiente en tu solicitud:
- El permiso 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);
}
}
Actualiza tarjetas de forma asíncrona
Después de crear un mensaje con tarjetas, puedes actualizarlas de forma asíncrona con la autenticación de la app. Esto permite que tu app actualice el contenido de la tarjeta sin requerir 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 quitan las tarjetas que pertenecen a la app y esta ya no puede actualizarlas.
Para actualizar las tarjetas, llama al método replaceCards con lo siguiente:
- El permiso de autorización
chat.bot. - Es el
namedel mensaje que se actualizará. - La nueva lista
cardsV2. Esto reemplaza todas las tarjetas existentes en el mensaje. Si proporcionas una lista vacía, se quitarán las tarjetas.
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
- Reemplazar o actualizar las tarjetas de un mensaje
Este requisito es diferente del de otras APIs que usan la autenticación de usuarios, que, por lo general, no requieren que la app sea miembro del espacio.
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.La app de Chat solo puede reemplazar las tarjetas que adjuntó a un mensaje, no las que adjuntaron otras apps de Chat.
Si un usuario edita el texto del mensaje, se quitan las tarjetas que pertenecen a la app de Chat y ya no puedes actualizarlas.