पुश नोटिफ़िकेशन सेट अप करना और पाना

फ़ॉर्म में डेटा में बदलाव होने पर सूचनाएं पाने के लिए, स्मार्टवॉच कलेक्शन में दिए गए तरीके इस्तेमाल किए जा सकते हैं. इस पेज पर, पुश नोटिफ़िकेशन के सेट अप और उन्हें पाने के बारे में खास जानकारी और निर्देश दिए गए हैं.

खास जानकारी

Google Forms API के पुश नोटिफ़िकेशन की सुविधा का इस्तेमाल करके, ऐप्लिकेशन, फ़ॉर्म में डेटा बदलने पर सूचनाएं पाने के लिए सदस्यता ले सकते हैं. सूचनाएं, Cloud Pub/Sub में शामिल किए जाने वाले विषय पर भेजी जाती हैं. आम तौर पर, ये बदलाव कुछ ही मिनट में हो जाती हैं.

पुश नोटिफ़िकेशन पाने के लिए, आपको Cloud Pub/Sub विषय को सेट अप करना होगा. साथ ही, सही इवेंट टाइप के लिए स्मार्टवॉच बनाते समय उस विषय का नाम देना होगा.

इस दस्तावेज़ में इस्तेमाल किए गए मुख्य कॉन्सेप्ट की परिभाषाएं यहां दी गई हैं:

  • टारगेट वह जगह है जहां सूचनाएं भेजी जाती हैं. Cloud Pub/Sub टॉपिक ही टारगेट किया जा सकता है.
  • इवेंट टाइप ऐसी सूचनाओं की कैटगरी है जिसकी सदस्यता तीसरे पक्ष का ऐप्लिकेशन ले सकता है.
  • स्मार्टवॉच, Forms API को निर्देश देता है. इसकी मदद से, किसी खास फ़ॉर्म पर मौजूद किसी खास इवेंट के बारे में, किसी टारगेट को सूचनाएं दी जाती हैं.

जब किसी खास फ़ॉर्म पर इवेंट टाइप के लिए स्मार्टवॉच बनाई जाती है, तो उस स्मार्टवॉच के टारगेट (जो कि Cloud Pub/Sub विषय है) के लिए, उस फ़ॉर्म के इवेंट से जुड़ी सूचनाएं तब तक मिलती रहती हैं, जब तक वॉच की समयसीमा खत्म नहीं हो जाती. आपकी स्मार्टवॉच एक हफ़्ते की होती है. हालांकि, समयसीमा खत्म होने से पहले, इसे किसी भी समय बढ़ाया जा सकता है. इसके लिए, watches.renew() अनुरोध करें.

आपके Cloud Pub/Sub विषय को सिर्फ़ उन फ़ॉर्म के बारे में सूचनाएं मिलती हैं जिन्हें आपने जो क्रेडेंशियल दिए हैं उनकी मदद से देखा जा सकता है. उदाहरण के लिए, अगर उपयोगकर्ता आपके ऐप्लिकेशन से अनुमति वापस ले लेता है या वीडियो देखे गए फ़ॉर्म में बदलाव करने का ऐक्सेस खो देता है, तो सूचनाएं नहीं भेजी जातीं.

इवेंट के उपलब्ध टाइप

फ़िलहाल, Google Forms API में इवेंट की दो कैटगरी उपलब्ध हैं:

  • EventType.SCHEMA, जो किसी फ़ॉर्म के कॉन्टेंट और सेटिंग में हुए बदलावों के बारे में सूचना देता है.
  • EventType.RESPONSES, जो फ़ॉर्म में दिए गए जवाब (नए और अपडेट किए गए, दोनों) सबमिट किए जाने पर सूचना देता है.

सूचना के जवाब

