Создайте приложение Google Chat в качестве веб-перехватчика.

На этой странице описано, как настроить веб-перехватчик для отправки асинхронных сообщений в пространство чата с использованием внешних триггеров. Например, вы можете настроить приложение мониторинга для уведомления дежурного персонала в чате при выходе из строя сервера. Чтобы отправить синхронное сообщение с помощью приложения Chat, см. раздел «Отправка сообщения» .

При таком типе архитектуры пользователи не могут взаимодействовать с веб-перехватчиком или подключенным внешним приложением, поскольку связь является односторонней. Вебхуки не являются диалоговыми. Они не могут отвечать или получать сообщения от пользователей или события взаимодействия с приложением чата . Чтобы отвечать на сообщения, создайте приложение чата вместо веб-перехватчика.

Хотя веб-перехватчик технически не является приложением чата — веб-перехватчики соединяют приложения с помощью стандартных HTTP-запросов, — на этой странице для упрощения он называется приложением чата. Каждый вебхук работает только в том пространстве чата, в котором он зарегистрирован. Входящие веб-перехватчики работают в личных сообщениях, но только если у всех пользователей включены приложения Chat . Вы не можете публиковать вебхуки в Google Workspace Marketplace.

На следующей схеме показана архитектура веб-перехватчика, подключенного к Chat:

Архитектура входящих веб-перехватчиков для отправки асинхронных сообщений в Chat.

На предыдущей диаграмме приложение Chat имеет следующий поток информации:

  1. Логика приложения Chat получает информацию от внешних сторонних сервисов, таких как система управления проектами или инструмент для продажи билетов.
  2. Логика приложения Chat размещается либо в облаке, либо в локальной системе, которая может отправлять сообщения с помощью URL-адреса веб-перехватчика в определенное пространство Chat.
  3. Пользователи могут получать сообщения из приложения Chat в этом конкретном пространстве Chat, но не могут взаимодействовать с приложением Chat.

Предварительные условия

Питон

Node.js

Ява

Скрипт приложений

Создать вебхук

Чтобы создать вебхук, зарегистрируйте его в пространстве чата, где вы хотите получать сообщения, а затем напишите сценарий, отправляющий сообщения.

Зарегистрируйте входящий вебхук

  1. В браузере откройте Чат . Веб-перехватчики невозможно настроить в мобильном приложении Chat.
  2. Перейдите в пространство, куда вы хотите добавить вебхук.
  3. Рядом с названием раздела нажмите стрелку и выберите «Приложения и интеграции» .
  4. Нажмите веб-перехватчики» .

  5. В поле Имя введите Quickstart Webhook .

  6. В поле URL-адрес аватара введите https://developers.google.com/chat/images/chat-product-icon.png .

  7. Нажмите Сохранить .

  8. Чтобы скопировать URL-адрес веб-перехватчика, нажмите Еще , а затем нажмите Копировать ссылку .

Напишите скрипт вебхука

Пример сценария веб-перехватчика отправляет сообщение в пространство, в котором зарегистрирован веб-перехватчик, отправляя запрос POST на URL-адрес веб-перехватчика. Chat API отвечает экземпляром Message .

Выберите язык, чтобы узнать, как создать скрипт веб-перехватчика:

Питон

  1. В своем рабочем каталоге создайте файл с именем quickstart.py .

  2. В quickstart.py вставьте следующий код:

    python/webhook/quickstart.py
    from json import dumps
    from httplib2 import Http
    
    # Copy the webhook URL from the Chat space where the webhook is registered.
    # The values for SPACE_ID, KEY, and TOKEN are set by Chat, and are included
    # when you copy the webhook URL.
    
    def main():
        """Google Chat incoming webhook quickstart."""
        url = "https://chat.googleapis.com/v1/spaces/SPACE_ID/messages?key=KEY&token=TOKEN"
        app_message = {"text": "Hello from a Python script!"}
        message_headers = {"Content-Type": "application/json; charset=UTF-8"}
        http_obj = Http()
        response = http_obj.request(
            uri=url,
            method="POST",
            headers=message_headers,
            body=dumps(app_message),
        )
        print(response)
    
    
    if __name__ == "__main__":
        main()
  3. Замените значение переменной url URL-адресом веб-перехватчика, который вы скопировали при регистрации веб-перехватчика.

