Начните работу с облачным хранилищем

Google Display & Video 360 автоматически сохраняет файлы чтения объектов в облачном хранилище Google . Эти файлы доступны только для учетных записей, которым предоставлен доступ.

Создать проект

Создайте и настройте проект следующим образом:

  1. Перейдите на страницу API с поддержкой консоли Google API .

    Если вы еще не вошли в Google, вам будет предложено войти в систему.

  2. В раскрывающемся списке проектов выберите существующий проект или создайте новый.
    • Если у вас есть несколько существующих проектов, обязательно выберите проект, для которого вы хотите активировать Google Cloud Storage, затем нажмите «Продолжить» .
    • Или, если у вас нет проекта, выберите «Создать новый проект» , введите имя проекта, затем выберите «Создать» .

      Примечание. Вы должны знать, что некоторые идентификаторы ресурсов (например, идентификаторы проектов) могут сохраняться после окончания срока действия вашего проекта. По этой причине избегайте хранения конфиденциальной информации в идентификаторах ресурсов.

  3. Убедитесь, что в списке включенных API указан компонент Google Cloud Storage. Если его нет в списке, перейдите на вкладку Google API , найдите и выберите компонент Google Cloud Storage и нажмите «Включить API» .

    Обратите внимание, что для большинства проектов компонент Google Cloud Storage уже включен. Если вы планируете получить доступ к Google Cloud Storage с помощью JSON API , вам также следует убедиться, что Google Cloud Storage JSON API включен.

  4. Включите биллинг для проекта.

    Прежде чем вы сможете использовать Google Cloud Storage, вам необходимо включить оплату для вашего проекта, если вы еще этого не сделали. Включение выставления счетов не обязательно означает, что с вас будет взиматься плата. Дополнительную информацию см. в разделе Цены .

    1. Не выходя из проекта облачного хранилища, нажмите меню галереи в левом верхнем углу, затем выберите «Оплата» .
    2. Если у вас еще нет платежного аккаунта, следуйте инструкциям, чтобы создать новый платежный аккаунт .
    3. Если у вас уже есть учетная запись для выставления счетов , выберите ее, а затем выберите «Задать учетную запись» .

В консоли Google API оставайтесь в том же проекте и перейдите к следующему разделу.

Настройте доступ к облачному хранилищу

  1. Продолжая работать в консоли Google API в нужном проекте, щелкните меню галереи в левом верхнем углу, выберите API и службы , а затем нажмите «Учетные данные» . На странице «Учетные данные» найдите Ключи учетной записи службы .

    Найдите адрес электронной почты ключа учетной записи службы:

    1. Выберите ссылку «Управление учетными записями служб » (справа от раздела «Ключи учетных записей служб»).
    2. Адрес электронной почты можно просмотреть на открывшейся странице разрешений .

    Если ключей учетной записи службы нет, создайте новую учетную запись службы:

    1. Выберите раскрывающийся список «Создать учетные данные» , затем выберите «Ключ служебной учетной записи» .
    2. В раскрывающемся списке «Учетная запись службы» выберите «Новая учетная запись службы» .
    3. Введите имя для учетной записи службы. Идентификатор учетной записи службы автоматически генерируется из имени и названия проекта.
    4. Запишите адрес электронной почты идентификатора учетной записи службы gserviceaccount.com . Он не отображается на странице «Учетные данные» после выбора «Создать» .
    5. В разделе Тип ключа выберите JSON .
    6. Нажмите Создать . Файл JSON с парой открытого и закрытого ключей учетной записи сохраняется в папке «Загрузки». Этот ключ используется для аутентификации вашего приложения в API и подписи всех запросов, которые оно отправляет в API. Сохраните сгенерированный файл JSON в безопасном месте, где ваше приложение сможет получить к нему доступ.
  2. Свяжитесь со службой поддержки Display & Video 360, чтобы запросить включение файлов Entity Read и/или Google Bid Manager API.

    После того как служба поддержки подтвердит доступ, создайте специальную группу (или группы) Google и обновите следующие поля в сведениях о партнере Display & Video 360 (обратите внимание, что только пользователи с доступом на уровне партнера смогут вносить эти обновления):

    • Журнал чтения группы Google
      Группа только для чтения имеет разрешения только на чтение файлов и просмотр содержимого сегментов хранилища.
    • Управление журналами группы Google
      Группа управления имеет все разрешения группы только для чтения, но также может изменять списки ACL файлов в сегментах. Обратите внимание, что даже у группы управления нет разрешения на изменение списков ACL сегмента, а также разрешения на создание, изменение или удаление файлов.

    После добавления группы Google вы можете добавлять и удалять пользователей из своей группы Google по мере необходимости без какого-либо дальнейшего участия со стороны службы поддержки Display & Video 360; доступ к вашим данным будут иметь только те пользователи, которые входят в вашу группу.

