На этой странице объясняется, как создать приложение чата с помощью Pub/Sub . Этот тип архитектуры для приложения Chat полезен, если в вашей организации есть брандмауэр, который может запретить Chat отправлять сообщения в ваше приложение Chat, или если приложение Chat использует API событий Google Workspace . Однако эта архитектура имеет следующие ограничения, поскольку эти приложения чата могут отправлять и получать только асинхронные сообщения :
- Не могу использовать диалоги в сообщениях. Вместо этого используйте карточное сообщение .
- Невозможно обновить отдельные карточки с синхронным ответом. Вместо этого обновите все сообщение, вызвав метод
patch
.
На следующей схеме показана архитектура приложения Chat, созданного с помощью Pub/Sub:
На предыдущей диаграмме пользователь, взаимодействующий с приложением Pub/Sub Chat, имеет следующий поток информации:
Пользователь отправляет сообщение в Chat в приложение Chat либо в прямом сообщении, либо в пространстве Chat, либо событие происходит в пространстве Chat, на которое у приложения Chat имеется активная подписка .
Чат отправляет сообщение в тему Pub/Sub.
Сервер приложений, представляющий собой облачную или локальную систему, содержащую логику приложения Chat, подписывается на тему Pub/Sub, чтобы получать сообщения через брандмауэр.
При желании приложение Chat может вызывать API Chat для асинхронной публикации сообщений или выполнения других операций.
Предварительные условия
Джава
- Аккаунт Google Workspace с доступом к Google Chat .
- Проект Google Cloud .
- Убедитесь, что вы включили оплату для своего облачного проекта. Узнайте, как проверить платежный статус ваших проектов .
- Java 11 или выше.
- Апач Мавен
Настройте среду
Прежде чем использовать API Google, вам необходимо включить их в проекте Google Cloud. Вы можете включить один или несколько API в одном проекте Google Cloud.В консоли Google Cloud включите API Google Chat и API Pub/Sub.
Настройка публикации/подписки
Создайте тему Pub/Sub , в которую API чата сможет отправлять сообщения. Мы рекомендуем использовать одну тему для каждого приложения чата.
Предоставьте Chat разрешение на публикацию темы, назначив роль издателя Pub/Sub следующей учетной записи службы:
chat-api-push@system.gserviceaccount.com
Создайте учетную запись службы для приложения Chat, чтобы авторизоваться в Pub/Sub и Chat, и сохраните файл закрытого ключа в своем рабочем каталоге.
Создайте подписку по запросу на эту тему.
Назначьте роль подписчика Pub/Sub в подписке для ранее созданной учетной записи службы.
Напишите сценарий
Джава
В CLI укажите учетные данные учетной записи службы :
export GOOGLE_APPLICATION_CREDENTIALS=SERVICE_ACCOUNT_FILE_PATH
В своем рабочем каталоге создайте файл с именем
pom.xml
.В файл
pom.xml
вставьте следующий код:<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.google.chat.pubsub</groupId> <artifactId>java-pubsub-app</artifactId> <version>0.1.0</version> <name>java-pubsub-app</name> <properties> <maven.compiler.target>11</maven.compiler.target> <maven.compiler.source>11</maven.compiler.source> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>com.google.cloud</groupId> <artifactId>libraries-bom</artifactId> <version>26.26.0</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.9.1</version> </dependency> <dependency> <groupId>com.google.api-client</groupId> <artifactId>google-api-client</artifactId> <version>1.32.1</version> </dependency> <dependency> <groupId>com.google.cloud</groupId> <artifactId>google-cloud-pubsub</artifactId> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.14.2</version> </dependency> </dependencies> <build> <pluginManagement> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.0</version> </plugin> </plugins> </pluginManagement> </build> </project>
В вашем рабочем каталоге создайте структуру каталогов
src/main/java
.В каталоге
src/main/java
создайте файл с именемMain.java
.В
Main.java
вставьте следующий код:import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.JsonNodeFactory; import com.fasterxml.jackson.databind.node.ObjectNode; import com.google.api.client.googleapis.auth.oauth2.GoogleCredential; import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.http.ByteArrayContent; import com.google.api.client.http.GenericUrl; import com.google.api.client.http.HttpContent; import com.google.api.client.http.HttpRequest; import com.google.api.client.http.HttpRequestFactory; import com.google.api.client.http.HttpTransport; import com.google.cloud.pubsub.v1.AckReplyConsumer; import com.google.cloud.pubsub.v1.MessageReceiver; import com.google.cloud.pubsub.v1.Subscriber; import com.google.pubsub.v1.PubsubMessage; import com.google.pubsub.v1.ProjectSubscriptionName; import java.io.FileInputStream; import java.util.Collections; public class Main { public static final String CREDENTIALS_PATH_ENV_PROPERTY = "GOOGLE_APPLICATION_CREDENTIALS"; // Google Cloud Project ID public static final String PROJECT_ID = PROJECT_ID; // Cloud Pub/Sub Subscription ID public static final String SUBSCRIPTION_ID = SUBSCRIPTION_ID public static void main(String[] args) throws Exception { ProjectSubscriptionName subscriptionName = ProjectSubscriptionName.of(PROJECT_ID, SUBSCRIPTION_ID); // Instantiate app, which implements an asynchronous message receiver. EchoApp echoApp = new EchoApp(); // Create a subscriber for <var>SUBSCRIPTION_ID</var> bound to the message receiver final Subscriber subscriber = Subscriber.newBuilder(subscriptionName, echoApp).build(); System.out.println("Starting subscriber..."); subscriber.startAsync(); // Wait for termination subscriber.awaitTerminated(); } } / ** * A demo app which implements {@link MessageReceiver} to receive messages. It simply echoes the * incoming messages. */ class EchoApp implements MessageReceiver { // Path to the private key JSON file of the service account to be used for posting response // messages to Google Chat. // In this demo, we are using the same service account for authorizing with Cloud Pub/Sub to // receive messages and authorizing with Google Chat to post messages. If you are using // different service accounts, please set the path to the private key JSON file of the service // account used to post messages to Google Chat here. private static final String SERVICE_ACCOUNT_KEY_PATH = System.getenv(Main.CREDENTIALS_PATH_ENV_PROPERTY); // Developer code for Google Chat API scope. private static final String GOOGLE_CHAT_API_SCOPE = "https://www.googleapis.com/auth/chat.bot"; // Response URL Template with placeholders for space id. private static final String RESPONSE_URL_TEMPLATE = "https://chat.googleapis.com/v1/__SPACE_ID__/messages"; // Response echo message template. private static final String RESPONSE_TEMPLATE = "You said: `__MESSAGE__`"; private static final String ADDED_RESPONSE = "Thank you for adding me!"; GoogleCredential credential; HttpTransport httpTransport; HttpRequestFactory requestFactory; EchoApp() throws Exception { credential = GoogleCredential.fromStream(new FileInputStream(SERVICE_ACCOUNT_KEY_PATH)) .createScoped(Collections.singleton(GOOGLE_CHAT_API_SCOPE)); httpTransport = GoogleNetHttpTransport.newTrustedTransport(); requestFactory = httpTransport.createRequestFactory(credential); } // Called when a message is received by the subscriber. @Override public void receiveMessage(PubsubMessage pubsubMessage, AckReplyConsumer consumer) { System.out.println("Id : " + pubsubMessage.getMessageId()); // handle incoming message, then ack/nack the received message try { ObjectMapper mapper = new ObjectMapper(); JsonNode dataJson = mapper.readTree(pubsubMessage.getData().toStringUtf8()); System.out.println("Data : " + dataJson.toString()); handle(dataJson); consumer.ack(); } catch (Exception e) { System.out.println(e); consumer.nack(); } } public void handle(JsonNode eventJson) throws Exception { JsonNodeFactory jsonNodeFactory = new JsonNodeFactory(false); ObjectNode responseNode = jsonNodeFactory.objectNode(); // Construct the response depending on the event received. String eventType = eventJson.get("type").asText(); switch (eventType) { case "ADDED_TO_SPACE": responseNode.put("text", ADDED_RESPONSE); // An app can also be added to a space by @mentioning it in a message. In that case, we fall // through to the MESSAGE case and let the app respond. If the app was added using the // invite flow, we just post a thank you message in the space. if(!eventJson.has("message")) { break; } case "MESSAGE": responseNode.put("text", RESPONSE_TEMPLATE.replaceFirst( "__MESSAGE__", eventJson.get("message").get("text").asText())); // In case of message, post the response in the same thread. ObjectNode threadNode = jsonNodeFactory.objectNode(); threadNode.put("name", eventJson.get("message").get("thread").get("name").asText()); responseNode.put("thread", threadNode); break; case "REMOVED_FROM_SPACE": default: // Do nothing return; } // Post the response to Google Chat. String URI = RESPONSE_URL_TEMPLATE.replaceFirst( "__SPACE_ID__", eventJson.get("space").get("name").asText()); GenericUrl url = new GenericUrl(URI); HttpContent content = new ByteArrayContent("application/json", responseNode.toString().getBytes("UTF-8")); HttpRequest request = requestFactory.buildPostRequest(url, content); com.google.api.client.http.HttpResponse response = request.execute(); } }
Замените следующее:
-
PROJECT_ID
: идентификатор проекта Google Cloud. -
SUBSCRIPTION_ID
: идентификатор подписки для подписки Pub/Sub, которую вы создали ранее.
-
Опубликуйте приложение в чате
В консоли Google Cloud выберите > API и службы > Включенные API и службы > Google Chat API > Конфигурация .
Настройте приложение Chat для Pub/Sub:
- В поле «Имя приложения» введите
Quickstart App
. - В URL-адресе аватара введите
https://developers.google.com/chat/images/quickstart-app-avatar.png
. - В поле «Описание» введите
Quickstart app
. - В разделе «Функциональность» выберите «Получать сообщения 1:1» и «Присоединяться к группам и групповым беседам» .
- В разделе «Настройки подключения » выберите Cloud Pub/Sub и вставьте имя ранее созданной вами темы Pub/Sub.
- В разделе «Видимость » выберите «Сделать это приложение Google Chat доступным для определенных людей и групп в вашем домене» и введите свой адрес электронной почты.
- В разделе «Журналы» выберите «Записывать ошибки в журнал» .
- В поле «Имя приложения» введите
Нажмите Сохранить .
Приложение готово получать сообщения в чате и отвечать на них.
Запустите сценарий
В CLI перейдите в свой рабочий каталог и запустите скрипт:
Джава
mvn compile exec:java -Dexec.mainClass=Main
При запуске кода приложение начинает прослушивать сообщения, опубликованные в теме Pub/Sub.
Проверьте свое приложение чата
Чтобы протестировать приложение Chat, отправьте ему прямое сообщение:
- Откройте Google Чат .
- Чтобы отправить прямое сообщение в приложение, нажмите «Начать в чат» и в появившемся окне нажмите «Найти приложения» .
- В диалоговом окне «Найти приложения» найдите «Приложение быстрого запуска».
- Чтобы открыть прямое сообщение с помощью приложения, найдите приложение Quickstart и нажмите «Добавить» > «Чат» .
- В личном сообщении введите
Hello
и нажмитеenter
. Приложение чата вернет вам сообщение.
Устранение неполадок
Когда приложение или карточка Google Chat возвращает ошибку, в интерфейсе Chat отображается сообщение «Что-то пошло не так». или «Невозможно обработать ваш запрос». Иногда в пользовательском интерфейсе чата не отображается сообщение об ошибке, но приложение или карточка чата выдает неожиданный результат; например, сообщение с карточкой может не появиться.
Хотя сообщение об ошибке может не отображаться в пользовательском интерфейсе чата, доступны описательные сообщения об ошибках и данные журнала, которые помогут вам исправить ошибки, если включено ведение журнала ошибок для приложений чата. Информацию о просмотре, отладке и исправлении ошибок см. в разделе «Устранение неполадок и исправление ошибок Google Chat» .
похожие темы
Чтобы добавить дополнительные функции в приложение Chat, см. следующее: