সেট আপ করুন এবং পুশ বিজ্ঞপ্তি গ্রহণ করুন

যখন ডেটা ফর্মগুলিতে পরিবর্তন হয় তখন আপনি বিজ্ঞপ্তিগুলি পেতে ঘড়ি সংগ্রহের পদ্ধতিগুলি ব্যবহার করতে পারেন৷ এই পৃষ্ঠাটি পুশ বিজ্ঞপ্তিগুলি সেট আপ এবং গ্রহণ করার জন্য একটি ধারণাগত ওভারভিউ এবং নির্দেশাবলী প্রদান করে৷

ওভারভিউ

Google ফর্ম এপিআই পুশ নোটিফিকেশন বৈশিষ্ট্য অ্যাপ্লিকেশনগুলিকে যখন ফর্মগুলিতে ডেটা পরিবর্তন হয় তখন বিজ্ঞপ্তিগুলিতে সদস্যতা নিতে দেয়৷ বিজ্ঞপ্তিগুলি একটি ক্লাউড পাব/সাব বিষয়ে বিতরণ করা হয়, সাধারণত পরিবর্তনের কয়েক মিনিটের মধ্যে৷

পুশ বিজ্ঞপ্তিগুলি পেতে, আপনাকে একটি ক্লাউড পাব/সাব বিষয় সেট আপ করতে হবে এবং উপযুক্ত ইভেন্ট প্রকারের জন্য একটি ঘড়ি তৈরি করার সময় সেই বিষয়ের নাম প্রদান করতে হবে৷

নীচে এই ডকুমেন্টেশনে ব্যবহৃত মূল ধারণাগুলির সংজ্ঞা দেওয়া হল:

  • লক্ষ্য হল এমন একটি জায়গা যেখানে বিজ্ঞপ্তি পাঠানো হয়। একমাত্র সমর্থিত লক্ষ্য হল একটি ক্লাউড পাব/সাব বিষয়।
  • একটি ইভেন্টের ধরন হল বিজ্ঞপ্তিগুলির একটি বিভাগ যা একটি তৃতীয় পক্ষের অ্যাপ্লিকেশন সদস্যতা নিতে পারে৷
  • একটি ঘড়ি হল একটি নির্দিষ্ট ফর্মের একটি নির্দিষ্ট ইভেন্ট প্রকারের জন্য একটি লক্ষ্যে বিজ্ঞপ্তি সরবরাহ করার জন্য ফর্ম API-এর একটি নির্দেশ৷

একবার আপনি একটি নির্দিষ্ট ফর্মে একটি ইভেন্ট টাইপের জন্য একটি ঘড়ি তৈরি করলে, ঘড়ির টার্গেট (যা একটি ক্লাউড পাব/সাব বিষয়) সেই ফর্মের ইভেন্টগুলি থেকে ঘড়ির মেয়াদ শেষ না হওয়া পর্যন্ত বিজ্ঞপ্তি পায়৷ আপনার ঘড়িটি এক সপ্তাহ স্থায়ী হয়, কিন্তু আপনি watches.renew()- এ একটি অনুরোধ করে মেয়াদ শেষ হওয়ার আগে যেকোনো সময়ে এটিকে বাড়িয়ে দিতে পারেন।

আপনার ক্লাউড পাব/সাব বিষয় শুধুমাত্র ফর্ম সম্পর্কে বিজ্ঞপ্তি পায় যা আপনি আপনার সরবরাহ করা শংসাপত্রগুলির সাথে দেখতে পারেন। উদাহরণস্বরূপ, যদি ব্যবহারকারী আপনার অ্যাপ্লিকেশন থেকে অনুমতি প্রত্যাহার করে বা দেখা ফর্মে সম্পাদনা অ্যাক্সেস হারায়, বিজ্ঞপ্তিগুলি আর বিতরণ করা হয় না।

উপলব্ধ ইভেন্ট প্রকার