Доступ к вашим данным

Доступ к данным с помощью gsutil

Инструмент gsutil — это приложение командной строки, которое позволяет легко получить доступ к данным вашего облачного хранилища Google без какого-либо опыта программирования. Например, вы можете использовать gsutil как часть сценария или пакетного файла вместо создания пользовательских приложений.

Чтобы начать работу с gsutil, прочтите документацию gsutil . Вам по-прежнему потребуется пройти аутентификацию с использованием OAuth 2, как и раньше, но gsutil сам предложит вам ввести учетные данные при первом использовании, а затем сохранит их для дальнейшего использования.

Программный доступ к данным

Google Cloud Storage имеет API для многих языков программирования, которые позволяют вам получать доступ к вашим данным программным способом. В приведенном ниже примере показано, как выполнить простую загрузку одного из файлов чтения сущностей из Google Cloud Storage . Помните, что в сегменте gdbm-public хранятся только общедоступные файлы чтения сущностей ; ваши личные файлы чтения объектов будут храниться в корзинах, предназначенных для партнеров и рекламодателей.

Джава

В следующем примере используется клиентская библиотека API Google для Java , которая упрощает доступ к данным, хранящимся в облачном хранилище Google . В дополнение к основной общей клиентской библиотеке API Google вам также необходимо загрузить отдельную библиотеку для API Cloud Storage .

Сначала вам необходимо настроить учетные данные, которые будут использоваться при взаимодействии с API, чтобы получить авторизацию для доступа к вашим данным. Это делается путем создания объекта Credential , который использует адрес электронной почты developer.gserviceaccount.com учетной записи службы в качестве ServiceAccountId , а также загружает файл закрытого ключа, который был загружен из консоли API 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 , который можно использовать для всех будущих запросов к API Google Cloud Storage :

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

Теперь, когда у вас есть новый объект Storage , вы готовы начать отправлять запросы к API. Здесь вы делаете запрос на получение определенного элемента bucketObjectName из Bucket bucket . Библиотека обрабатывает HTTP-загрузку файла из 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 будут различаться в зависимости от того, к какой части API вы обращаетесь; обратитесь к соответствующему разделу о соглашениях об именах.

С#

В следующем примере используется клиентская библиотека API Google для .NET , которая упрощает и упрощает доступ к данным, хранящимся в облачном хранилище Google .

Сначала вам необходимо настроить учетные данные, которые будут использоваться при взаимодействии с API, чтобы получить авторизацию для доступа к вашим данным. Это делается путем создания объекта AssertionFlowClient , который использует адрес электронной почты developer.gserviceaccount.com учетной записи службы в качестве ServiceAccountId , а также загружает файл закрытого ключа, который был загружен из консоли API Google при создании учетной записи службы.

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 , который можно использовать для создания экземпляра нового экземпляра Storage для всех будущих запросов к API Google Cloud Storage :

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

Теперь, когда у вас есть новый объект Storage , вы готовы начать отправлять запросы к API. Здесь вы делаете запрос на получение определенного элемента, bucketObjectName , из Bucket bucket . Мы используем стандартные классы клиентской библиотеки .NET для обработки HTTP-загрузки из Google Cloud Storage , но вам придется вручную обрабатывать случай перенаправления, чтобы гарантировать, что в запросе всегда присутствует правильный заголовок 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();
}

Затем содержимое ответа можно прочитать из объекта HttpWebResponse через GetResponseStream , как обычно. Ваши значения для bucket и bucketObjectName будут различаться в зависимости от того, к какой части API вы обращаетесь; обратитесь к соответствующему разделу о соглашениях об именах.

Приложение: полные образцы

Джава

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

  }


}

С#

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

    }
}