एपीआई का इस्तेमाल करना

इस दस्तावेज़ में बताया गया है कि Google Civic Information API का इस्तेमाल करने के लिए, आपको क्या जानना चाहिए. Civic Info API के बारे में अक्सर पूछे जाने वाले सवाल देखें. इसमें एपीआई के बारे में कुछ बुनियादी जानकारी के साथ-साथ, हमारे उपयोगकर्ता फ़ोरम में अक्सर पूछे जाने वाले सवाल भी शामिल हैं. इसके अलावा, चुनाव के दौरान मतदाता की जानकारी देखने के लिए, यहां दिए गए उदाहरण देखें.

Google को आपके ऐप्लिकेशन की पहचान करना

Google Civic Information API को हर बार अनुरोध भेजने पर, आपके ऐप्लिकेशन को अपनी पहचान ज़ाहिर करनी होगी. इसके लिए, हर अनुरोध में एपीआई पासकोड शामिल करना होगा.

एपीआई पासकोड हासिल करना और उसका इस्तेमाल करना

एपीआई पासकोड पाने के लिए:

  1. API Console में क्रेडेंशियल पेज खोलें.
  2. यह एपीआई, दो तरह के क्रेडेंशियल के साथ काम करता है. अपने प्रोजेक्ट के लिए सही क्रेडेंशियल बनाएं:
    • OAuth 2.0: जब भी आपका ऐप्लिकेशन उपयोगकर्ता के निजी डेटा का अनुरोध करता है, तो उसे अनुरोध के साथ OAuth 2.0 टोकन भेजना होगा. आपका ऐप्लिकेशन, टोकन पाने के लिए सबसे पहले क्लाइंट आईडी और शायद क्लाइंट सीक्रेट भेजता है. आपके पास वेब ऐप्लिकेशन, सेवा खातों या इंस्टॉल किए गए ऐप्लिकेशन के लिए, OAuth 2.0 क्रेडेंशियल जनरेट करने का विकल्प है.

      ध्यान दें: इस एपीआई में ऐसा कोई तरीका नहीं है जिसके लिए, OAuth 2.0 की अनुमति की ज़रूरत होती है. इसलिए, आपको सिर्फ़ एपीआई पासकोड पाने की ज़रूरत पड़ सकती है. इनके बारे में यहां बताया गया है. हालांकि, अगर आपका ऐप्लिकेशन ऐसे अन्य एपीआई को कॉल करता है जिनके लिए उपयोगकर्ता की अनुमति की ज़रूरत होती है, तो आपको अब भी OAuth 2.0 क्रेडेंशियल की ज़रूरत होगी.

      ज़्यादा जानकारी के लिए, OAuth 2.0 दस्तावेज़ देखें.

    • एपीआई पासकोड: OAuth 2.0 टोकन न देने वाले अनुरोध में, एपीआई पासकोड भेजना ज़रूरी है. पासकोड से आपके प्रोजेक्ट की पहचान की जाती है. साथ ही, इससे एपीआई का ऐक्सेस, कोटा, और रिपोर्ट मिलती हैं.

      एपीआई, एपीआई कुंजियों पर कई तरह की पाबंदियां लगाने की सुविधा देता है. अगर आपको जो एपीआई पासकोड चाहिए वह पहले से मौजूद नहीं है, तो कंसोल में एपीआई पासकोड बनाएं. इसके लिए, क्रेडेंशियल बनाएं  > एपीआई पासकोड पर क्लिक करें. प्रोडक्शन में इस्तेमाल करने से पहले, कुंजी पर पाबंदी लगाई जा सकती है. इसके लिए, कुंजी पर पाबंदी लगाएं पर क्लिक करें और पाबंदियों में से कोई एक चुनें.

अपनी एपीआई पासकोड को सुरक्षित रखने के लिए, एपीआई पासकोड का सुरक्षित तरीके से इस्तेमाल करने के सबसे सही तरीकों का पालन करें.

एपीआई पासकोड मिलने के बाद, आपका ऐप्लिकेशन सभी अनुरोध यूआरएल में क्वेरी पैरामीटर key=yourAPIKey जोड़ सकता है.

एपीआई पासकोड को यूआरएल में जोड़ना सुरक्षित है. इसे कोड में बदलने की ज़रूरत नहीं है.

एपीआई पासकोड से जुड़ी पाबंदियां