Google Forms API বর্তমানে দুটি বিভাগের ইভেন্ট অফার করে:

  • EventType.SCHEMA , যা একটি ফর্মের বিষয়বস্তু এবং সেটিংসে সম্পাদনা সম্পর্কে অবহিত করে৷
  • EventType.RESPONSES , যা ফর্ম প্রতিক্রিয়া (নতুন এবং আপডেট উভয়ই) জমা দেওয়ার সময় বিজ্ঞপ্তি দেয়৷

বিজ্ঞপ্তি প্রতিক্রিয়া

বিজ্ঞপ্তিগুলি JSON এর সাথে এনকোড করা হয়েছে এবং এতে রয়েছে:

  • ট্রিগারিং ফর্মের আইডি
  • ট্রিগারিং ঘড়ির আইডি
  • ইভেন্টের ধরন যা বিজ্ঞপ্তিটিকে ট্রিগার করেছে৷
  • ক্লাউড পাব/সাব দ্বারা সেট করা অন্যান্য ক্ষেত্র, যেমন messageId এবং publishTime

বিজ্ঞপ্তিতে বিস্তারিত ফর্ম বা প্রতিক্রিয়া ডেটা থাকে না । প্রতিটি বিজ্ঞপ্তি প্রাপ্তির পরে, নতুন ডেটা আনার জন্য একটি পৃথক API কল প্রয়োজন৷ এটি কীভাবে সম্পন্ন করা যায় তার জন্য প্রস্তাবিত ব্যবহার দেখুন।

নিম্নলিখিত স্নিপেট একটি স্কিমা পরিবর্তনের জন্য একটি নমুনা বিজ্ঞপ্তি প্রদর্শন করে:

{
  "attributes": {
    "eventType": "SCHEMA",
    "formId": "18Xgmr4XQb-l0ypfCNGQoHAw2o82foMr8J0HPHdagS6g",
    "watchId": "892515d1-a902-444f-a2fe-42b718fe8159"
  },
  "messageId": "767437830649",
  "publishTime": "2021-03-31T01:34:08.053Z"
}

নিম্নলিখিত স্নিপেট একটি নতুন প্রতিক্রিয়ার জন্য একটি নমুনা বিজ্ঞপ্তি প্রদর্শন করে:

{
  "attributes": {
    "eventType": "RESPONSES",
    "formId": "18Xgmr4XQb-l0ypfCNGQoHAw2o82foMr8J0HPHdagS6g",
    "watchId": "5d7e5690-b1ff-41ce-8afb-b469912efd7d"
  },
  "messageId": "767467004397",
  "publishTime": "2021-03-31T01:43:57.285Z"
}

একটি ক্লাউড পাব/সাব বিষয় সেট আপ করুন৷

ক্লাউড পাব/সাব বিষয়গুলিতে বিজ্ঞপ্তিগুলি বিতরণ করা হয়৷ ক্লাউড পাব/সাব থেকে, আপনি একটি ওয়েব হুকে অথবা একটি সাবস্ক্রিপশন এন্ডপয়েন্ট পোলিং করে বিজ্ঞপ্তি পেতে পারেন।

একটি ক্লাউড পাব/সাব বিষয় সেট আপ করতে, নিম্নলিখিতগুলি করুন:

  1. ক্লাউড পাব/সাব পূর্বশর্তগুলি সম্পূর্ণ করুন৷
  2. একটি ক্লাউড পাব/সাব ক্লায়েন্ট সেট আপ করুন
  3. ক্লাউড পাব/সাব মূল্য পর্যালোচনা করুন এবং আপনার বিকাশকারী কনসোল প্রকল্পের জন্য বিলিং সক্ষম করুন৷
  4. তিনটি উপায়ের মধ্যে একটি ক্লাউড পাব/সাব বিষয় তৈরি করুন:

  5. ক্লাউড পাব/সাব-এ একটি সাবস্ক্রিপশন তৈরি করুন যাতে ক্লাউড পাব/সাব-কে আপনার বিজ্ঞপ্তিগুলি কীভাবে বিতরণ করতে হয়।

  6. অবশেষে, আপনার বিষয়কে লক্ষ্য করে এমন ঘড়ি তৈরি করার আগে, আপনাকে আপনার বিষয় প্রকাশ করার জন্য ফর্ম বিজ্ঞপ্তি পরিষেবা অ্যাকাউন্টে (forms-notifications@system.gserviceaccount.com) অনুমতি দিতে হবে।

