В этом руководстве объясняется, как использовать API Google Chat для создания сообщений, содержащих интерактивные карточки от имени пользователей, и как асинхронно обновлять эти карточки.
Создание и обновление карточек полезно, когда вам нужно выполнить следующие действия:
- Разместите карточку, представляющую задачу или внешний ресурс от имени пользователя.
- Обновляйте статус карточки (например, с «В процессе» на «Завершено») на основе внешних событий, не дожидаясь взаимодействия с пользователем.
- Обновить содержимое карточки в сообщении пользователя, например, предварительный просмотр ссылки.
Вне рамок программы предварительного просмотра для разработчиков сообщения, созданные с использованием аутентификации пользователя, могут содержать только текст.
Предварительные требования
Node.js
- Корпоративный аккаунт Google Workspace с доступом к Google Chat .
- Настройте свою среду:
- Создайте проект в Google Cloud .
- Настройте экран согласия OAuth .
- Включите и настройте API Google Chat, указав имя, значок и описание для вашего приложения чата.
- Установите клиентскую библиотеку Google API для Node.js.
- Создайте учетные данные доступа в зависимости от того, как вы хотите аутентифицироваться в запросе к Google Chat API:
- Для аутентификации в качестве пользователя чата создайте учетные данные OAuth-клиента и сохраните их в виде JSON-файла с именем
credentials.jsonв локальной директории. - Для аутентификации в приложении «Чат» создайте учетные данные сервисной учетной записи и сохраните их в JSON-файле с именем
credentials.json.
- Для аутентификации в качестве пользователя чата создайте учетные данные OAuth-клиента и сохраните их в виде JSON-файла с именем
- Выберите область авторизации в зависимости от того, хотите ли вы аутентифицироваться как пользователь или как приложение чата.
Python
- Корпоративный аккаунт Google Workspace с доступом к Google Chat .
- Настройте свою среду:
- Создайте проект в Google Cloud .
- Настройте экран согласия OAuth .
- Включите и настройте API Google Chat, указав имя, значок и описание для вашего приложения чата.
- Установите клиентскую библиотеку Google API для Python.
- Создайте учетные данные доступа в зависимости от того, как вы хотите аутентифицироваться в запросе к Google Chat API:
- Для аутентификации в качестве пользователя чата создайте учетные данные OAuth-клиента и сохраните их в виде JSON-файла с именем
credentials.jsonв локальной директории. - Для аутентификации в приложении «Чат» создайте учетные данные сервисной учетной записи и сохраните их в JSON-файле с именем
credentials.json.
- Для аутентификации в качестве пользователя чата создайте учетные данные OAuth-клиента и сохраните их в виде JSON-файла с именем
- Выберите область авторизации в зависимости от того, хотите ли вы аутентифицироваться как пользователь или как приложение чата.
Java
- Корпоративный аккаунт Google Workspace с доступом к Google Chat .
- Настройте свою среду:
- Создайте проект в Google Cloud .
- Настройте экран согласия OAuth .
- Включите и настройте API Google Chat, указав имя, значок и описание для вашего приложения чата.
- Установите клиентскую библиотеку Google API для Java.
- Создайте учетные данные доступа в зависимости от того, как вы хотите аутентифицироваться в запросе к Google Chat API:
- Для аутентификации в качестве пользователя чата создайте учетные данные OAuth-клиента и сохраните их в виде JSON-файла с именем
credentials.jsonв локальной директории. - Для аутентификации в приложении «Чат» создайте учетные данные сервисной учетной записи и сохраните их в JSON-файле с именем
credentials.json.
- Для аутентификации в качестве пользователя чата создайте учетные данные OAuth-клиента и сохраните их в виде JSON-файла с именем
- Выберите область авторизации в зависимости от того, хотите ли вы аутентифицироваться как пользователь или как приложение чата.
Apps Script
- Корпоративный аккаунт Google Workspace с доступом к Google Chat .
- Настройте свою среду:
- Создайте проект в Google Cloud .
- Настройте экран согласия OAuth .
- Включите и настройте API Google Chat, указав имя, значок и описание для вашего приложения чата.
- Создайте автономный проект Apps Script и включите расширенную службу чата .
- В этом руководстве необходимо использовать либо аутентификацию пользователя, либо аутентификацию приложения . Для аутентификации в качестве приложения «Чат» создайте учетные данные сервисной учетной записи. Инструкции см. в разделе «Аутентификация и авторизация в качестве приложения Google Chat» .
- Выберите область авторизации в зависимости от того, хотите ли вы аутентифицироваться как пользователь или как приложение чата.
Создайте ключ API для доступа к функциям предварительной версии для разработчиков.
Для вызова метода API из предварительной версии для разработчиков необходимо использовать непубличную предварительную версию документа обнаружения API. Для аутентификации запроса необходимо передать ключ API.
Чтобы создать ключ API, откройте проект Google Cloud вашего приложения и выполните следующие действия:
- В консоли Google Cloud перейдите в > API и сервисы > Учетные данные .
- Нажмите «Создать учетные данные» > «Ключ API» .
- Ваш новый API-ключ отображен.
- Нажмите «Копировать , чтобы скопировать свой API-ключ для использования в коде вашего приложения. API-ключ также можно найти в разделе «API-ключи» в учетных данных вашего проекта.
- Для предотвращения несанкционированного использования мы рекомендуем ограничить места и типы API, для которых можно использовать ключ API. Более подробную информацию см. в разделе «Добавление ограничений API» .
Создать сообщение для открытки от имени пользователя.
Для создания сообщения с карточками от имени пользователя используйте аутентификацию пользователя .
Для создания сообщения укажите в запросе следующее:
- Область авторизации
chat.messages.createилиchat.messages. - Поле
cardsV2в ресурсеMessage, содержащее данные карты. -
cardIdдля каждой карты, необходимый для асинхронных обновлений.
В следующем примере показано, как создать сообщение с карточкой от имени пользователя:
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 with Developer Preview labels
const chat = await google.discoverAPI(
'https://chat.googleapis.com/$discovery/rest?version=v1&labels=DEVELOPER_PREVIEW&key=API_KEY'
);
// 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 with Developer Preview labels.
service = build(
'chat',
'v1',
credentials=credentials,
discoveryServiceUrl='https://chat.googleapis.com/$discovery/rest?version=v1&labels=DEVELOPER_PREVIEW&key=API_KEY'
)
# 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);
}
}
Обновление карточек асинхронно.
После создания сообщения с карточками вы можете асинхронно обновлять их, используя аутентификацию приложения . Это позволяет вашему приложению обновлять содержимое карточек без участия пользователя. Заменить их может только то приложение чата, которое добавило карточку в сообщение пользователя. Если пользователь редактирует текст сообщения, принадлежащие приложению карточки удаляются, и ваше приложение больше не может их обновлять.
Для обновления карточек вызовите метод replaceCards со следующим содержимым:
- Область авторизации
chat.bot. -
nameсообщения, которое необходимо обновить. - Новый список
cardsV2. Он заменяет все существующие карточки в сообщении. Если вы укажете пустой список, карточки будут удалены.
В следующем примере показано, как обновить карточки сообщения:
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 with Developer Preview labels
const chat = await google.discoverAPI(
'https://chat.googleapis.com/$discovery/rest?version=v1&labels=DEVELOPER_PREVIEW&key=API_KEY'
);
// 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 with Developer Preview labels.
service = build(
'chat',
'v1',
credentials=credentials,
discoveryServiceUrl='https://chat.googleapis.com/$discovery/rest?version=v1&labels=DEVELOPER_PREVIEW&key=API_KEY'
)
# 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);
}
}
Ограничения
При создании сообщений с карточками от имени пользователя или обновлении карточек приложение «Чат» должно быть участником данного пространства. Это требование применяется в следующих случаях:
- Создание сообщения с карточками от имени пользователя.
- Замена или обновление карточек сообщения.
Это требование отличается от других API, использующих аутентификацию пользователей, которые, как правило, не требуют от приложения принадлежности к данному пространству.
Метод
replaceCardsподдерживает замену и удаление карточек, и вы можете добавлять дополнительные карточки во время замены, но вы не можете добавлять карточки в сообщение, в котором их еще нет.Приложение «Чат» может заменять только те карточки, которые оно само прикрепило к сообщению, а не те, которые были прикреплены другими приложениями для чата.
Если пользователь редактирует текст сообщения, карточки, принадлежащие приложению «Чат», удаляются, и вы больше не можете их обновлять.