Cloud Storage का इस्तेमाल शुरू करें

Google Display & Video 360, इकाई की पढ़ी गई फ़ाइलें Google Cloud Storage में अपने-आप सेव करता है. इन फ़ाइलों को सिर्फ़ वे खाते ऐक्सेस कर सकते हैं जिन्हें ऐक्सेस दिया गया हो.

प्रोजेक्ट बनाना

प्रोजेक्ट बनाएं और उसे इस तरह से कॉन्फ़िगर करें:

  1. 'Google API कंसोल' के चालू एपीआई पेज पर जाएं.

    अगर आपने पहले से Google खाते में साइन इन नहीं किया है, तो आपको साइन इन करने के लिए कहा जाएगा.

  2. प्रोजेक्ट के ड्रॉप-डाउन मेन्यू से, कोई मौजूदा प्रोजेक्ट चुनें या नया प्रोजेक्ट बनाएं.
    • अगर आपके पास एक से ज़्यादा मौजूदा प्रोजेक्ट हैं, तो वह प्रोजेक्ट चुनें जिसके लिए आपको Google Cloud Storage चालू करना है. इसके बाद, जारी रखें को चुनें.
    • इसके अलावा, अगर आपके पास कोई प्रोजेक्ट नहीं है, तो नया प्रोजेक्ट बनाएं चुनें. इसके बाद, प्रोजेक्ट का नाम डालें और बनाएं को चुनें.

      ध्यान दें: आपको पता होना चाहिए कि कुछ रिसॉर्स आइडेंटिफ़ायर (जैसे, प्रोजेक्ट आईडी) को आपके प्रोजेक्ट की अवधि खत्म होने के बाद भी सेव करके रखा जा सकता है. इस वजह से, रिसॉर्स आइडेंटिफ़ायर में संवेदनशील जानकारी सेव न करें.

  3. चालू किए गए एपीआई की सूची में, पक्का करें कि Google Cloud Storage कॉम्पोनेंट सूची में शामिल है. अगर सूची में यह मौजूद नहीं है, तो Google API टैब पर क्लिक करें, Google Cloud Storage कॉम्पोनेंट खोजें और चुनें, और एपीआई चालू करें पर क्लिक करें.

    ध्यान दें कि ज़्यादातर प्रोजेक्ट के लिए, Google Cloud Storage कॉम्पोनेंट पहले से ही चालू होता है. अगर आपको JSON API का इस्तेमाल करके Google Cloud Storage ऐक्सेस करना है, तो आपको यह भी पुष्टि करनी चाहिए कि Google Cloud Storage JSON API चालू है या नहीं.

  4. प्रोजेक्ट के लिए बिलिंग की सुविधा चालू करें.

    Google Cloud Storage का इस्तेमाल करने से पहले, अगर आपने अभी तक अपने प्रोजेक्ट के लिए बिलिंग की सुविधा चालू नहीं की है, तो आपको बिलिंग की सुविधा चालू करनी होगी. बिलिंग चालू करने का मतलब यह नहीं है कि आपसे शुल्क लिया जाएगा. ज़्यादा जानकारी के लिए, कीमत देखें.

    1. क्लाउड स्टोरेज प्रोजेक्ट में, ऊपर बाएं कोने में मौजूद गैलरी मेन्यू पर क्लिक करें. इसके बाद, बिलिंग चुनें.
    2. अगर आपके पास अब तक कोई बिलिंग खाता नहीं है, तो नया बिलिंग खाता बनाने के लिए निर्देशों का पालन करें.
    3. अगर आपके पास कोई मौजूदा बिलिंग खाता है, तो उसे चुनें. इसके बाद, खाता सेट करें को चुनें.

Google API कंसोल में, उसी प्रोजेक्ट में रहें और अगले सेक्शन पर जाएं.