Node.js

  1. В своем рабочем каталоге создайте файл с именем index.js .

  2. В index.js вставьте следующий код:

    узел/вебхук/index.js
    /**
     * Sends asynchronous message to Google Chat
     * @return {Object} response
     */
    async function webhook() {
      const url = "https://chat.googleapis.com/v1/spaces/SPACE_ID/messages"
      const res = await fetch(url, {
        method: "POST",
        headers: {"Content-Type": "application/json; charset=UTF-8"},
        body: JSON.stringify({text: "Hello from a Node script!"})
      });
      return await res.json();
    }
    
    webhook().then(res => console.log(res));
  3. Замените значение переменной url URL-адресом веб-перехватчика, который вы скопировали при регистрации веб-перехватчика.

Ява

  1. В своем рабочем каталоге создайте файл с именем pom.xml .

  2. В pom.xml скопируйте и вставьте следующее:

    java/webhook/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.webhook</groupId>
      <artifactId>java-webhook-app</artifactId>
      <version>0.1.0</version>
    
      <name>java-webhook-app</name>
      <url>https://github.com/googleworkspace/google-chat-samples/tree/main/java/webhook</url>
    
      <properties>
        <maven.compiler.target>11</maven.compiler.target>
        <maven.compiler.source>11</maven.compiler.source>
      </properties>
    
      <dependencies>
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.9.1</version>
        </dependency>
      </dependencies>
    
      <build>
        <pluginManagement>
          <plugins>
            <plugin>
              <artifactId>maven-compiler-plugin</artifactId>
              <version>3.8.0</version>
            </plugin>
          </plugins>
        </pluginManagement>
      </build>
    </project>
  3. В своем рабочем каталоге создайте следующую структуру каталогов src/main/java .

  4. В каталоге src/main/java создайте файл с именем App.java .

  5. В App.java вставьте следующий код:

    java/webhook/src/main/java/com/google/chat/webhook/App.java
    import com.google.gson.Gson;
    import java.net.http.HttpClient;
    import java.net.http.HttpRequest;
    import java.net.http.HttpResponse;
    import java.util.Map;
    import java.net.URI;
    
    public class App {
      private static final String URL = "https://chat.googleapis.com/v1/spaces/AAAAGCYeSRY/messages";
      private static final Gson gson = new Gson();
      private static final HttpClient client = HttpClient.newHttpClient();
    
      public static void main(String[] args) throws Exception {
        String message = gson.toJson(Map.of("text", "Hello from Java!"));
    
        HttpRequest request = HttpRequest.newBuilder(URI.create(URL))
          .header("accept", "application/json; charset=UTF-8")
          .POST(HttpRequest.BodyPublishers.ofString(message)).build();
    
        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
    
        System.out.println(response.body());
      }
    }
  6. Замените значение переменной URL -адресом веб-перехватчика, который вы скопировали при регистрации веб-перехватчика.

Скрипт приложений

  1. В браузере перейдите в Apps Script .

  2. Нажмите «Новый проект».

  3. Вставьте следующий код:

    приложения-script/webhook/webhook.gs
    function webhook() {
      const url = "https://chat.googleapis.com/v1/spaces/SPACE_ID/messages"
      const options = {
        "method": "post",
        "headers": {"Content-Type": "application/json; charset=UTF-8"},
        "payload": JSON.stringify({"text": "Hello from Apps Script!"})
      };
      const response = UrlFetchApp.fetch(url, options);
      console.log(response);
    }
  4. Замените значение переменной url URL-адресом веб-перехватчика, который вы скопировали при регистрации веб-перехватчика.

Запустите скрипт вебхука

В CLI запустите скрипт:

Питон

  python3 quickstart.py

Node.js

  node index.js

Ява

  mvn compile exec:java -Dexec.mainClass=App

Скрипт приложений

  • Нажмите «Выполнить» .

Когда вы запускаете код, вебхук отправляет сообщение в пространство, в котором вы его зарегистрировали.

Начать ветку сообщений или ответить на нее

  1. Укажите spaces.messages.thread.threadKey как часть тела запроса сообщения. В зависимости от того, начинаете ли вы обсуждение или отвечаете на него, используйте следующие значения для threadKey :

    • При запуске потока установите для threadKey произвольную строку, но запишите это значение, чтобы опубликовать ответ в потоке.

    • При ответе в ветку укажите threadKey , который был установлен при запуске ветки. Например, чтобы опубликовать ответ в теме, в которой исходное сообщение использовало MY-THREAD , установите MY-THREAD .

  2. Определите поведение потока, если указанный threadKey не найден:

    • Ответьте на тему или создайте новую тему. Добавьте параметр messageReplyOption=REPLY_MESSAGE_FALLBACK_TO_NEW_THREAD в URL-адрес веб-перехватчика. Передача этого параметра URL-адреса заставляет Chat искать существующую ветку, используя указанный threadKey . Если он найден, сообщение публикуется как ответ на этот поток. Если ничего не найдено, сообщение запускает новый поток, соответствующий этому threadKey .

    • Ответьте в теме или ничего не делайте. Добавьте параметр messageReplyOption=REPLY_MESSAGE_OR_FAIL в URL-адрес веб-перехватчика. Передача этого параметра URL-адреса заставляет Chat искать существующую ветку, используя указанный threadKey . Если он найден, сообщение публикуется как ответ на этот поток. Если ничего не найдено, сообщение не отправляется.

    Чтобы узнать больше, см. messageReplyOption .

