Pierwsze kroki z Cloud Storage

Google Display & Video 360 automatycznie przechowuje pliki odczytu elementu w Google Cloud Storage. Pliki te są dostępne tylko na kontach, którym przyznano dostęp.

Tworzenie projektu

Utwórz i skonfiguruj projekt w ten sposób:

  1. Otwórz stronę Interfejsy API włączone w Konsoli interfejsów API Google.

    Jeśli wcześniej nie zalogujesz się w Google, pojawi się prośba o zalogowanie.

  2. W menu projektu wybierz istniejący projekt lub utwórz nowy.
    • Jeśli masz wiele projektów, wybierz ten, dla którego chcesz aktywować Google Cloud Storage, a następnie kliknij Dalej.
    • Jeśli nie masz projektu, wybierz Utwórz nowy projekt, wpisz nazwę projektu i kliknij Utwórz.

      Uwaga: niektóre identyfikatory zasobów (takie jak identyfikatory projektów) mogą być przechowywane po zakończeniu cyklu życia projektu. Z tego względu nie należy przechowywać informacji poufnych w identyfikatorach zasobów.

  3. Upewnij się, że na liście Włączone interfejsy API znajduje się komponent Google Cloud Storage. Jeśli nie ma go na liście, kliknij kartę Interfejsy Google API, wyszukaj i wybierz komponent Google Cloud Storage, a następnie kliknij Włącz API.

    Pamiętaj, że w większości projektów komponent Google Cloud Storage jest już włączony. Jeśli planujesz uzyskiwać dostęp do Google Cloud Storage za pomocą interfejsu JSON API, sprawdź też, czy interfejs Google Cloud Storage JSON API jest włączony.

  4. Włącz płatności w projekcie.

    Zanim zaczniesz korzystać z Google Cloud Storage, musisz włączyć płatności za swój projekt, jeśli nie są włączone. Włączenie płatności nie musi oznaczać, że zostaną naliczone opłaty. Więcej informacji znajdziesz w cenniku.

    1. Będąc w projekcie Cloud Storage, kliknij menu galerii w lewym górnym rogu i wybierz Płatności.
    2. Jeśli nie masz jeszcze konta rozliczeniowego, wykonaj instrukcje tworzenia nowego konta rozliczeniowego.
    3. Jeśli masz istniejące konto rozliczeniowe, wybierz je, a potem kliknij Ustaw konto.

W Konsoli interfejsów API Google pozostań w tym samym projekcie i przejdź do następnej sekcji.

Skonfiguruj dostęp do Cloud Storage

  1. Pozostając w Konsoli interfejsów API Google w obrębie wymaganego projektu, kliknij menu galerii w lewym górnym rogu, wybierz Interfejsy API i usługi, a następnie kliknij Dane logowania. Na stronie Dane logowania znajdź Klucze konta usługi.

    Znajdź adres e-mail klucza konta usługi:

    1. Kliknij link Zarządzaj kontami usługi (po prawej stronie sekcji kluczy konta usługi).
    2. Adres e-mail będzie widoczny na wyświetlonej stronie Uprawnienia.

    Jeśli nie ma kluczy konta usługi, utwórz nowe konto usługi:

    1. Kliknij menu Utwórz dane logowania i wybierz Klucz konta usługi.
    2. W menu Konto usługi wybierz Nowe konto usługi.
    3. Wpisz nazwę konta usługi. Identyfikator konta usługi jest generowany automatycznie na podstawie nazwy i nazwy projektu.
    4. Zanotuj adres e-mail konta usługi o identyfikatorze gserviceaccount.com. Nie będzie ona widoczna na stronie Dane logowania po kliknięciu Utwórz.
    5. W sekcji Typ klucza wybierz JSON.
    6. Kliknij Utwórz. Plik JSON z parą kluczy publiczny/prywatny konta zostanie zapisany w folderze Pobrane. Ten klucz służy do uwierzytelniania aplikacji w interfejsie API i podpisywania wszystkich żądań wysyłanych przez niego do interfejsu API. Zapisz wygenerowany plik JSON w bezpiecznym miejscu, gdzie aplikacja będzie mieć do niego dostęp.
  2. Skontaktuj się z zespołem pomocy Display & Video 360, by poprosić o włączenie plików odczytu elementów lub interfejsu Google Bid Manager API.

    Gdy zespół pomocy potwierdzi dostęp, utwórz dedykowaną grupę dyskusyjną Google (lub grupy) i zaktualizuj te pola w danych partnera w Display & Video 360 (pamiętaj, że te zmiany będą mogli wprowadzać tylko użytkownicy z dostępem na poziomie partnera):

    • Grupa Google do odczytu dziennika
      Grupa z dostępem tylko do odczytu ma uprawnienia tylko do odczytu plików i wyświetlania zawartości zasobników na dane.
    • Grupa Google do zarządzania logami
      Grupa zarządzania ma wszystkie uprawnienia grupy tylko do odczytu, ale może też zmieniać listy kontroli dostępu plików w zasobnikach. Pamiętaj, że nawet grupa zarządzania nie ma uprawnień do zmiany list kontroli dostępu zasobnika ani nie ma uprawnień do tworzenia, modyfikowania czy usuwania plików.

    Po dodaniu grupy dyskusyjnej Google możesz w razie potrzeby dodawać do niej użytkowników i usuwać z niej użytkowników bez konieczności angażowania się w nią zespołu pomocy Display & Video 360. Tylko użytkownicy należący do Twojej grupy będą mieli dostęp do Twoich danych.

