ওয়েবহুক হিসেবে একটি Google Chat অ্যাপ তৈরি করুন

বাহ্যিক ট্রিগার ব্যবহার করে চ্যাট স্পেসে অ্যাসিঙ্ক্রোনাস মেসেজ পাঠানোর জন্য কীভাবে একটি ওয়েবহুক সেট আপ করতে হয় তা এই পৃষ্ঠায় বর্ণনা করা হয়েছে। উদাহরণস্বরূপ, সার্ভার ডাউন হয়ে গেলে চ্যাটে অন-কল কর্মীদের অবহিত করার জন্য আপনি একটি পর্যবেক্ষণ অ্যাপ্লিকেশন কনফিগার করতে পারেন। একটি চ্যাট অ্যাপের সাথে একটি সিঙ্ক্রোনাস বার্তা পাঠাতে, একটি বার্তা পাঠান দেখুন।

এই ধরনের আর্কিটেকচার ডিজাইনের সাথে, ব্যবহারকারীরা ওয়েবহুক বা সংযুক্ত বাহ্যিক অ্যাপ্লিকেশনের সাথে যোগাযোগ করতে পারে না কারণ যোগাযোগ একমুখী। ওয়েবহুক কথোপকথনমূলক নয়। তারা ব্যবহারকারী বা চ্যাট অ্যাপ ইন্টারঅ্যাকশন ইভেন্টের বার্তাগুলির প্রতিক্রিয়া বা গ্রহণ করতে পারে না। বার্তাগুলির প্রতিক্রিয়া জানাতে, ওয়েবহুকের পরিবর্তে একটি চ্যাট অ্যাপ তৈরি করুন

যদিও একটি ওয়েবহুক প্রযুক্তিগতভাবে একটি চ্যাট অ্যাপ নয়—ওয়েবহুকগুলি মানক HTTP অনুরোধগুলি ব্যবহার করে অ্যাপ্লিকেশনগুলিকে সংযুক্ত করে—এই পৃষ্ঠাটি এটিকে সরলীকরণের জন্য একটি চ্যাট অ্যাপ হিসাবে উল্লেখ করে৷ প্রতিটি ওয়েবহুক শুধুমাত্র সেই চ্যাট স্পেসে কাজ করে যেখানে এটি নিবন্ধিত আছে। ইনকামিং ওয়েবহুকগুলি সরাসরি বার্তাগুলিতে কাজ করে, তবে শুধুমাত্র যখন সমস্ত ব্যবহারকারীর চ্যাট অ্যাপগুলি সক্ষম থাকে৷ আপনি Google Workspace মার্কেটপ্লেসে ওয়েবহুক প্রকাশ করতে পারবেন না।

নিম্নলিখিত চিত্রটি চ্যাটের সাথে সংযুক্ত একটি ওয়েবহুকের আর্কিটেকচার দেখায়:

চ্যাটে অ্যাসিঙ্ক্রোনাস মেসেজ পাঠানোর জন্য ইনকামিং ওয়েবহুকের আর্কিটেকচার।

পূর্ববর্তী চিত্রে, একটি চ্যাট অ্যাপে নিম্নলিখিত তথ্যের প্রবাহ রয়েছে:

  1. চ্যাট অ্যাপ লজিক এক্সটার্নাল থার্ড-পার্টি পরিষেবা থেকে তথ্য পায়, যেমন প্রোজেক্ট ম্যানেজমেন্ট সিস্টেম বা টিকিটিংয়ের টুল।
  2. চ্যাট অ্যাপ লজিক একটি ক্লাউড বা অন-প্রিমিসেস সিস্টেমে হোস্ট করা হয় যা একটি নির্দিষ্ট চ্যাট স্পেসে ওয়েবহুক ইউআরএল ব্যবহার করে বার্তা পাঠাতে পারে।
  3. ব্যবহারকারীরা সেই নির্দিষ্ট চ্যাট স্পেসে চ্যাট অ্যাপ থেকে বার্তা পেতে পারে, কিন্তু চ্যাট অ্যাপের সাথে ইন্টারঅ্যাক্ট করতে অক্ষম।