सूचनाओं को JSON फ़ॉर्मैट में एन्कोड किया जाता है और इनमें ये चीज़ें शामिल होती हैं:

  • ट्रिगर करने वाले फ़ॉर्म का आईडी
  • ट्रिगर करने वाली स्मार्टवॉच का आईडी
  • किस तरह के इवेंट ने सूचना ट्रिगर की
  • Cloud Pub/Sub से सेट किए गए अन्य फ़ील्ड, जैसे कि messageId और publishTime

सूचनाओं में, फ़ॉर्म या जवाब का पूरा डेटा शामिल नहीं होता. हर सूचना मिलने के बाद, नया डेटा फ़ेच करने के लिए एक अलग एपीआई कॉल की ज़रूरत होती है. इसे पूरा करने का तरीका जानने के लिए, इस्तेमाल करने के बारे में सुझाव देखें.

नीचे दिया गया स्निपेट, स्कीमा में होने वाले बदलाव के लिए सूचना का एक नमूना दिखाता है:

{
  "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"
}

Cloud Pub/Sub विषय सेट अप करना

सूचनाएं, Cloud Pub/Sub से जुड़े विषयों के लिए भेजी जाती हैं. Cloud Pub/Sub से, आपको वेब हुक पर या सदस्यता एंडपॉइंट पर पोल करके सूचनाएं मिल सकती हैं.

Cloud Pub/Sub विषय को सेट अप करने के लिए, ये काम करें:

  1. Cloud Pub/Sub से जुड़ी ज़रूरी शर्तें पूरी करें.
  2. Cloud Pub/Sub क्लाइंट सेट अप करना.
  3. Cloud Pub/Sub की कीमत की समीक्षा करें और अपने Developer Console प्रोजेक्ट के लिए बिलिंग चालू करें.
  4. इन तीन में से किसी एक तरीके से, Cloud Pub/Sub विषय बनाएं:

    • Developer Console का इस्तेमाल करें (सबसे आसान)
    • कमांड लाइन टूल का इस्तेमाल करके (प्रोग्राम के हिसाब से, अपने-आप होने वाली प्रोसेस के इस्तेमाल के लिए) या
    • इसके लिए, Cloud Pub/Sub API का इस्तेमाल करें.
  5. Cloud Pub/Sub को सूचनाएं डिलीवर करने का तरीका बताने के लिए, Cloud Pub/Sub में कोई सदस्यता बनाएं.

  6. आखिर में, अपने विषय के हिसाब से स्मार्टवॉच बनाने से पहले, आपको अपने विषय पर खबरें पब्लिश करने के लिए, Forms की सूचना सेवा खाते (forms-notifications@system.gserviceaccount.com) को अनुमति देनी होगी.

स्मार्टवॉच बनाएं

अगर आपके पास कोई ऐसा विषय है जिस पर Forms API पुश नोटिफ़िकेशन सेवा खाता पब्लिश हो सकता है, तो watches.create() तरीका का इस्तेमाल करके सूचनाएं बनाई जा सकती हैं. यह तरीका इस बात की पुष्टि करता है कि दिए गए 'क्लाउड Pub/Sub' के विषय को पुश नोटिफ़िकेशन सेवा खाते से ऐक्सेस किया जा सकता है. साथ ही, अगर यह उस विषय तक नहीं पहुंच पाता है, तो यह काम नहीं कर पाता है. उदाहरण के लिए, अगर विषय मौजूद नहीं है या आपने उसे उस विषय पर पब्लिश करने की अनुमति नहीं दी है.

Python

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
'use strict';

const path = require('path');
const google = require('@googleapis/forms');
const {authenticate} = require('@google-cloud/local-auth');

const formID = '<YOUR_FORM_ID>';

async function runSample(query) {
  const authClient = await authenticate({
    keyfilePath: path.join(__dirname, 'credentials.json'),
    scopes: 'https://www.googleapis.com/auth/drive',
  });
  const forms = google.forms({
    version: 'v1',
    auth: authClient,
  });
  const watchRequest = {
    watch: {
      target: {
        topic: {
          topicName: 'projects/<YOUR_TOPIC_PATH>',
        },
      },
      eventType: 'RESPONSES',
    },
  };
  const res = await forms.forms.watches.create({
    formId: formID,
    requestBody: watchRequest,
  });
  console.log(res.data);
  return res.data;
}

