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

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

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

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

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

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

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

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

পূর্বশর্ত

নোড.জেএস

পাইথন

জাভা

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

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

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

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

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

  5. Name ফিল্ডে Quickstart Webhook লিখুন।

  6. Avatar URL ফিল্ডে https://developers.google.com/chat/images/chat-product-icon.png লিখুন।

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

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

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

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

উদাহরণ ওয়েবহুক স্ক্রিপ্টটি ওয়েবহুক ইউআরএল-এ একটি POST রিকোয়েস্ট পাঠানোর মাধ্যমে, যে স্পেসে ওয়েবহুকটি রেজিস্টার করা আছে সেখানে একটি মেসেজ পাঠায়। চ্যাট এপিআই এর জবাবে Message এর একটি ইনস্ট্যান্স পাঠায়।

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

নোড.জেএস

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

  2. index.js ফাইলে নিচের কোডটি পেস্ট করুন:

    solutions/webhook-chat-app/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?key=KEY&token=TOKEN"
      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. আপনার ওয়ার্কিং ডিরেক্টরিতে quickstart.py নামে একটি ফাইল তৈরি করুন।

  2. quickstart.py ফাইলে নিচের কোডটি পেস্ট করুন:

    solutions/webhook-chat-app/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 ভেরিয়েবলের মানটি প্রতিস্থাপন করুন।

জাভা

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

  2. pom.xml ফাইলে নিচের অংশটি কপি করে পেস্ট করুন:

    solutions/webhook-chat-app/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>webhook-app</artifactId>
      <version>0.1.0</version>
      <name>webhook-app</name>
    
      <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 তে নিম্নলিখিত কোডটি পেস্ট করুন:

    solutions/webhook-chat-app/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/SPACE_ID/messages?key=KEY&token=TOKEN";
      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. ব্রাউজারে অ্যাপস স্ক্রিপ্ট- এ যান।

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

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

    solutions/webhook-chat-app/webhook.gs
    function webhook() {
      const url = "https://chat.googleapis.com/v1/spaces/SPACE_ID/messages?key=KEY&token=TOKEN"
      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-তে স্ক্রিপ্টটি চালান:

নোড.জেএস

  node index.js

পাইথন

  python3 quickstart.py

জাভা

  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 প্যারামিটারটি পাস করলে, চ্যাট নির্দিষ্ট threadKey ব্যবহার করে একটি বিদ্যমান থ্রেড খোঁজে। যদি একটি খুঁজে পাওয়া যায়, তাহলে বার্তাটি সেই থ্রেডের উত্তর হিসাবে পোস্ট করা হয়। যদি কোনোটি খুঁজে না পাওয়া যায়, তাহলে বার্তাটি সেই threadKey এর সাথে সঙ্গতিপূর্ণ একটি নতুন থ্রেড শুরু করে।

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

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

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

নোড.জেএস

solutions/webhook-chat-app/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));

পাইথন

solutions/webhook-chat-app/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()

জাভা

solutions/webhook-chat-app/src/main/java/com/google/chat/webhook/AppThread.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/SPACE_ID/messages?key=KEY&token=TOKEN&messageReplyOption=REPLY_MESSAGE_FALLBACK_TO_NEW_THREAD";
  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!",
      "thread", Map.of(
        "threadKey", "THREAD_KEY_VALUE"
      )
    ));

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

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

solutions/webhook-chat-app/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);
}

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

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

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

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

গুগল চ্যাট এপিআই ত্রুটিগুলোকে google.rpc.Status হিসেবে ফেরত দেয়, যার মধ্যে একটি HTTP ত্রুটি code থাকে যা সম্মুখীন হওয়া ত্রুটির ধরন নির্দেশ করে: একটি ক্লায়েন্ট ত্রুটি (৪০০ সিরিজ) বা একটি সার্ভার ত্রুটি (৫০০ সিরিজ)। সমস্ত HTTP ম্যাপিং পর্যালোচনা করতে, google.rpc.Code দেখুন।

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

HTTP স্ট্যাটাস কোড কীভাবে ব্যাখ্যা করতে হয় এবং ত্রুটি কীভাবে সামলাতে হয়, তা জানতে Errors দেখুন।

সীমাবদ্ধতা এবং বিবেচ্য বিষয়

  • গুগল চ্যাট এপিআই-তে ওয়েবহুক ব্যবহার করে মেসেজ তৈরি করার সময়, রেসপন্সে সম্পূর্ণ মেসেজটি থাকে না। রেসপন্সে শুধুমাত্র name এবং thread.name ফিল্ডগুলো পূরণ হয়।
  • ওয়েবহুকগুলো spaces.messages.create এর জন্য প্রতি-স্পেস কোটার অধীন: প্রতি সেকেন্ডে ১টি অনুরোধ, যা স্পেসের সমস্ত ওয়েবহুকের মধ্যে ভাগ করে দেওয়া হয়। একই স্পেসে প্রতি সেকেন্ডে ১টির বেশি কোয়েরি করা ওয়েবহুক অনুরোধ চ্যাট প্রত্যাখ্যানও করতে পারে। চ্যাট এপিআই কোটা সম্পর্কে আরও তথ্যের জন্য, ব্যবহারের সীমা (Usage limits) দেখুন।