একটি ঘড়ি তৈরি করুন

ফর্ম এপিআই পুশ নোটিফিকেশন সার্ভিস অ্যাকাউন্ট প্রকাশ করতে পারে এমন একটি বিষয় পেয়ে গেলে, আপনি watches.create() পদ্ধতি ব্যবহার করে বিজ্ঞপ্তি তৈরি করতে পারেন। এই পদ্ধতিটি যাচাই করে যে প্রদত্ত ক্লাউড পাব/সাব বিষয়ের সাথে পুশ নোটিফিকেশন পরিষেবা অ্যাকাউন্টের মাধ্যমে পৌঁছানো যেতে পারে, এবং যদি এটি বিষয়টিতে পৌঁছাতে না পারে তবে ব্যর্থ হয়; উদাহরণস্বরূপ, যদি বিষয়টি বিদ্যমান না থাকে বা আপনি এটিকে সেই বিষয়ে প্রকাশের অনুমতি না দেন।

পাইথন

forms/snippets/create_watch.py
from apiclient import discovery
from httplib2 import Http
from oauth2client import client, file, tools

SCOPES = "https://www.googleapis.com/auth/drive"
DISCOVERY_DOC = "https://forms.googleapis.com/$discovery/rest?version=v1"

store = file.Storage("token.json")
creds = None
if not creds or creds.invalid:
  flow = client.flow_from_clientsecrets("client_secret.json", SCOPES)
  creds = tools.run_flow(flow, store)

service = discovery.build(
    "forms",
    "v1",
    http=creds.authorize(Http()),
    discoveryServiceUrl=DISCOVERY_DOC,
    static_discovery=False,
)

watch = {
    "watch": {
        "target": {"topic": {"topicName": "<YOUR_TOPIC_PATH>"}},
        "eventType": "RESPONSES",
    }
}

form_id = "<YOUR_FORM_ID>"

# Print JSON response after form watch creation
result = service.forms().watches().create(formId=form_id, body=watch).execute()
print(result)

Node.js

forms/snippets/create_watch.js
import path from 'node:path';
import {authenticate} from '@google-cloud/local-auth';
import {forms} from '@googleapis/forms';

// TODO: Replace with a valid form ID.
const formID = '<YOUR_FORM_ID>';

/**
 * Creates a watch on a form to get notifications for new responses.
 */
async function createWatch() {
  // Authenticate with Google and get an authorized client.
  const authClient = await authenticate({
    keyfilePath: path.join(__dirname, 'credentials.json'),
    scopes: 'https://www.googleapis.com/auth/drive',
  });

  // Create a new Forms API client.
  const formsClient = forms({
    version: 'v1',
    auth: authClient,
  });

  // The request body to create a watch.
  const watchRequest = {
    watch: {
      target: {
        topic: {
          // TODO: Replace with a valid Cloud Pub/Sub topic name.
          topicName: 'projects/<YOUR_TOPIC_PATH>',
        },
      },
      // The event type to watch for. 'RESPONSES' is the only supported type.
      eventType: 'RESPONSES',
    },
  };

  // Send the request to create the watch.
  const result = await formsClient.forms.watches.create({
    formId: formID,
    requestBody: watchRequest,
  });

  console.log(result.data);
  return result.data;
}

একটি ঘড়ি মুছুন

পাইথন

