수신 웹훅을 사용하여 Google Chat에 메시지 보내기

수신 웹훅을 사용하면 Chat 앱이 아닌 애플리케이션에서 Google Chat으로 비동기 메시지를 보낼 수 있습니다. 예를 들어 서버가 다운될 때 Google Chat에서 대기 중인 직원에게 알리도록 모니터링 애플리케이션을 구성할 수 있습니다.

Chat 앱을 사용하여 Chat 스페이스에서 메시지를 비동기식으로 전송, 업데이트 또는 삭제하려면 메시지 생성, 읽기, 업데이트, 삭제를 참고하세요.

수신 웹훅이 Google Chat에 메시지를 보내는 방법을 보여주는 다이어그램

기본 요건

이 가이드의 예를 실행하려면 다음이 필요합니다.

Python

  • Python 3.10.7 이상
  • 인터넷 및 웹브라우저 액세스
  • Google Chat에 액세스할 수 있는 Google Workspace 계정
  • 기존 Google Chat 스페이스
  • httplib2 라이브러리 필요한 경우 다음 명령줄 인터페이스 (CLI) 명령어를 실행하여 pip를 사용하여 라이브러리를 설치합니다.

    pip install httplib2
    

Node.js

Apps Script

  • 인터넷 및 웹브라우저 액세스
  • Google Chat에 액세스할 수 있는 Google Workspace 계정
  • 기존 Google Chat 스페이스

자바

웹훅 만들기

웹훅을 만들려면 메시지를 수신할 Google Chat 스페이스에 웹훅을 등록한 다음 메시지를 전송하는 스크립트를 작성합니다.

1단계: 수신 웹훅 등록하기

  1. 웹브라우저에서 Google Chat을 엽니다.
  2. 웹훅을 추가하려는 스페이스로 이동합니다.
  3. 상단의 스페이스 제목 옆에 있는 아래쪽 화살표 > 웹훅 관리 아이콘 웹훅 관리를 클릭합니다.
  4. 스페이스에 이미 다른 웹훅이 있는 경우 다른 웹훅 추가를 클릭합니다. 그 이외의 경우 이 단계를 건너뛰세요.
  5. 이름에 '빠른 시작 웹훅'을 입력합니다.
  6. 아바타 URLhttps://developers.google.com/chat/images/chat-product-icon.png를 입력합니다.
  7. 저장을 클릭합니다.
  8. 복사를 클릭하여 전체 웹훅 URL을 복사합니다.
  9. 상자 외부를 클릭하여 수신 웹훅 대화상자를 닫습니다.

2단계: 웹훅 스크립트 작성

예시 웹훅 스크립트는 웹훅 URL에 create message 요청을 POST하여 웹훅이 등록된 공간에 메시지를 게시합니다. Google Chat API는 Message의 인스턴스로 응답합니다.

웹훅 스크립트를 만드는 방법에 대한 구체적인 안내를 보려면 아래에서 언어를 선택하세요.

Python

  1. 작업 디렉터리에서 이름이 quickstart.py인 파일을 만듭니다.

  2. quickstart.py에서 다음 코드를 복사하여 붙여넣습니다.

    python/webhook/quickstart.py
    from json import dumps
    
    from httplib2 import Http
    
    
    def main():
        """Hangouts Chat incoming webhook quickstart."""
        url = 'https://chat.googleapis.com/v1/spaces/7D8la4AAAAE/messages?key=' \
              'AIzaSyDdI0hCZtE6vySjMm-WEfRq3CPzqKqqsHI&token=' \
              'HulDviWFMz6R5FW-GwlO4INCW1cZGDDExuWVaEbbr_g%3D'
        bot_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(bot_message),
        )
        print(response)
    
    
    if __name__ == '__main__':
        main()
  3. url 변수의 값을 1단계: 수신 웹훅 등록에서 복사한 웹훅 URL로 바꿉니다.