आपकी एपीआई कुंजी डिफ़ॉल्ट रूप से बिना किसी पाबंदी के उपलब्ध होती है. अगर कोई व्यक्ति इस कुंजी को पढ़ सकता है (उदाहरण के लिए, अगर इसे ब्राउज़र में रखा गया है) या उस डिवाइस को ऐक्सेस कर सकता है जिस पर कुंजी मौजूद है, तो यह असुरक्षित हो जाती है. हमारा सुझाव है कि आप इस एपीआई पासकोड पर पाबंदी लगाएं, ताकि बिना अनुमति के उसका इस्तेमाल न किया जा सके.

पाबंदी जोड़ने के लिए, बनाई गई एपीआई पासकोड डायलॉग बॉक्स में, पासकोड पर पाबंदी लगाएं पर क्लिक करें. एपीआई पासकोड कॉन्फ़िगरेशन पैनल दिखेगा:

आपके ऐप्लिकेशन की ज़रूरतों के हिसाब से, पाबंदी का टाइप चुना जाएगा:

  • सीधे एपीआई के साथ इंटरैक्ट करने वाले वेब ऐप्लिकेशन (यानी, किसी बैकएंड या मिडलवेयर के ज़रिए नहीं) को एचटीटीपी रेफ़रल की पाबंदी जोड़नी चाहिए. हालांकि, ध्यान दें कि ऐसे ऐप्लिकेशन अपनी एपीआई पासकोड को सार्वजनिक तौर पर दिखाएंगे. इसलिए, इसके बजाय सेवा खाते की पुष्टि करने की स्कीम का इस्तेमाल करें.
  • ऐसे बैकएंड ऐप्लिकेशन जो सेवा खातों के साथ काम नहीं कर सकते, उनमें आईपी पतों से जुड़ी पाबंदी जोड़नी चाहिए. इससे, अलग-अलग आईपी पतों से क्लाइंट के इस्तेमाल को रोका जा सकता है. उदाहरण के लिए, ऐसे एम्बेड किए गए डिवाइस जिनकी क्लाइंट लाइब्रेरी में काम करने वाली कोई भाषा नहीं है.
  • Android ऐप्लिकेशन में, Android ऐप्लिकेशन की पाबंदी जोड़नी चाहिए. साथ ही, अपना पैकेज का नाम और SHA-1 हस्ताक्षर-प्रमाणपत्र फ़िंगरप्रिंट जोड़ना चाहिए.
  • iOS ऐप्लिकेशन को iOS ऐप्लिकेशन की पाबंदी जोड़नी चाहिए. साथ ही, इन iOS बंडल पर एपीआई कॉल की पाबंदी लगाने के लिए, कोई भी iOS बंडल आइडेंटिफ़ायर जोड़ना चाहिए.

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

electionQuery का उदाहरण

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

मान्य चुनाव आईडी की सूची पाने के लिए, electionQuery का इस्तेमाल करें:

  https://www.googleapis.com/civicinfo/v2/elections?key=<YOUR_API_KEY>
  

electionQuery का जवाब:

{
 "kind": "civicinfo#electionsqueryresponse",
 "elections": [
  {
   "id": "2000",
   "name": "VIP Test Election",
   "electionDay": "2013-06-06"
  },
  {
   "id": "2124",
   "name": "Rhode Island 2012 Primary Election",
   "electionDay": "2012-09-11"
  },
  {
   "id": "2126",
   "name": "Delaware 2012 Primary Election",
   "electionDay": "2012-09-11"
  }
 ]
}

curl का इस्तेमाल करके voterInfoQuery

वीआईपी टेस्ट चुनाव आईडी 2000 और मतदाता के (टेस्ट) पते 340 मेन सेंट, वेनिस, सीए 90291 के लिए, voterInfoQuery का अनुरोध भेजने के लिए curl का इस्तेमाल करें. voterInfoQuery response देखें.

curl "https://www.googleapis.com/civicinfo/v2/voterinfo?key=<YOUR_API_KEY>&address=340%20Main%20St.%20Venice%20CA&electionId=2000"

JavaScript के लिए Google API क्लाइंट लाइब्रेरी का इस्तेमाल करके voterInfoQuery

इस उदाहरण में, पिछले curl उदाहरण की तरह ही voterInfoQuery जारी की जाती है. हालांकि, इसमें JavaScript क्लाइंट लाइब्रेरी का इस्तेमाल किया जाता है. voterInfoQuery का रिस्पॉन्स, curl के उदाहरण के रिस्पॉन्स जैसा ही होता है.