forms/snippets/delete_watch.py
from apiclient import discovery
from httplib2 import Http
from oauth2client import client, file, tools

SCOPES = "https://www.googleapis.com/auth/drive"
DISCOVERY_DOC = "https://forms.googleapis.com/$discovery/rest?version=v1"

store = file.Storage("token.json")
creds = None
if not creds or creds.invalid:
  flow = client.flow_from_clientsecrets("client_secret.json", SCOPES)
  creds = tools.run_flow(flow, store)
service = discovery.build(
    "forms",
    "v1",
    http=creds.authorize(Http()),
    discoveryServiceUrl=DISCOVERY_DOC,
    static_discovery=False,
)

form_id = "<YOUR_FORM_ID>"
watch_id = "<YOUR_WATCH_ID>"

# Print JSON response after deleting a form watch
result = (
    service.forms().watches().delete(formId=form_id, watchId=watch_id).execute()
)
print(result)

Node.js

forms/snippets/delete_watch.js
import path from 'node:path';
import {authenticate} from '@google-cloud/local-auth';
import {forms} from '@googleapis/forms';

// TODO: Replace with a valid form ID.
const formID = '<YOUR_FORM_ID>';
// TODO: Replace with a valid watch ID.
const watchID = '<YOUR_FORMS_WATCH_ID>';

/**
 * Deletes a watch from a form.
 */
async function deleteWatch() {
  // Authenticate with Google and get an authorized client.
  const authClient = await authenticate({
    keyfilePath: path.join(__dirname, 'credentials.json'),
    scopes: 'https://www.googleapis.com/auth/drive',
  });

  // Create a new Forms API client.
  const formsClient = forms({
    version: 'v1',
    auth: authClient,
  });

  // Send the request to delete the watch.
  const result = await formsClient.forms.watches.delete({
    formId: formID,
    watchId: watchID,
  });

  console.log(result.data);
  return result.data;
}

অনুমোদন

Forms API-এ সমস্ত কলের মতো, watches.create() এ কলগুলিকে অবশ্যই একটি অনুমোদন টোকেন দিয়ে অনুমোদিত হতে হবে। টোকেনটিতে অবশ্যই একটি সুযোগ অন্তর্ভুক্ত থাকতে হবে যা বিজ্ঞপ্তিগুলি পাঠানো হচ্ছে এমন ডেটাতে পড়ার অ্যাক্সেস মঞ্জুর করে৷

  • স্কিমা পরিবর্তনের জন্য, এর অর্থ হল যে কোনও সুযোগ যা forms.get() ব্যবহার করে ফর্মগুলিতে পড়ার অ্যাক্সেস মঞ্জুর করে।
  • প্রতিক্রিয়াগুলির জন্য, এর অর্থ হল যে কোনও সুযোগ যা ফর্ম প্রতিক্রিয়াগুলিতে পড়ার অ্যাক্সেস মঞ্জুর করে, উদাহরণস্বরূপ forms.responses.list() ব্যবহার করে৷

বিজ্ঞপ্তিগুলি বিতরণ করার জন্য, অ্যাপ্লিকেশনটিকে প্রয়োজনীয় সুযোগ সহ অনুমোদিত ব্যবহারকারীর কাছ থেকে একটি OAuth অনুদান ধরে রাখতে হবে। যদি ব্যবহারকারী অ্যাপ্লিকেশনটি সংযোগ বিচ্ছিন্ন করে, বিজ্ঞপ্তিগুলি বন্ধ হয়ে যায় এবং একটি ত্রুটির সাথে ঘড়িটি সাসপেন্ড করা হতে পারে৷ অনুমোদন পুনরুদ্ধার করার পরে বিজ্ঞপ্তিগুলি পুনরায় শুরু করতে, একটি ঘড়ি পুনর্নবীকরণ দেখুন।

একটি ফর্ম এর ঘড়ি তালিকা

পাইথন