Cloud Storage का ऐक्सेस सेट अप करना

  1. ज़रूरी प्रोजेक्ट के Google API कंसोल में अब भी, ऊपर बाएं कोने में मौजूद गैलरी मेन्यू पर क्लिक करके, एपीआई और सेवाएं चुनें, और फिर क्रेडेंशियल पर क्लिक करें. क्रेडेंशियल पेज पर सेवा खाते की कुंजियां खोजें.

    सेवा खाते की कुंजी का ईमेल पता ढूंढें:

    1. सेवा खाते मैनेज करें लिंक चुनें. यह लिंक, सेवा खाते की कुंजियों वाले सेक्शन की दाईं ओर मौजूद होता है.
    2. यह ईमेल पता, दिखने वाले अनुमतियां पेज पर दिखता है.

    अगर सेवा खाते की कोई कुंजी नहीं है, तो नया सेवा खाता बनाएं:

    1. क्रेडेंशियल बनाएं ड्रॉप-डाउन पर क्लिक करें. इसके बाद, सेवा खाता कुंजी चुनें.
    2. सेवा खाता ड्रॉप-डाउन में, नया सेवा खाता चुनें.
    3. सेवा खाते के लिए, नाम डालें. सेवा खाता आईडी, नाम और प्रोजेक्ट के नाम से अपने-आप जनरेट होता है.
    4. सेवा खाता आईडी gserviceaccount.com ईमेल पते को एक नोट करें. बनाएं चुनने के बाद, क्रेडेंशियल पेज पर यह नहीं दिखता.
    5. कुंजी टाइप सेक्शन में, JSON चुनें.
    6. बनाएं पर क्लिक करें. खाते के सार्वजनिक/निजी कुंजी के जोड़े वाली JSON फ़ाइल, आपके डाउनलोड फ़ोल्डर में सेव की जाती है. इस कुंजी का इस्तेमाल एपीआई पर आपके ऐप्लिकेशन की पुष्टि करने और एपीआई को भेजे गए सभी अनुरोधों पर हस्ताक्षर करने के लिए किया जाता है. जनरेट की गई JSON फ़ाइल को किसी सुरक्षित जगह पर सेव करें, ताकि आपका ऐप्लिकेशन इसे ऐक्सेस कर सके.
  2. इकाई के लिए पढ़ी गई फ़ाइलें और/या Google बिड मैनेजर एपीआई चालू करने का अनुरोध करने के लिए, Display & Video 360 की सहायता टीम से संपर्क करें.

    सहायता टीम ऐक्सेस की पुष्टि करने के बाद, एक खास Google ग्रुप (या ग्रुप) बनाएं और Display & Video 360 पार्टनर की जानकारी में नीचे दिए गए फ़ील्ड अपडेट करें (ध्यान दें कि सिर्फ़ पार्टनर-लेवल ऐक्सेस वाले उपयोगकर्ता ही ये अपडेट कर पाएंगे):

    • लॉग 'Google ग्रुप पढ़ें'
      रीड-ओनली ग्रुप को सिर्फ़ फ़ाइलें पढ़ने और स्टोरेज बकेट के कॉन्टेंट को लिस्ट करने की अनुमति है.
    • लॉग मैनेजमेंट Google ग्रुप
      मैनेजमेंट ग्रुप के पास रीड-ओनली ग्रुप की सभी अनुमतियां होती हैं. हालांकि, वह बकेट में मौजूद फ़ाइलों के ACL में बदलाव भी कर सकता है. ध्यान दें कि यहां तक कि मैनेजमेंट ग्रुप के पास भी बकेट ACL को बदलने की अनुमति नहीं है और न ही उनके पास फ़ाइलें बनाने, उनमें बदलाव करने या उन्हें मिटाने की अनुमति नहीं है.

    Google ग्रुप को जोड़े जाने के बाद, ज़रूरत पड़ने पर Google ग्रुप में उपयोगकर्ताओं को जोड़ा जा सकता है और उन्हें हटाया जा सकता है. इसके लिए, Display & Video 360 की सहायता टीम से कोई मदद नहीं ली जाएगी. आपके ग्रुप में शामिल उपयोगकर्ताओं के पास ही आपके डेटा का ऐक्सेस होगा.