Korzystaj ze swoich danych

Uzyskiwanie dostępu do danych za pomocą polecenia gsutil

Narzędzie gsutil to aplikacja wiersza poleceń, która pozwala łatwo uzyskiwać dostęp do danych w Google Cloud Storage bez konieczności programowania. Możesz na przykład używać polecenia gsutil jako części skryptu lub pliku wsadowego zamiast tworzyć niestandardowe aplikacje.

Aby zacząć korzystać z gsutil, zapoznaj się z dokumentacją gsutil. Nadal musisz uwierzytelnić się przy użyciu protokołu OAuth 2, ale przy pierwszym użyciu narzędzia gsutil wyświetli się prośba o podanie danych logowania, a następnie zapisanie ich do późniejszego użycia.

Automatyczne uzyskiwanie dostępu do danych

Google Cloud Storage ma interfejsy API dla wielu języków programowania, które umożliwiają dostęp do danych w sposób zautomatyzowany. Przykład poniżej pokazuje, jak wykonać proste pobieranie jednego z plików odczytu elementu z Google Cloud Storage. Pamiętaj, że w zasobniku gdbm-public przechowywane są tylko publiczne pliki odczytu elementu, a Twoje prywatne pliki odczytu elementu będą przechowywane w zasobnikach właściwych dla partnera i reklamodawcy.

Java

Poniższy przykład korzysta z biblioteki klienta interfejsów API Google dla języka Java, która ułatwia dostęp do danych przechowywanych w Google Cloud Storage. Oprócz głównej ogólnej biblioteki klienta interfejsów API Google musisz też pobrać oddzielną bibliotekę dla interfejsu Cloud Storage API.

Najpierw musisz skonfigurować dane logowania, które będą używane podczas komunikacji z interfejsem API w celu uzyskania autoryzacji dostępu do danych. Aby to zrobić, utwórz obiekt Credential, który jako ServiceAccountId korzysta z adresu e-mail developer.gserviceaccount.com konta usługi, a także wczytuje plik klucza prywatnego pobrany z konsoli interfejsów API Google podczas tworzenia konta usługi. Dzięki temu wszystkie przyszłe żądania wysyłane do interfejsu API będą podpisane kluczem prywatnym konta usługi:

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();

Po utworzeniu obiektu Credential możesz użyć go do utworzenia instancji nowego obiektu Storage, którego możesz używać w przypadku wszystkich przyszłych żądań wysyłanych do interfejsu Google Cloud Storage API:

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

Masz już nowy obiekt Storage, możesz więc zacząć wysyłać żądania do interfejsu API. W tym miejscu wysyłasz żądanie pobrania konkretnego elementu bucketObjectName z zasobnika bucket. Biblioteka obsługuje pobieranie przez HTTP pliku z Google Cloud Storage, a Ty po prostu wydrukujesz jego zawartość w konsoli:

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

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

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

Wartości właściwości bucket i bucketObjectName różnią się w zależności od tego, do której części interfejsu API uzyskujesz dostęp. Zapoznaj się z odpowiednią sekcją na temat konwencji nazewnictwa.

C#

Poniższy przykład pokazuje bibliotekę klienta interfejsów API Google dla języka .NET, dzięki której dostęp do danych przechowywanych w Google Cloud Storage jest łatwy i łatwy.

Najpierw musisz skonfigurować dane logowania, które będą używane podczas komunikacji z interfejsem API w celu uzyskania autoryzacji dostępu do danych. Aby to zrobić, utwórz obiekt AssertionFlowClient, który jako ServiceAccountId wykorzystuje adres e-mail developer.gserviceaccount.com konta usługi, a także wczytuje plik klucza prywatnego pobrany z Konsoli interfejsów API Google podczas tworzenia konta usługi.

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()
};

Po utworzeniu obiektu AssertionFlowClient możesz użyć go do utworzenia instancji nowego obiektu OAuth2Authenticator, którego możesz użyć do utworzenia instancji nowej instancji Storage na potrzeby wszystkich przyszłych żądań wysyłanych do interfejsu Google Cloud Storage API:

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

Masz już nowy obiekt Storage, możesz więc zacząć wysyłać żądania do interfejsu API. W tym miejscu wysyłasz żądanie pobrania konkretnego elementu bucketObjectName z zasobnika bucket. Do obsługi pobierania HTTP z Google Cloud Storage używamy standardowych klas biblioteki klienta .NET, ale musisz ręcznie obsługiwać przekierowanie, aby mieć pewność, że żądanie zawiera zawsze prawidłowy nagłówek 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();
}

Treść odpowiedzi może być następnie odczytana z obiektu HttpWebResponse za pomocą GetResponseStream w zwykły sposób. Wartości właściwości bucket i bucketObjectName różnią się w zależności od tego, do której części interfejsu API uzyskujesz dostęp. Zapoznaj się z odpowiednią sekcją na temat konwencji nazewnictwa.

Załącznik: pełne przykłady

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;
        }

    }
}