forms/snippets/list_watches.py
from apiclient import discovery
from httplib2 import Http
from oauth2client import client, file, tools

SCOPES = "https://www.googleapis.com/auth/drive"
DISCOVERY_DOC = "https://forms.googleapis.com/$discovery/rest?version=v1"

store = file.Storage("token.json")
creds = None
if not creds or creds.invalid:
  flow = client.flow_from_clientsecrets("client_secrets.json", SCOPES)
  creds = tools.run_flow(flow, store)
service = discovery.build(
    "forms",
    "v1",
    http=creds.authorize(Http()),
    discoveryServiceUrl=DISCOVERY_DOC,
    static_discovery=False,
)

form_id = "<YOUR_FORM_ID>"

# Print JSON list of form watches
result = service.forms().watches().list(formId=form_id).execute()
print(result)

Node.js

forms/snippets/list_watches.js
import path from 'node:path';
import {authenticate} from '@google-cloud/local-auth';
import {forms} from '@googleapis/forms';

// TODO: Replace with a valid form ID.
const formID = '<YOUR_FORM_ID>';

/**
 * Lists the watches for a given form.
 */
async function listWatches() {
  // Authenticate with Google and get an authorized client.
  const auth = await authenticate({
    keyfilePath: path.join(__dirname, 'credentials.json'),
    scopes: 'https://www.googleapis.com/auth/forms.responses.readonly',
  });

  // Create a new Forms API client.
  const formsClient = forms({
    version: 'v1',
    auth,
  });

  // Get the list of watches for the form.
  const result = await formsClient.forms.watches.list({
    formId: formID,
  });

  console.log(result.data);
  return result.data;
}

একটি ঘড়ি পুনর্নবীকরণ

পাইথন

forms/snippets/renew_watch.py
from apiclient import discovery
from httplib2 import Http
from oauth2client import client, file, tools

SCOPES = "https://www.googleapis.com/auth/drive"
DISCOVERY_DOC = "https://forms.googleapis.com/$discovery/rest?version=v1"

store = file.Storage("token.json")
creds = None
if not creds or creds.invalid:
  flow = client.flow_from_clientsecrets("client_secrets.json", SCOPES)
  creds = tools.run_flow(flow, store)
service = discovery.build(
    "forms",
    "v1",
    http=creds.authorize(Http()),
    discoveryServiceUrl=DISCOVERY_DOC,
    static_discovery=False,
)

form_id = "<YOUR_FORM_ID>"
watch_id = "<YOUR_WATCH_ID>"

# Print JSON response after renewing a form watch
result = (
    service.forms().watches().renew(formId=form_id, watchId=watch_id).execute()
)
print(result)

Node.js

forms/snippets/renew_watch.js
import path from 'node:path';
import {authenticate} from '@google-cloud/local-auth';
import {forms} from '@googleapis/forms';

// TODO: Replace with a valid form ID.
const formID = '<YOUR_FORM_ID>';
// TODO: Replace with a valid watch ID.
const watchID = '<YOUR_FORMS_WATCH_ID>';

/**
 * Renews a watch on a form.
 */
async function renewWatch() {
  // Authenticate with Google and get an authorized client.
  const authClient = await authenticate({
    keyfilePath: path.join(__dirname, 'credentials.json'),
    scopes: 'https://www.googleapis.com/auth/drive',
  });

  // Create a new Forms API client.
  const formsClient = forms({
    version: 'v1',
    auth: authClient,
  });

  // Send the request to renew the watch.
  const result = await formsClient.forms.watches.renew({
    formId: formID,
    watchId: watchID,
  });

  console.log(result.data);
  return result.data;
}

থ্রটলিং

বিজ্ঞপ্তিগুলি থ্রোটল করা হয় - প্রতিটি ঘড়ি প্রতি ত্রিশ সেকেন্ডে সর্বাধিক একটি বিজ্ঞপ্তি পেতে পারে৷ ফ্রিকোয়েন্সি এই থ্রেশহোল্ড পরিবর্তন সাপেক্ষে.