Следующий пример кода запускает цепочку сообщений или отвечает на нее:

Питон

python/webhook/thread-reply.py
from json import dumps
from httplib2 import Http

# Copy the webhook URL from the Chat space where the webhook is registered.
# The values for SPACE_ID, KEY, and TOKEN are set by Chat, and are included
# when you copy the webhook URL.
#
# Then, append messageReplyOption=REPLY_MESSAGE_FALLBACK_TO_NEW_THREAD to the
# webhook URL.


def main():
    """Google Chat incoming webhook that starts or replies to a message thread."""
    url = "https://chat.googleapis.com/v1/spaces/SPACE_ID/messages?key=KEY&token=TOKEN&messageReplyOption=REPLY_MESSAGE_FALLBACK_TO_NEW_THREAD"
    app_message = {
        "text": "Hello from a Python script!",
        # To start a thread, set threadKey to an arbitratry string.
        # To reply to a thread, specify that thread's threadKey value.
        "thread": {"threadKey": "THREAD_KEY_VALUE"},
    }
    message_headers = {"Content-Type": "application/json; charset=UTF-8"}
    http_obj = Http()
    response = http_obj.request(
        uri=url,
        method="POST",
        headers=message_headers,
        body=dumps(app_message),
    )
    print(response)


if __name__ == "__main__":
    main()

Node.js

узел/вебхук/thread-reply.js
/**
 * Sends asynchronous message to Google Chat
 * @return {Object} response
 */
async function webhook() {
  const url = "https://chat.googleapis.com/v1/spaces/SPACE_ID/messages?key=KEY&token=TOKEN&messageReplyOption=REPLY_MESSAGE_FALLBACK_TO_NEW_THREAD"
  const res = await fetch(url, {
    method: "POST",
    headers: {"Content-Type": "application/json; charset=UTF-8"},
    body: JSON.stringify({
      text: "Hello from a Node script!",
      thread: {threadKey: "THREAD_KEY_VALUE"}
    })
  });
  return await res.json();
}

webhook().then(res => console.log(res));

Скрипт приложений

приложения-скрипт/webhook/thread-reply.gs
function webhook() {
  const url = "https://chat.googleapis.com/v1/spaces/SPACE_ID/messages?key=KEY&token=TOKEN&messageReplyOption=REPLY_MESSAGE_FALLBACK_TO_NEW_THREAD"
  const options = {
    "method": "post",
    "headers": {"Content-Type": "application/json; charset=UTF-8"},
    "payload": JSON.stringify({
      "text": "Hello from Apps Script!",
      "thread": {"threadKey": "THREAD_KEY_VALUE"}
    })
  };
  const response = UrlFetchApp.fetch(url, options);
  console.log(response);
}

Обработка ошибок

Запросы веб-перехватчика могут завершиться неудачей по ряду причин, в том числе:

  • Неверный запрос.
  • Вебхук или пространство, в котором размещен вебхук, удаляются.
  • Периодические проблемы, такие как сетевое подключение или ограничения квот.

При создании вебхука вам следует соответствующим образом обрабатывать ошибки следующим образом:

API Google Chat возвращает ошибки в виде google.rpc.Status , который включает code ошибки HTTP, указывающий тип возникшей ошибки: ошибка клиента (серия 400) или ошибка сервера (серия 500). Чтобы просмотреть все сопоставления HTTP, см. google.rpc.Code .

{
    "code": 503,
    "message": "The service is currently unavailable.",
    "status": "UNAVAILABLE"
}

Чтобы узнать, как интерпретировать коды состояния HTTP и обрабатывать ошибки, см. раздел Ошибки .

Ограничения и соображения

  • При создании сообщения с помощью веб-перехватчика в Google Chat API ответ не содержит полного сообщения. Ответ заполняет только поля name и thread.name .
  • На веб-перехватчики распространяется ограничение на количество запросов в пространстве spaces.messages.create , равное 60 за 60 секунд, которое используется всеми приложениями чата в пространстве. Дополнительную информацию о квотах Chat API см. в разделе Ограничения использования .