अपना डेटा ऐक्सेस करें

gsutil का इस्तेमाल करके डेटा ऐक्सेस करें

gsutil टूल एक कमांड-लाइन ऐप्लिकेशन है. इससे, आपको Google Cloud Storage में मौजूद अपने डेटा को, प्रोग्रामिंग का कोई अनुभव दिए बिना ही आसानी से ऐक्सेस किया जा सकता है. उदाहरण के लिए, आपके पास कस्टम ऐप्लिकेशन बनाने के बजाय, स्क्रिप्ट या बैच फ़ाइल के हिस्से के तौर पर gsutil का इस्तेमाल करने का विकल्प है.

gsutil के साथ शुरुआत करने के लिए, gsutil दस्तावेज़ पढ़ें. आपको अब भी OAuth 2 का इस्तेमाल करके पहले की तरह पुष्टि करनी होगी. हालांकि, पहली बार इस्तेमाल करने पर gsutil आपको क्रेडेंशियल के बारे में पूछेगा और बाद में इस्तेमाल के लिए स्टोर करेगा.

प्रोग्राम के हिसाब से, डेटा को ऐक्सेस करना

Google Cloud Storage में कई प्रोग्रामिंग भाषाओं के एपीआई मौजूद हैं. इनकी मदद से, प्रोग्राम के हिसाब से अपने डेटा को प्रोग्राम के हिसाब से ऐक्सेस किया जा सकता है. नीचे दिए गए नमूने में, Google Cloud Storage से किसी इकाई की पढ़ी गई फ़ाइल को आसानी से डाउनलोड करने का तरीका बताया गया है. याद रखें कि सिर्फ़ सार्वजनिक इकाई की पढ़ी गई फ़ाइलें gdbm-public बकेट में सेव होती हैं; आपकी निजी इकाई की पढ़ी गई फ़ाइलें, पार्टनर और विज्ञापन देने वाले के लिए खास बकेट में सेव की जाएंगी.

Java

नीचे दिए गए उदाहरण में, Java के लिए Google API क्लाइंट लाइब्रेरी का इस्तेमाल किया गया है. इससे Google Cloud Storage में मौजूद डेटा को आसानी से ऐक्सेस किया जा सकता है. Google API की मुख्य क्लाइंट लाइब्रेरी के साथ-साथ, आपको Cloud Storage API के लिए अलग से लाइब्रेरी भी डाउनलोड करनी होगी.

आपको सबसे पहले उन क्रेडेंशियल को सेट अप करना होगा जिनका इस्तेमाल एपीआई के साथ डेटा ऐक्सेस करने के लिए किया जाता है. इससे, एपीआई के ज़रिए डेटा ऐक्सेस करने की अनुमति ली जा सकती है. ऐसा करने के लिए, एक Credential ऑब्जेक्ट बनाया जाता है, जो सेवा खाते के developer.gserviceaccount.com ईमेल पते का ServiceAccountId के तौर पर इस्तेमाल करता है. साथ ही, सेवा खाता बनाते समय, Google API कंसोल से डाउनलोड की गई निजी कुंजी वाली फ़ाइल को भी लोड करता है. इससे यह पक्का होगा कि आने वाले समय में, एपीआई को भेजे जाने वाले सभी अनुरोध, सेवा खाते की निजी कुंजी से साइन किए जाएं:

NetHttpTransport HTTP_TRANSPORT = new NetHttpTransport();
JacksonFactory JSON_FACTORY = new JacksonFactory();

...