<!doctype html>
<html>
  <head>
    <script>
      /**
       * Build and execute request to look up voter info for provided address.
       * @param {string} address Address for which to fetch voter info.
       * @param {function(Object)} callback Function which takes the
       *     response object as a parameter.
       */
       function lookup(address, callback) {
       /**
         * Election ID for which to fetch voter info.
         * @type {number}
         */
        var electionId = 2000;
 
        /**
         * Request object for given parameters.
         * @type {gapi.client.HttpRequest}
         */
        var req = gapi.client.request({
            'path' : '/civicinfo/v2/voterinfo',
            'params' : {'electionId' : electionId, 'address' : address}
        });
       req.execute(callback);
      }

      /**
       * Render results in the DOM.
       * @param {Object} response Response object returned by the API.
       * @param {Object} rawResponse Raw response from the API.
       */
      function renderResults(response, rawResponse) {
        var el = document.getElementById('results');
        if (!response || response.error) {
          el.appendChild(document.createTextNode(
              'Error while trying to fetch polling place'));
          return;
        }
        var normalizedAddress = response.normalizedInput.line1 + ' ' +
            response.normalizedInput.city + ', ' +
            response.normalizedInput.state + ' ' +
            response.normalizedInput.zip;
        if (response.pollingLocations.length > 0) {
          var pollingLocation = response.pollingLocations[0].address;
          var pollingAddress = pollingLocation.locationName + ', ' +
              pollingLocation.line1 + ' ' +
              pollingLocation.city + ', ' +
              pollingLocation.state + ' ' +
              pollingLocation.zip;
          var normEl = document.createElement('strong');
          normEl.appendChild(document.createTextNode(
              'Polling place for ' + normalizedAddress + ': '));
          el.appendChild(normEl);
          el.appendChild(document.createTextNode(pollingAddress));
        } else {
          el.appendChild(document.createTextNode(
              'Could not find polling place for ' + normalizedAddress));
        }
      }

      /**
       * Initialize the API client and make a request.
       */
      function load() {
        gapi.client.setApiKey('YOUR API KEY GOES HERE');
        lookup('1263 Pacific Ave. Kansas City KS', renderResults);
      }
    </script>
    <script src="https://apis.google.com/js/client.js?onload=load"></script>
  </head>
  <body>
    <div id="results"></div>
  </body>
</html>

voterInfoQuery response

