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

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

खास जानकारी

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 टॉपिक बनाएं:

  5. Cloud Pub/Sub को सूचनाएं डिलीवर करने का तरीका बताने के लिए, Cloud Pub/Sub में सदस्यता बनाएं.

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

वॉच बनाना

जब आपके पास ऐसा विषय हो जिस पर Forms API पुश नोटिफ़िकेशन सेवा खाता पब्लिश कर सकता है, तो watches.create() तरीके का इस्तेमाल करके सूचनाएं बनाई जा सकती हैं. इस तरीके से पुष्टि की जाती है कि पुश नोटिफ़िकेशन सेवा खाते से, दिए गए Cloud 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

forms/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 को पढ़ने का ऐक्सेस देता है.
  • जवाबों के लिए, इसका मतलब है कि कोई भी स्कोप, फ़ॉर्म के जवाबों को पढ़ने का ऐक्सेस देता है. उदाहरण के लिए, forms.responses.list() का इस्तेमाल करना.

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

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

Python

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
'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

forms/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 स्मार्टवॉच
  • हर असली उपयोगकर्ता के लिए ज़्यादा से ज़्यादा एक स्मार्टवॉच

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

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

विश्वसनीयता

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

गड़बड़ियां

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

इस्तेमाल के सुझाव

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