Credential credential = new GoogleCredential.Builder().setTransport(HTTP_TRANSPORT)
   .setJsonFactory(JSON_FACTORY)
   .setServiceAccountId("...@developer.gserviceaccount.com")
   .setServiceAccountScopes(StorageScopes.DEVSTORAGE_READ_ONLY)
   .setServiceAccountPrivateKeyFromP12File(new File("...-privatekey.p12"))
   .build();

Credential ऑब्जेक्ट बनाने के बाद, इसका इस्तेमाल एक नया Storage ऑब्जेक्ट इंस्टैंशिएट करने के लिए किया जा सकता है. इसका इस्तेमाल आने वाले समय में Google Cloud Storage API को किए जाने वाले सभी अनुरोधों के लिए किया जा सकता है:

Storage storage = new Storage(HTTP_TRANSPORT, JSON_FACTORY, credential);

अब आपने एक नया Storage ऑब्जेक्ट बना लिया है, तो आप एपीआई को अनुरोध करने के लिए तैयार हैं. यहां bucket बकेट से किसी खास आइटम bucketObjectName को वापस पाने का अनुरोध किया जा रहा है. लाइब्रेरी, Google Cloud Storage से फ़ाइल को एचटीटीपी से डाउनलोड करने की सुविधा देती है. इसके बाद, कॉन्टेंट को प्रिंट करके कंसोल पर भेज दिया जाता है:

Get bucketObject = storage.objects().get(bucketName, bucketObjectName);

ByteArrayOutputStream output = new ByteArrayOutputStream();
bucketObject.getMediaHttpDownloader().setDirectDownloadEnabled(true);
bucketObject.executeAndDownloadTo(output);

System.out.println(output.toString());

bucket और bucketObjectName के लिए वैल्यू इस आधार पर अलग-अलग होंगी कि एपीआई के किस हिस्से को ऐक्सेस किया जा रहा है. नाम रखने के तरीकों के बारे में सही सेक्शन देखें.

C#

नीचे दिए गए उदाहरण में, .NET के लिए Google API क्लाइंट लाइब्रेरी का इस्तेमाल किया गया है. इससे Google Cloud Storage में मौजूद डेटा को आसानी से ऐक्सेस किया जा सकता है.

आपको एपीआई से संपर्क करते समय क्रेडेंशियल सेट अप करने होंगे, ताकि डेटा ऐक्सेस करने की अनुमति मिल सके. ऐसा करने के लिए, एक AssertionFlowClient ऑब्जेक्ट बनाया जाता है. यह ऑब्जेक्ट, सेवा खाते के developer.gserviceaccount.com ईमेल पते का इस्तेमाल ServiceAccountId के तौर पर करता है. साथ ही, सेवा खाता बनाते समय, Google API कंसोल से डाउनलोड की गई निजी कुंजी वाली फ़ाइल को भी लोड करता है.

string keyPath = @"...-privatekey.p12";
X509Certificate2 certificate = new X509Certificate2(keyPath, "notasecret", X509KeyStorageFlags.Exportable);
var provider = new AssertionFlowClient(GoogleAuthenticationServer.Description, certificate)
{
    ServiceAccountId = "...@developer.gserviceaccount.com",
    Scope = StorageService.Scopes.DevstorageRead_only.GetStringValue()
};

AssertionFlowClient ऑब्जेक्ट बनाने के बाद, इसका इस्तेमाल नया OAuth2Authenticator ऑब्जेक्ट इंस्टैंशिएट करने के लिए किया जा सकता है. इसका इस्तेमाल, आने वाले समय में Google Cloud Storage API पर किए जाने वाले सभी अनुरोधों के लिए, नए Storage इंस्टेंस को इंस्टैंशिएट करने के लिए किया जा सकता है:

var auth = new OAuth2Authenticator<AssertionFlowClient>(provider, AssertionFlowClient.GetState);
StorageService service = new StorageService(auth);