থ্রটলিংয়ের কারণে, একটি একক বিজ্ঞপ্তি একাধিক ইভেন্টের সাথে মিলিত হতে পারে। অন্য কথায়, একটি বিজ্ঞপ্তি নির্দেশ করে যে শেষ বিজ্ঞপ্তির পর থেকে এক বা একাধিক ঘটনা ঘটেছে।

সীমা

যে কোনো সময়ে, একটি প্রদত্ত ফর্ম এবং ইভেন্টের প্রকারের জন্য, প্রতিটি ক্লাউড কনসোল প্রকল্পে থাকতে পারে:

  • মোট 20 ঘড়ি পর্যন্ত
  • শেষ ব্যবহারকারী প্রতি এক ঘড়ি পর্যন্ত

উপরন্তু, যেকোনও সময়ে, সমস্ত ক্লাউড কনসোল প্রজেক্ট জুড়ে প্রতিটি ফর্ম ইভেন্টের ধরন প্রতি 50টি ঘড়ির মধ্যে সীমাবদ্ধ।

একটি ঘড়ি একটি শেষ ব্যবহারকারীর সাথে যুক্ত হয় যখন এটি তৈরি করা হয় বা সেই ব্যবহারকারীর জন্য শংসাপত্রের সাথে পুনর্নবীকরণ করা হয়। একটি ঘড়ি স্থগিত করা হয় যদি সংশ্লিষ্ট শেষ ব্যবহারকারী ফর্মটিতে অ্যাক্সেস হারায় বা ফর্মটিতে অ্যাপের অ্যাক্সেস প্রত্যাহার করে।

নির্ভরযোগ্যতা

প্রতিটি ঘড়ি প্রতিটি ইভেন্টের পরে অন্তত একবার অবহিত করা হয় কিন্তু অসাধারণ পরিস্থিতিতে। বেশিরভাগ ক্ষেত্রে, একটি ইভেন্টের কয়েক মিনিটের মধ্যে একটি বিজ্ঞপ্তি বিতরণ করা হয়।

ত্রুটি

যদি একটি ঘড়ির জন্য বিজ্ঞপ্তিগুলি ক্রমাগতভাবে বিতরণ করতে ব্যর্থ হয়, ঘড়ির অবস্থা SUSPENDED হয়ে যায় এবং ঘড়ির errorType ক্ষেত্র সেট করা হয়৷ একটি স্থগিত ঘড়ির অবস্থাকে ACTIVE তে পুনরায় সেট করতে এবং বিজ্ঞপ্তিগুলি পুনরায় শুরু করতে, একটি ঘড়ি পুনর্নবীকরণ দেখুন।

প্রস্তাবিত ব্যবহার

  • অনেক ঘড়ির লক্ষ্য হিসাবে একটি একক ক্লাউড পাব/সাব বিষয় ব্যবহার করুন।
  • একটি বিষয়ে একটি বিজ্ঞপ্তি পাওয়ার সময়, ফর্ম আইডি বিজ্ঞপ্তি পেলোডে অন্তর্ভুক্ত করা হয়। কোন ডেটা আনতে হবে এবং কোন ফর্ম থেকে এটি আনতে হবে তা জানতে ইভেন্টের প্রকারের সাথে এটি ব্যবহার করুন৷
  • EventType.RESPONSES মাধ্যমে একটি বিজ্ঞপ্তির পরে আপডেট করা ডেটা আনতে, forms.responses.list() এ কল করুন।
    • অনুরোধের ফিল্টারটি timestamp > timestamp_of_the_last_response_you_fetched এ সেট করুন।
  • EventType.SCHEMA এর মাধ্যমে একটি বিজ্ঞপ্তির পরে আপডেট করা ডেটা আনতে, forms.get() এ কল করুন।