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

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

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

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

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

চ্যাটে অ্যাসিঙ্ক্রোনাস বার্তা পাঠানোর জন্য আগত ওয়েবহুকগুলির স্থাপত্য।

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

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

পূর্বশর্ত

পাইথন

নোড.জেএস

জাভা

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

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

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

আগত ওয়েবহুকটি নিবন্ধন করুন

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

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

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

  7. সংরক্ষণ করুন ক্লিক করুন।

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

    ওয়েবহুক URL-এ দুটি প্যারামিটার থাকে: key , ওয়েবহুকগুলির মধ্যে ভাগ করা একটি সাধারণ মান, এবং token যা একটি অনন্য মান যা আপনার ওয়েবহুকের নিরাপত্তা রক্ষার জন্য গোপন রাখতে হবে।

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

ওয়েবহুক স্ক্রিপ্টের উদাহরণটি ওয়েবহুক URL-এ একটি POST অনুরোধ পাঠিয়ে ওয়েবহুক নিবন্ধিত স্থানে একটি বার্তা পাঠায়। চ্যাট API Message এর একটি উদাহরণ দিয়ে সাড়া দেয়।

ওয়েবহুক স্ক্রিপ্ট তৈরি করতে শেখার জন্য একটি ভাষা নির্বাচন করুন:

পাইথন

  1. আপনার ওয়ার্কিং ডিরেক্টরিতে, quickstart.py নামে একটি ফাইল তৈরি করুন।

  2. 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 ভেরিয়েবলের মানটি webhook URL দিয়ে প্রতিস্থাপন করুন যা আপনি webhook নিবন্ধন করার সময় কপি করেছিলেন।

নোড.জেএস

  1. আপনার ওয়ার্কিং ডিরেক্টরিতে, index.js নামে একটি ফাইল তৈরি করুন।

  2. 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 ভেরিয়েবলের মানটি webhook URL দিয়ে প্রতিস্থাপন করুন যা আপনি webhook নিবন্ধন করার সময় কপি করেছিলেন।

জাভা

  1. আপনার ওয়ার্কিং ডিরেক্টরিতে, pom.xml নামে একটি ফাইল তৈরি করুন।

  2. 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 তে, নিম্নলিখিত কোডটি পেস্ট করুন:

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

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

  1. একটি ব্রাউজারে, Apps Script এ যান।

  2. নতুন প্রকল্পে ক্লিক করুন

  3. নিম্নলিখিত কোডটি পেস্ট করুন:

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

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

একটি CLI-তে, স্ক্রিপ্টটি চালান:

পাইথন

  python3 quickstart.py

নোড.জেএস

  node index.js

জাভা

  mvn compile exec:java -Dexec.mainClass=App

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

  • রান ক্লিক করুন।

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

একটি বার্তা থ্রেড শুরু করুন বা উত্তর দিন

  1. মেসেজ রিকোয়েস্ট বডির অংশ হিসেবে spaces.messages.thread.threadKey উল্লেখ করুন। আপনি থ্রেড শুরু করছেন নাকি উত্তর দিচ্ছেন তার উপর নির্ভর করে, threadKey জন্য নিম্নলিখিত মানগুলি ব্যবহার করুন:

    • যদি আপনি একটি থ্রেড শুরু করেন, threadKey একটি ইচ্ছামত স্ট্রিং এ সেট করুন, কিন্তু থ্রেডে একটি উত্তর পোস্ট করার জন্য এই মানটি মনে রাখবেন।

    • যদি আপনি কোন থ্রেডে উত্তর দিচ্ছেন, তাহলে থ্রেড শুরু করার সময় যে threadKey সেট করা হয়েছিল তা উল্লেখ করুন। উদাহরণস্বরূপ, যে থ্রেডে প্রাথমিক বার্তায় MY-THREAD ব্যবহার করা হয়েছে সেখানে একটি উত্তর পোস্ট করতে, MY-THREAD সেট করুন।

  2. নির্দিষ্ট threadKey না পাওয়া গেলে থ্রেড আচরণ নির্ধারণ করুন:

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

    • একটি থ্রেডের উত্তর দিন অথবা কিছুই করবেন না। ওয়েবহুক URL-এ messageReplyOption=REPLY_MESSAGE_OR_FAIL প্যারামিটার যোগ করুন। এই URL প্যারামিটারটি পাস করলে Chat নির্দিষ্ট threadKey ব্যবহার করে একটি বিদ্যমান থ্রেড খুঁজবে। যদি একটি পাওয়া যায়, তাহলে বার্তাটি সেই থ্রেডের উত্তর হিসেবে পোস্ট হবে। যদি কোনওটি না পাওয়া যায়, তাহলে বার্তাটি পাঠানো হবে না।

    আরও জানতে, messageReplyOption দেখুন।

নিম্নলিখিত কোড নমুনাটি একটি বার্তা থ্রেড শুরু করে বা উত্তর দেয়:

পাইথন

পাইথন/ওয়েবহুক/থ্রেড-রিপ্লাই.পি
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()

নোড.জেএস

নোড/ওয়েবহুক/থ্রেড-রিপ্লাই.জেএস
/**
 * 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));

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

অ্যাপস-স্ক্রিপ্ট/ওয়েবহুক/থ্রেড-রিপ্লাই.জিএস
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);
}

ত্রুটিগুলি পরিচালনা করুন

ওয়েবহুক অনুরোধ বিভিন্ন কারণে ব্যর্থ হতে পারে, যার মধ্যে রয়েছে:

  • অবৈধ অনুরোধ।
  • ওয়েবহুক বা ওয়েবহুক হোস্টিং স্পেস মুছে ফেলা হবে।
  • নেটওয়ার্ক সংযোগ বা কোটা সীমার মতো মাঝেমধ্যে সমস্যা।

আপনার ওয়েবহুক তৈরি করার সময়, আপনার ত্রুটিগুলি যথাযথভাবে পরিচালনা করা উচিত:

Google Chat API ত্রুটিগুলিকে google.rpc.Status হিসাবে ফেরত পাঠায়, যার মধ্যে একটি HTTP ত্রুটি code থাকে যা সম্মুখীন হওয়া ত্রুটির ধরণ নির্দেশ করে: একটি ক্লায়েন্ট ত্রুটি (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 এর জন্য প্রতি-স্পেস কোটা সাপেক্ষে: স্পেসের সমস্ত ওয়েবহুকের মধ্যে ভাগ করা প্রতি সেকেন্ডে 1টি অনুরোধ। একই স্পেসে প্রতি সেকেন্ডে 1টি কোয়েরির বেশি হলে চ্যাট ওয়েবহুক অনুরোধ প্রত্যাখ্যান করতে পারে। চ্যাট API কোটা সম্পর্কে আরও তথ্যের জন্য, ব্যবহারের সীমা দেখুন।