अब आपके पास एक नया Storage ऑब्जेक्ट है, तो आप एपीआई को अनुरोध करने के लिए तैयार हैं. यहां bucket बकेट से किसी खास आइटम, bucketObjectName को वापस पाने का अनुरोध किया जा रहा है. हम Google Cloud Storage से एचटीटीपी डाउनलोड को मैनेज करने के लिए, स्टैंडर्ड .NET क्लाइंट लाइब्रेरी क्लास का इस्तेमाल करते हैं. हालांकि, आपको ऐसे मामले को मैन्युअल तरीके से मैनेज करना होगा जहां रीडायरेक्ट होता है. ऐसा इसलिए किया जाता है, ताकि यह पक्का किया जा सके कि अनुरोध में हमेशा सही Authorization हेडर मौजूद हो:

var results = service.Objects.Get(bucketName, bucketObjectName).Fetch();

HttpWebRequest request = createRequest(results.Media.Link, auth);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();

// Handle redirects manually to ensure that the Authorization header is present if
// your request is redirected.
if (response.StatusCode == HttpStatusCode.TemporaryRedirect)
{
    request = createRequest(response.Headers["Location"], auth);
    response = (HttpWebResponse)request.GetResponse();
}

इसके बाद, रिस्पॉन्स का कॉन्टेंट, हमेशा की तरह GetResponseStream के ज़रिए HttpWebResponse ऑब्जेक्ट से पढ़ा जा सकता है. bucket और bucketObjectName के लिए वैल्यू इस आधार पर अलग-अलग होंगी कि आप एपीआई के किस हिस्से को ऐक्सेस कर रहे हैं; नाम रखने के तरीकों के सही सेक्शन देखें.

अपेंडिक्स: पूरे सैंपल

Java

/*
 * Copyright (c) 2013 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
 * in compliance with the License. You may obtain a copy of the License at
 * http://www.apache.org/licenses/LICENSE-2.0.
 *
 * Unless required by applicable law or agreed to in writing, software distributed under the License
 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
 * or implied. See the License for the specific language governing permissions and limitations under
 * the License.
 */
package com.google.bidmanager.api.samples;

import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.InputStreamReader;

import com.google.api.client.auth.oauth2.Credential;
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.storage.Storage;
import com.google.api.services.storage.Storage.Objects.Get;
import com.google.api.services.storage.StorageScopes;

/**
 * A simple class that demonstrates how to download a specific object from a bucket using a
 * service account
 */
public class ServiceDownload {

  /**
   * This is the HTTP Transport object used for automatically refreshing access tokens.
   */
  static final NetHttpTransport HTTP_TRANSPORT = new NetHttpTransport();

  /**
   * This is the JSON factory used for parsing refresh token responses.Your first requirement
   */
  static final JacksonFactory JSON_FACTORY = new JacksonFactory();

  /**
   * The main method will attempt to download a specific named object from the gdbm-public bucket
   * using a service account.
   *
   * @param args Not used.
   */
  public static void main(String[] args) {

    try {
      // Prompt the user for the details of the object to download.
      System.out.print("Name of object to download, e.g. entity/20130430.0.Browser.json:");
      BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
      String bucketObjectName = in.readLine();
      in.close();
      String bucketName = "gdbm-public";

      Credential credential = new GoogleCredential.Builder().setTransport(HTTP_TRANSPORT)
           .setJsonFactory(JSON_FACTORY)
           .setServiceAccountId("...@developer.gserviceaccount.com")
           .setServiceAccountScopes(StorageScopes.DEVSTORAGE_READ_ONLY)
           .setServiceAccountPrivateKeyFromP12File(
               new File("...-privatekey.p12"))
           .build();

      Storage storage = new Storage(HTTP_TRANSPORT, JSON_FACTORY, credential);

      Get bucketObject = storage.objects().get(bucketName, bucketObjectName);

      ByteArrayOutputStream output = new ByteArrayOutputStream();
      bucketObject.getMediaHttpDownloader().setDirectDownloadEnabled(true);
      bucketObject.executeAndDownloadTo(output);
      System.out.println(output.toString());

    } catch (Exception e) {
      System.err.println("Unexpected exception caught: " + e.getMessage());
      e.printStackTrace();
    }

  }


}