পূর্বশর্ত

পাইথন

Node.js

জাভা

অ্যাপস স্ক্রিপ্ট

একটি ওয়েবহুক তৈরি করুন

একটি ওয়েবহুক তৈরি করতে, এটিকে চ্যাট স্পেসে নিবন্ধন করুন যেখানে আপনি বার্তা পেতে চান এবং তারপর একটি স্ক্রিপ্ট লিখুন যা বার্তা পাঠায়।

ইনকামিং ওয়েবহুক নিবন্ধন করুন

  1. একটি ব্রাউজারে, চ্যাট খুলুন। চ্যাট মোবাইল অ্যাপ থেকে ওয়েবহুক কনফিগার করা যায় না।
  2. আপনি একটি ওয়েবহুক যোগ করতে চান যেখানে স্থান যান.
  3. স্পেস শিরোনামের পাশে, expand more তীরটিতে ক্লিক করুন এবং তারপরে Apps & integrations এ ক্লিক করুন।
  4. অ্যাড ওয়েবহুক ক্লিক করুন।

  5. নাম ক্ষেত্রে, Quickstart Webhook লিখুন।

  6. Avatar URL ক্ষেত্রে, https://developers.google.com/chat/images/chat-product-icon.png লিখুন।

  7. Save এ ক্লিক করুন।

  8. ওয়েবহুক ইউআরএল কপি করতে, More এ ক্লিক করুন এবং তারপর Copy লিঙ্কে ক্লিক করুন।

ওয়েবহুক স্ক্রিপ্ট লিখুন

উদাহরণ ওয়েবহুক স্ক্রিপ্টটি ওয়েবহুক URL-এ একটি POST অনুরোধ পাঠিয়ে ওয়েবহুক নিবন্ধিত স্থানটিতে একটি বার্তা পাঠায়। চ্যাট এপিআই 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 ভেরিয়েবলের মানটিকে ওয়েবহুক ইউআরএল দিয়ে প্রতিস্থাপন করুন যা আপনি ওয়েবহুক নিবন্ধন করার সময় কপি করেছিলেন।

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 ভেরিয়েবলের মানটিকে ওয়েবহুক ইউআরএল দিয়ে প্রতিস্থাপন করুন যা আপনি ওয়েবহুক নিবন্ধন করার সময় কপি করেছিলেন।

জাভা

  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. একটি ব্রাউজারে, অ্যাপস স্ক্রিপ্টে যান।

  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-তে, স্ক্রিপ্টটি চালান:

পাইথন

  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 পাওয়া না গেলে থ্রেড আচরণ সংজ্ঞায়িত করুন:

    • একটি থ্রেডের উত্তর দিন বা একটি নতুন থ্রেড শুরু করুন। webhuok URL-এ messageReplyOption=REPLY_MESSAGE_FALLBACK_TO_NEW_THREAD প্যারামিটার যোগ করুন। এই URL প্যারামিটারটি পাস করার ফলে চ্যাট নির্দিষ্ট threadKey ব্যবহার করে একটি বিদ্যমান থ্রেড সন্ধান করতে পারে। যদি একটি পাওয়া যায়, তাহলে বার্তাটি সেই থ্রেডের উত্তর হিসাবে পোস্ট করে। যদি কোনটি পাওয়া না যায়, তাহলে বার্তাটি সেই threadKey সাথে সম্পর্কিত একটি নতুন থ্রেড শুরু করে।

    • একটি থ্রেডের উত্তর দিন বা কিছুই করবেন না। webhuok URL-এ messageReplyOption=REPLY_MESSAGE_OR_FAIL প্যারামিটার যোগ করুন। এই URL প্যারামিটারটি পাস করার ফলে চ্যাট নির্দিষ্ট 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

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