Google Chat 앱을 웹훅으로 빌드하기

이 페이지에서는 비동기 메시지를 외부 트리거를 사용하는 Chat 스페이스 예를 들어 모니터링 애플리케이션을 구성하여 긴급 대기 직원에게 서버가 다운되면 채팅 동기 메시지 전송 자세한 내용은 메시지 보내기

이러한 유형의 아키텍처를 사용하면 사용자가 웹훅이나 연결된 외부 통신이 단방향이기 때문입니다. 웹훅은 대화형이 아닙니다. 사용자 또는 사용자의 메시지에 응답하거나 메시지를 받을 수 없습니다. Chat 앱 상호작용 이벤트. 메시지에 응답하려면 다음 단계를 따르세요. 채팅 앱 빌드 사용할 수 있습니다

기술적으로 웹훅은 채팅 앱—웹훅은 표준 HTTP 요청 - 이 페이지에서는 간소화하는 것이 좋습니다 각 웹훅은 다음의 Chat 스페이스에서만 작동합니다. 이메일 주소를 입력하면 됩니다. 수신 웹훅은 채팅 메시지에서 작동하지만 모든 사용자가 채팅 앱 사용 설정: Google Workspace Marketplace에 웹훅을 게시할 수 없습니다.

다음 다이어그램은 Google Cloud 서비스에 연결된 웹훅의 아키텍처를 보여줍니다. 채팅:

Chat에 비동기 메시지를 보내기 위한 수신 웹훅의 아키텍처

앞의 다이어그램에서 채팅 앱에는 다음이 있습니다. 정보의 흐름이 있습니다.

  1. 채팅 앱 로직은 외부 서드 파티 서비스(예: 프로젝트 관리 시스템 또는 티켓 판매 도구
  2. 채팅 앱 로직은 클라우드 또는 메시지를 보낼 수 있는 온프레미스 시스템에 확인할 수 있습니다
  3. 사용자는 다음에서 채팅 앱의 메시지를 받을 수 있습니다. 특정 Chat 스페이스와 상호작용할 수 없는 채팅 앱

기본 요건

Python

  • 비즈니스 또는 기업 다음 액세스 권한이 있는 Google Workspace 계정 Google Chat Google Workspace 조직에서 사용자가 수신 웹훅 추가 및 사용
  • Python 3.6 이상
  • pip 패키지 관리 도구
  • httplib2 라이브러리. 라이브러리를 설치하려면 명령줄 인터페이스에서 다음 명령어를 실행합니다.

    pip install httplib2
    
  • Google Chat 스페이스 Google Chat API를 사용하여 채팅을 만들려면 다음을 참고하세요. 스페이스 만들기 Chat에서 계정을 만들려면 다음 단계를 따르세요. 다음 페이지를 방문하세요. 고객센터 문서

Node.js

자바

Apps Script

웹훅 만들기

웹훅을 만들려면 원하는 Chat 스페이스에 등록하세요. 메시지를 수신하는 스크립트를 작성해야 합니다.

수신 웹훅 등록

  1. 브라우저에서 채팅. Chat 모바일 앱에서는 웹훅을 구성할 수 없습니다.
  2. 웹훅을 추가할 스페이스로 이동합니다.
  3. 스페이스 제목 옆에 있는 더보기 화살표를 펼친 다음 앱 & 통합을 참조하세요.
  4. Add webhooks(웹훅 추가)를 클릭합니다.

  5. 이름 필드에 Quickstart Webhook를 입력합니다.

  6. 아바타 URL 입력란에 https://developers.google.com/chat/images/chat-product-icon.png입니다.

  7. 저장을 클릭합니다.

  8. 웹훅 URL을 복사하려면 다음을 클릭하세요. More를 클릭한 다음 링크 복사.

웹훅 스크립트 작성

예시 웹훅 스크립트는 웹훅이 실행되고 있는 공간에 메시지를 전송합니다. 웹훅 URL에 POST 요청을 전송하여 등록할 수 있습니다. 이 Chat API는 Message

웹훅 스크립트를 만드는 방법을 알아보려면 언어를 선택하세요.

Python

  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에 다음 코드를 붙여넣습니다.

    node/webhook/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 변수의 값을 복사됩니다.

Apps Script

  1. 브라우저에서 다음으로 이동합니다. Apps Script.

  2. 새 프로젝트를 클릭합니다.

  3. 다음 코드를 붙여넣습니다.

    apps-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 변수의 값을 복사됩니다.

웹훅 스크립트 실행

CLI에서 스크립트를 실행합니다.

Python

  python3 quickstart.py

Node.js

  node index.js

자바

  mvn compile exec:java -Dexec.mainClass=App

Apps Script

  • 실행을 클릭합니다.

코드를 실행하면 웹훅은 코드가 실행된 스페이스로 메시지를 등록했습니다.

메시지 대화목록 시작 또는 답장

  1. 지정 spaces.messages.thread.threadKey 드림 메시지 요청 본문의 일부로 제공해야 합니다. Cloud Functions를 시작하거나 대화목록에 답장할 때는 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

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

node/webhook/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));

Apps Script

apps-script/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);
}