C#

/*
 * Copyright (c) 2013 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
 * in compliance with the License. You may obtain a copy of the License at
 * http://www.apache.org/licenses/LICENSE-2.0.
 *
 * Unless required by applicable law or agreed to in writing, software distributed under the License
 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
 * or implied. See the License for the specific language governing permissions and limitations under
 * the License.
 */
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Net;
using System.Security.Cryptography.X509Certificates;

using DotNetOpenAuth.OAuth2;

using Google.Apis;
using Google.Apis.Requests;
using Google.Apis.Authentication.OAuth2;
using Google.Apis.Authentication.OAuth2.DotNetOpenAuth;
using Google.Apis.Storage.v1beta1;
using Google.Apis.Storage.v1beta1.Data;
using Google.Apis.Util;

namespace ApiSamples
{
    /// <summary>
    /// A simple class that demonstrates how to download a specific object from a bucket using a
    /// service account
    /// </summary>
    class ServiceDownload
    {
        /// <summary>
        /// The main method will attempt to download a specific named object from the
        /// gdbm-public bucket using a service account.
        /// </summary>
        /// <param name="args">Not used.</param>
        public static void Main(string[] args)
        {

            // Prompt the user for the details of the object to download
            Console.WriteLine("Name of object to download, e.g. entity/20130430.0.Browser.json:");
            string bucketObjectName = Console.ReadLine();
            string bucketName = "gdbm-public";

            try
            {
                string keyPath = @"...-privatekey.p12";
                X509Certificate2 certificate = new X509Certificate2(keyPath, "notasecret", X509KeyStorageFlags.Exportable);
                var provider = new AssertionFlowClient(GoogleAuthenticationServer.Description, certificate)
                {
                    ServiceAccountId = "...@developer.gserviceaccount.com",
                    Scope = StorageService.Scopes.DevstorageRead_only.GetStringValue()
                };
                var auth = new OAuth2Authenticator<AssertionFlowClient>(provider, AssertionFlowClient.GetState);

                StorageService service = new StorageService(auth);
                var results = service.Objects.Get(bucketName, bucketObjectName).Fetch();

                HttpWebRequest request = createRequest(results.Media.Link, auth);
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();

                // Handle redirects manully to ensure that the Authorization header is present if
                // our request is redirected.
                if (response.StatusCode == HttpStatusCode.TemporaryRedirect)
                {
                    request = createRequest(response.Headers["Location"], auth);
                    response = (HttpWebResponse)request.GetResponse();
                }

                Stream stream = response.GetResponseStream();
                StreamReader reader = new StreamReader(stream);
                String data = reader.ReadToEnd();
                Console.Write(data);
            }
            catch (Exception e)
            {
                Console.WriteLine("Unexpected exception caught: " + e.Message);
                Console.Write(e.StackTrace);
            }
            Console.ReadKey();
        }

        /// <summary>
        /// Generate a HttpWebRequest for the given URL with the appropriate OAuth2 authorization
        /// header applied.  The HttpWebRequest object returned has its AllowAutoRedirect option
        /// disabled to allow us to manually handle redirects.
        /// </summary>
        /// <param name="url">URL that is to be requested with this object</param>
        /// <param name="auth">The OAuth2Authenticator instance that contains the appropriate keys.</param>
        /// <returns>HttpWebRequest object ready to be used to make requests to the API</returns>
        private static HttpWebRequest createRequest(string url, OAuth2Authenticator<AssertionFlowClient> auth)
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            request.Headers.Add("Authorization", "Bearer " + auth.State.AccessToken);
            request.AllowAutoRedirect = false;
            return request;
        }

    }
}