if (module === require.main) {
  runSample().catch(console.error);
}
module.exports = runSample;

स्मार्टवॉच मिटाना

Python

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

form/snippets/delete_watch.js
'use strict';

const path = require('path');
const google = require('@googleapis/forms');
const {authenticate} = require('@google-cloud/local-auth');

const formID = '<YOUR_FORM_ID>';
const watchID = '<YOUR_FORMS_WATCH_ID>';

async function runSample(query) {
  const authClient = await authenticate({
    keyfilePath: path.join(__dirname, 'credentials.json'),
    scopes: 'https://www.googleapis.com/auth/drive',
  });
  const forms = google.forms({
    version: 'v1',
    auth: authClient,
  });
  const res = await forms.forms.watches.delete({
    formId: formID,
    watchId: watchID,
  });
  console.log(res.data);
  return res.data;
}

if (module === require.main) {
  runSample().catch(console.error);
}
module.exports = runSample;

अनुमति दें

Forms API को किए जाने वाले अन्य सभी कॉल की तरह ही, watches.create() पर किए जाने वाले कॉल को भी ऑथराइज़ेशन टोकन के साथ अनुमति देनी होगी. टोकन में एक स्कोप शामिल होना चाहिए, जो उस डेटा को पढ़ने का ऐक्सेस देता हो जिसके बारे में सूचनाएं भेजी जा रही हैं.

  • स्कीमा में किए गए बदलावों के लिए, इसका मतलब ऐसे किसी भी स्कोप से है जो forms.get() के ज़रिए फ़ॉर्म को पढ़ने का ऐक्सेस देता है.
  • जवाबों के लिए, इसका मतलब ऐसे किसी भी स्कोप से है जो फ़ॉर्म रिस्पॉन्स को रीड ऐक्सेस देता है. उदाहरण के लिए, forms.responses.list() के ज़रिए.

सूचनाएं डिलीवर करने के लिए, ऐप्लिकेशन को ज़रूरी दायरे के साथ, अनुमति पा चुके उपयोगकर्ता की ओर से OAuth के इस्तेमाल की अनुमति अपने पास रखनी होगी. अगर उपयोगकर्ता ऐप्लिकेशन डिसकनेक्ट करता है, तो सूचनाएं बंद हो जाती हैं और गड़बड़ी की वजह से स्मार्टवॉच निलंबित हो सकती है. अनुमति वापस पाने के बाद, सूचनाएं फिर से पाने के लिए, स्मार्टवॉच को रिन्यू करना देखें.

किसी फ़ॉर्म की स्मार्टवॉच की सूची बनाएं

Python

form/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
'use strict';

const path = require('path');
const google = require('@googleapis/forms');
const {authenticate} = require('@google-cloud/local-auth');

const formID = '<YOUR_FORM_ID>';

async function runSample(query) {
  const auth = await authenticate({
    keyfilePath: path.join(__dirname, 'credentials.json'),
    scopes: 'https://www.googleapis.com/auth/forms.responses.readonly',
  });
  const forms = google.forms({
    version: 'v1',
    auth: auth,
  });
  const res = await forms.forms.watches.list({formId: formID});
  console.log(res.data);
  return res.data;
}

if (module === require.main) {
  runSample().catch(console.error);
}
module.exports = runSample;

स्मार्टवॉच रिन्यू करना

Python

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

form/snippets/renew_watch.js
'use strict';

const path = require('path');
const google = require('@googleapis/forms');
const {authenticate} = require('@google-cloud/local-auth');

const formID = '<YOUR_FORM_ID>';
const watchID = '<YOUR_FORMS_WATCH_ID>';