{
  "kind": "civicinfo#voterinforesponse",
  "status": "success",
  "election": {
  "id": "2000",
  "name": "VIP Test Election",
  "electionDay": "2025-06-06",
  "ocdDivisionId": "ocd-division/country:us"
  },
  "normalizedInput": {
    "line1": "340 Main Street",
    "city": "Venice",
    "state": "CA",
    "zip": "90291"
  },
  "pollingLocations": [
    {
      "address": {
        "locationName": "WESTMINSTER AVENUE ELEMENTARY SCHOOL",
        "line1": "1010 ABBOT KINNEY BLVD",
        "city": "VENICE",
        "state": "CA",
        "zip": "90291"
      },
      "pollingHours": "",
      "latitude": 33.9919351,
      "longitude": -118.4722031,
      "startDate": "2024-03-05",
      "endDate": "2024-03-05",
      "sources": [
        {
          "name": "Voting Information Project",
          "official": true
        }
      ]
    },
    {
      "address": {
        "locationName": "POP UP VOTE CENTER 5",
        "line1": "12400 IMPERIAL HWY",
        "city": "NORWALK",
        "state": "CA",
        "zip": "90650"
      },
      "latitude": 33.915989,
      "longitude": -118.0677283,
      "sources": [
        {
          "name": "Voting Information Project",
          "official": true
        }
      ]
    }
  ],
  "dropOffLocations": [
    {
      "address": {
        "locationName": "FLEX VOTE CENTER 9",
        "line1": "12400 IMPERIAL HWY",
        "city": "NORWALK",
        "state": "CA",
        "zip": "90650"
      },
      "latitude": 33.915989,
      "longitude": -118.0677283,
      "sources": [
        {
          "name": "Voting Information Project",
          "official": true
        }
      ]
    },
  ],
  "contests": [
    {
      "type": "General",
      "ballotTitle": "UNITED STATES REPRESENTATIVE, 36th District",
      "district": {
        "name": "36TH US CONGRESSIONAL",
        "scope": "congressional"
      },
      "numberElected": "1",
      "numberVotingFor": "1",
      "ballotPlacement": "103",
      "sources": [
        {
          "name": "Voting Information Project",
          "official": true
        }
      ],
      "candidates": [
        {
          "name": "ARIANA HAKAMI",
          "party": "Party Preference: Republican"
        },
        {
          "name": "CLAIRE RAGGE ANDERSON",
          "party": "Party Preference: None"
        },
        {
          "name": "MELISSA TOOMIM",
          "party": "Party Preference: Republican"
        },
        {
          "name": "TED W. LIEU",
          "party": "Party Preference: Democratic"
        }
      ]
    },
    {
      "type": "ballot-measure",
      "ballotTitle": "LOS ANGELES CITY MUNICIPAL ELECTION - MEASURE HLA",
      "district": {
        "name": "CITY OF LOS ANGELES",
        "scope": "citywide"
      },
      "ballotPlacement": "116",
      "referendumTitle": "LOS ANGELES CITY MUNICIPAL ELECTION - MEASURE HLA",
      "referendumText": "CITY MOBILITY PLAN STREET IMPROVEMENT MEASURES. INITIATIVE ORDINANCE HLA. Shall an ordinance providing that when the City of Los Angeles makes a qualifying improvement to a City-owned street (e.g., a paving project), the City must also install certain street enhancements described in the City's Mobility Plan network of pedestrian, bicycle, transit, and vehicle routes; and requiring the City to provide publicly accessible information regarding street improvements; be adopted?",
      "referendumPassageThreshold": "MAJORITY OF VOTES CAST",
      "referendumBallotResponses": [
        "YES",
        "NO"
      ],
      "sources": [
        {
          "name": "Voting Information Project",
          "official": true
        }
      ]
    },
    {
      "type": "General",
      "ballotTitle": "DISTRICT ATTORNEY",
      "district": {
        "name": "LOS ANGELES COUNTY",
        "scope": "countywide"
      },
      "numberElected": "1",
      "numberVotingFor": "1",
      "ballotPlacement": "129",
      "sources": [
        {
          "name": "Voting Information Project",
          "official": true
        }
      ],
      "candidates": [
        {
          "name": "GEORGE GASCÓN"
        },
        {
          "name": "JONATHAN HATAMI"
        },
        {
          "name": "NATHAN HOCHMAN"
        },
        {
          "name": "DEBRA ARCHULETA"
        },
        {
          "name": "JEFF CHEMERINSKY"
        },
        {
          "name": "ERIC SIDDALL"
        },
        {
          "name": "MARIA RAMIREZ"
        },
        {
          "name": "DAN KAPELOVITZ"
        },
        {
          "name": "LLOYD \"BOBCAT\" MASSON"
        },
        {
          "name": "JOHN MCKINNEY"
        },
        {
          "name": "CRAIG J. MITCHELL"
        },
        {
          "name": "DAVID S. MILTON"
        }
      ]
    }
  ],
  "state": [
    {
      "name": "California",
      "electionAdministrationBody": {
        "name": "Secretary of State",
        "electionInfoUrl": "https://www.sos.ca.gov/elections/",
        "electionRegistrationUrl": "https://registertovote.ca.gov/?t=s",
        "electionRegistrationConfirmationUrl": "https://voterstatus.sos.ca.gov",
        "absenteeVotingInfoUrl": "https://elections.cdn.sos.ca.gov/vote-by-mail/replacement-application.pdf",
        "votingLocationFinderUrl": "https://voterstatus.sos.ca.gov",
        "ballotInfoUrl": "https://www.sos.ca.gov/elections/ballot-status/wheres-my-ballot/",
        "correspondenceAddress": {
          "line1": "1500 11th Street, 5th Floor",
          "city": "Sacramento",
          "state": "California",
          "zip": "95814"
        }
      },
      "local_jurisdiction": {
        "name": "Los Angeles",
        "electionAdministrationBody": {
          "name": "Registrar-Recorder/County Clerk",
          "electionInfoUrl": "http://www.lavote.gov/",
          "electionRegistrationUrl": "http://registertovote.ca.gov/",
          "electionRegistrationConfirmationUrl": "https://lavote.gov/vrstatus/",
          "absenteeVotingInfoUrl": "",
          "ballotInfoUrl": "http://www.lavote.gov/Locator",
          "physicalAddress": {
            "locationName": "Registrar-Recorder/County Clerk",
            "line1": "12400 Imperial Highway",
            "city": "Norwalk",
            "state": "CA",
            "zip": "90650"
          }
        },
        "sources": [
          {
            "name": "Voting Information Project",
            "official": true
          }
        ]
      }
    }
  ]
}