Questa guida spiega come utilizzare l'API Google Chat per creare messaggi che contengano schede interattive per conto degli utenti, allegare schede ai messaggi esistenti e aggiornarle in modo asincrono.
La creazione e l'aggiornamento delle schede sono utili quando vuoi:
- Pubblica una scheda che rappresenta un'attività o una risorsa esterna per conto di un utente.
- Allega una scheda a un messaggio utente esistente per fornire contesto o flussi di lavoro interattivi.
- Aggiorna lo stato della scheda (ad esempio, da "In corso" a "Completato") in base a eventi esterni, senza attendere l'interazione utente.
- Aggiorna i contenuti di una scheda in un messaggio utente, ad esempio un'anteprima del link.
Prerequisiti
Node.js
- Un account Google Workspace Business o Enterprise con accesso a Google Chat.
- Configura l'ambiente:
- Crea un progetto Google Cloud.
- Configura la schermata per il consenso OAuth.
- Abilita e configura l'API Google Chat con un nome, un'icona e una descrizione per la tua app di chat.
- Installa la libreria client dell'API di Google Node.js.
- Crea le credenziali di accesso in base al modo in cui vuoi autenticarti nella richiesta dell'API Google Chat:
- Per l'autenticazione come utente di Chat,
crea le credenziali dell'ID client OAuth e salvale come file JSON denominato
credentials.jsonnella directory locale. - Per l'autenticazione come app Chat,
crea le credenziali
dell'account di servizio e salvale come file JSON denominato
credentials.json.
- Per l'autenticazione come utente di Chat,
crea le credenziali dell'ID client OAuth e salvale come file JSON denominato
- Scegli un ambito di autorizzazione in base al fatto che tu voglia eseguire l'autenticazione come utente o come app di chat.
Python
- Un account Google Workspace Business o Enterprise con accesso a Google Chat.
- Configura l'ambiente:
- Crea un progetto Google Cloud.
- Configura la schermata per il consenso OAuth.
- Abilita e configura l'API Google Chat con un nome, un'icona e una descrizione per la tua app di chat.
- Installa la libreria client API di Google per Python.
- Crea le credenziali di accesso in base al modo in cui vuoi autenticarti nella richiesta dell'API Google Chat:
- Per l'autenticazione come utente di Chat,
crea le credenziali dell'ID client OAuth e salvale come file JSON denominato
credentials.jsonnella directory locale. - Per l'autenticazione come app Chat,
crea le credenziali
dell'account di servizio e salvale come file JSON denominato
credentials.json.
- Per l'autenticazione come utente di Chat,
crea le credenziali dell'ID client OAuth e salvale come file JSON denominato
- Scegli un ambito di autorizzazione in base al fatto che tu voglia eseguire l'autenticazione come utente o come app di chat.
Java
- Un account Google Workspace Business o Enterprise con accesso a Google Chat.
- Configura l'ambiente:
- Crea un progetto Google Cloud.
- Configura la schermata per il consenso OAuth.
- Abilita e configura l'API Google Chat con un nome, un'icona e una descrizione per la tua app di chat.
- Installa la libreria client delle API di Google per Java .
- Crea le credenziali di accesso in base al modo in cui vuoi autenticarti nella richiesta dell'API Google Chat:
- Per l'autenticazione come utente di Chat,
crea le credenziali dell'ID client OAuth e salvale come file JSON denominato
credentials.jsonnella directory locale. - Per l'autenticazione come app Chat,
crea le credenziali
dell'account di servizio e salvale come file JSON denominato
credentials.json.
- Per l'autenticazione come utente di Chat,
crea le credenziali dell'ID client OAuth e salvale come file JSON denominato
- Scegli un ambito di autorizzazione in base al fatto che tu voglia eseguire l'autenticazione come utente o come app di chat.
Apps Script
- Un account Google Workspace Business o Enterprise con accesso a Google Chat.
- Configura l'ambiente:
- Crea un progetto Google Cloud.
- Configura la schermata per il consenso OAuth.
- Abilita e configura l'API Google Chat con un nome, un'icona e una descrizione per la tua app di chat.
- Crea un progetto Apps Script autonomo e attiva il servizio di chat avanzato.
- In questa guida devi utilizzare l'autenticazione utente o dell'app. Per eseguire l'autenticazione come app Chat, crea le credenziali del service account. Per conoscere la procedura, vedi Autenticare e autorizzare come app Google Chat.
- Scegli un ambito di autorizzazione in base al fatto che tu voglia eseguire l'autenticazione come utente o come app di chat.
Creare un messaggio della scheda per conto di un utente
Per creare un messaggio con schede per conto di un utente, utilizza l'autenticazione utente.
Per creare il messaggio, specifica quanto segue nella richiesta:
- L'ambito di autorizzazione
chat.messages.createochat.messages. - Il campo
cardsV2nella risorsaMessage, contenente i dati della scheda. - Il
cardIdper ogni carta, necessario per gli aggiornamenti asincroni.
L'esempio seguente mostra come creare un messaggio con una scheda per conto di un utente:
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);
}
}
Allegare schede a un messaggio esistente per conto di un utente
Per allegare schede a un messaggio esistente per conto di un utente, chiama il metodo
patch
utilizzando l'autenticazione utente.
Per allegare schede a un messaggio, specifica quanto segue nella richiesta:
- L'ambito di autorizzazione
chat.messages. - Il
namedel messaggio da aggiornare, nel formatospaces/{space}/messages/{message}. updateMaskimpostato sucards_v2. Quando aggiorni un messaggio con l'autenticazione utente,cards_v2deve essere l'unico campo nella maschera di aggiornamento. Non puoi aggiornaretextecards_v2nello stesso messaggio.- Il campo
cardsV2nella risorsaMessage, contenente i dati della scheda. - Il
cardIdper ogni carta, necessario per gli aggiornamenti asincroni successivi.
L'esempio seguente mostra come allegare una scheda a un messaggio esistente per conto di un utente:
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);
}
}
Aggiornare le schede in modo asincrono
Dopo aver creato un messaggio con le schede o averle allegate a un messaggio esistente, puoi aggiornarle in modo asincrono utilizzando l'autenticazione dell'app. In questo modo, la tua app può aggiornare i contenuti della scheda senza richiedere l'interazione dell'utente. Solo l'app Chat che ha aggiunto la carta al messaggio dell'utente può sostituirla. Se un utente modifica il testo del messaggio, le schede di proprietà dell'app vengono rimosse e la tua app non può più aggiornarle.
Quando le schede vengono aggiornate in modo asincrono, Google Chat mostra un indicatore Modificato accanto all'attribuzione della scheda per informare gli utenti che i contenuti della scheda sono stati aggiornati indipendentemente dal messaggio.
Per aggiornare le schede, chiama il metodo replaceCards con quanto segue:
- L'ambito di autorizzazione
chat.bot. - Il
namedel messaggio da aggiornare. - Il nuovo elenco
cardsV2. In questo modo vengono sostituite tutte le schede esistenti nel messaggio. Se fornisci un elenco vuoto, le carte vengono rimosse. Se rimuovi tutte le carte, non puoi utilizzarereplaceCardsper aggiungerle di nuovo; utilizza inveceUpdateMessagecon l'autenticazione utente per allegare nuove carte.
L'esempio seguente mostra come aggiornare le schede di un messaggio:
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);
}
}
Limitazioni
Quando crei messaggi con schede per conto di un utente o aggiorni le schede, l'app Chat deve essere membro dello spazio. Questo requisito si applica quando:
- Creazione di un messaggio con schede per conto di un utente.
- Allegare schede a un messaggio esistente per conto di un utente.
- Sostituzione o aggiornamento delle schede di un messaggio.
Questo requisito è diverso da altre API che utilizzano l'autenticazione utente, che in genere non richiedono che l'app sia membro dello spazio.
Quando aggiorni un messaggio con l'autenticazione utente, se
cards_v2è specificato inupdateMask, nessun altro campo (cometext) può essere aggiornato nella stessa richiesta.Il metodo
replaceCardssupporta la sostituzione e la rimozione delle carte e puoi aggiungere altre carte durante la sostituzione, ma non puoi aggiungere carte a un messaggio che non ne ha già. Per allegare schede a un messaggio che non ne ha, utilizzaUpdateMessagecon l'autenticazione utente.Attribuzione e proprietà della carta:
- Le schede allegate a un messaggio utente sono attribuite e di proprietà dell'app Chat che le ha allegate, come indicato dal campo
CardWithId.ownerdi sola uscita. - L'app Chat può sostituire solo le schede che ha allegato a un messaggio, non quelle allegate da altre app di chat.
- Le schede allegate a un messaggio utente sono attribuite e di proprietà dell'app Chat che le ha allegate, come indicato dal campo
Se un utente modifica il testo del messaggio, le schede di proprietà dell'app Chat vengono rimosse e non puoi più aggiornarle.