Node.js

  1. 작업 디렉터리에서 이름이 index.js인 파일을 만듭니다.

  2. index.js에서 다음 코드를 복사하여 붙여넣습니다.

    노드/웹훅/index.js
    /**
     * Sends asynchronous message into Google Chat
     * @return{obj} response
     */
    function webhook() {
      const fetch = require('node-fetch');
      const webhookURL = 'https://chat.googleapis.com/v1/spaces/AAAAGCYeSRY/messages?key=AIzaSyDdI0hCZtE6vySjMm-WEfRq3CPzqKqqsHI&token=u9IG_MuTBXw-tnqupPrPNinY2spKFcRBDp6dSldGUAw%3D';
    
      const data = JSON.stringify({
        'text': 'Hello from a Node script!',
      });
      let resp;
      fetch(webhookURL, {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json; charset=UTF-8',
        },
        body: data,
      }).then((response) => {
        resp = response;
        console.log(response);
      });
      return resp;
    }
    
  3. webhookURL 변수의 값을 1단계: 수신 웹훅 등록에서 복사한 웹훅 URL로 바꿉니다.

Apps Script

  1. Apps Script 페이지로 이동합니다.

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

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

    apps-script/webhook/webhook.gs
    function webhook() {
      const url = "https://chat.googleapis.com/v1/spaces/AAAAGCYeSRY/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);
      Logger.log(response);
    }
  4. url 변수의 값을 1단계: 수신 웹훅 등록에서 복사한 웹훅 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.hangouts.chat.webhook</groupId>
      <artifactId>java-webhook-app</artifactId>
      <version>0.1.0</version>
    
      <name>java-webhook-app</name>
      <url>https://github.com/googleworkspace/hangouts-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/hangouts/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단계: 수신 웹훅 등록에서 복사한 웹훅 URL로 바꿉니다.

3단계: 웹훅 스크립트 실행

CLI의 작업 디렉터리에서 다음 명령어를 실행하여 샘플을 실행합니다.

Python

  python3 quickstart.py

Node.js

  node index.js

Apps Script

  • 실행을 클릭합니다.

자바

  mvn compile exec:java -Dexec.mainClass=App

샘플 코드를 실행하면 웹훅에서 코드를 등록한 공간에 메시지를 보냅니다.

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

메시지 URL을 시작하거나 threadKey 매개변수를 웹훅 URL에 추가하여 답장할 수 있습니다. 각 threadKey는 이를 설정하는 앱마다 고유합니다. 서로 다른 두 Chat 앱 또는 웹훅에서 동일한 threadKey을 설정하면 서로 다른 두 스레드가 시작됩니다.

메시지 대화목록 시작하기

웹훅을 사용하여 스레드의 첫 번째 메시지를 게시하려면 웹훅 URL에 threadKey 매개변수를 추가하세요. threadKey를 임의의 문자열로 설정하되 무엇인지 기억합니다. 스레드에 응답을 게시하려면 다시 지정해야 합니다.

  https://chat.googleapis.com/v1/spaces/SPACE_ID/messages?threadKey=ARBITRARY_STRING

메시지 대화목록에 답장하기

기존 메시지 스레드에 메시지를 보내려면 threadKey 매개변수를 스레드를 시작하는 데 사용되는 값으로 설정된 웹훅 URL에 추가합니다. 예를 들어 다음 URL에 메시지를 보내면 threadKeyMY-THREAD인 대화목록에 답장이 게시됩니다.

  https://chat.googleapis.com/v1/spaces/SPACE_ID/messages?threadKey=MY-THREAD

제한사항 및 고려사항

웹훅을 구성할 때 다음 한도와 고려사항에 유의하세요.

  • 각 웹훅은 등록된 Chat 스페이스에서만 작동합니다.

  • Google Workspace Marketplace에 웹훅을 게시할 수 없습니다.

  • 웹훅은 대화형이 아닙니다. Google Chat의 사용자 또는 이벤트에 응답하거나 메시지를 받을 수 없습니다.

  • 도메인의 조직 단위 (OU)에만 Chat 앱을 사용 설정한 경우 수신 웹훅이 다음 오류를 반환합니다.

    {
      "error": {
        "code": 403,
        "message": "The caller does not have permission",
        "status": "PERMISSION_DENIED"
      }
    }
    
  • 수신 웹훅은 채팅 메시지에서 작동하지만 모든 사용자가 Chat 앱을 사용 설정한 경우에만 작동합니다.

  • 웹훅 관리 아이콘 웹훅 관리는 웹브라우저에서만 사용할 수 있으므로 Chat 웹 앱에서 웹훅을 설정해야 합니다. Chat 모바일 앱에서는 웹훅을 구성할 수 없습니다.