async function runSample(query) {
  const authClient = await authenticate({
    keyfilePath: path.join(__dirname, 'credentials.json'),
    scopes: 'https://www.googleapis.com/auth/drive',
  });
  const forms = google.forms({
    version: 'v1',
    auth: authClient,
  });
  const res = await forms.forms.watches.renew({
    formId: formID,
    watchId: watchID,
  });
  console.log(res.data);
  return res.data;
}

if (module === require.main) {
  runSample().catch(console.error);
}
module.exports = runSample;

थ्रॉटलिंग

सूचनाओं को थ्रॉटल किया जाता है. हर स्मार्टवॉच को हर तीस सेकंड में ज़्यादा से ज़्यादा एक सूचना मिल सकती है. फ़्रीक्वेंसी की इस सीमा में बदलाव हो सकता है.

थ्रॉटलिंग की वजह से, एक सूचना कई इवेंट से जुड़ी हो सकती है. दूसरे शब्दों में, किसी सूचना से पता चलता है कि पिछली सूचना के बाद से एक या उससे ज़्यादा इवेंट हो चुके हैं.

सीमाएं

किसी भी समय, दिए गए फ़ॉर्म और इवेंट टाइप के लिए, Cloud Console के हर प्रोजेक्ट में ये चीज़ें हो सकती हैं:

  • कुल 20 बार देखा जा सकता है
  • हर असली उपयोगकर्ता के लिए ज़्यादा से ज़्यादा एक वॉच

इसके अलावा, Cloud Console के सभी प्रोजेक्ट के लिए, किसी भी फ़ॉर्म को एक बार में 50 बार देखा जा सकता है. हर इवेंट टाइप को सिर्फ़ 50 बार देखा जा सकता है.

स्मार्टवॉच को किसी असली उपयोगकर्ता से तब जोड़ा जाता है, जब उसे उस उपयोगकर्ता के क्रेडेंशियल के साथ बनाया या रिन्यू किया जाता है. जब उससे जुड़ा असली उपयोगकर्ता, फ़ॉर्म का ऐक्सेस खो देता है या ऐप्लिकेशन का ऐक्सेस रद्द कर देता है, तो स्मार्टवॉच निलंबित कर दी जाती है.

विश्वसनीयता

असाधारण परिस्थितियों को छोड़कर, हर इवेंट के बाद हर स्मार्टवॉच को कम से कम एक बार सूचना दी जाती है. ज़्यादातर मामलों में, किसी घटना के कुछ ही मिनटों में सूचना भेज दी जाती है.

गड़बड़ियां

अगर स्मार्टवॉच के लिए सूचनाएं लगातार डिलीवर नहीं हो पाती हैं, तो स्मार्टवॉच की स्थिति SUSPENDED हो जाती है और स्मार्टवॉच का errorType फ़ील्ड सेट हो जाता है. किसी निलंबित स्मार्टवॉच की स्थिति को ACTIVE पर रीसेट करने और सूचनाएं फिर से पाने के लिए, स्मार्टवॉच को रिन्यू करना देखें.

सुझाया गया इस्तेमाल

  • कई स्मार्टवॉच को टारगेट करने के लिए, किसी एक Cloud Pub/Sub विषय का इस्तेमाल करें.
  • किसी विषय पर सूचना मिलने पर, फ़ॉर्म आईडी को सूचना पेलोड में शामिल किया जाता है. कौनसा डेटा फ़ेच करना है और उसे किस फ़ॉर्म से फ़ेच करना है, यह जानने के लिए इवेंट टाइप के साथ इसका इस्तेमाल करें.
  • EventType.RESPONSES की सूचना के बाद अपडेट किया गया डेटा फ़ेच करने के लिए, forms.responses.list() को कॉल करें.
    • अनुरोध पर, फ़िल्टर को timestamp > timestamp_of_the_last_response_you_fetched पर सेट करें.
  • EventType.SCHEMA की सूचना के बाद अपडेट किया गया डेटा फ़ेच करने के लिए, forms.get() को कॉल करें.