بدء استخدام Cloud Storage

شبكة Google الإعلانية تخزِّن أداة "فيديو 360" تلقائيًا ملفات قراءة الكيانات في Google Cloud Storage لا يمكن الوصول إلى هذه الملفات إلا التي تم منحها إذن الوصول.

إنشاء مشروع

يمكنك إنشاء مشروع وإعداده على النحو التالي:

  1. انتقِل إلى صفحة واجهات برمجة التطبيقات التي تم تفعيلها في وحدة تحكُّم Google API.

    إذا لم تكن مسجّلاً الدخول إلى Google، سيُطلب منك تسجيل الدخول.

  2. من القائمة المنسدلة للمشروع، اختَر مشروعًا حاليًا أو أنشئ مشروعًا جديدًا.
    • في حال كانت لديك عدة مشاريع حالية، تأكَّد من اختيار المشروع. التي تريد تفعيل Google Cloud Storage لها، ثم اختَر متابعة
    • أو إذا لم يكن لديك مشروع، اختَر إنشاء مشروع جديد، وأدخِل اسم مشروع، ثم اختَر إنشاء.

      ملاحظة: يجب أن تدرك أنّ بعض معرّفات الموارد (مثل معرفات المشروع) قد يتم الاحتفاظ بها لفترة أطول من عمر مشروعك. لهذا السبب، تجنَّب تخزين معلومات حساسة في الموارد المعرفات.

  3. في قائمة واجهات برمجة التطبيقات التي تم تفعيلها، تأكَّد من إدراج مكوِّن Google Cloud Storage. إذا لم تكن مدرَجة، انقر على علامة التبويب Google APIs، وابحث عن Google Cloud واختَره مكوِّن التخزين، وانقر على تفعيل واجهة برمجة التطبيقات

    يُرجى العلم أنّه في معظم المشاريع، يكون مكوِّن Google Cloud Storage مفعَّلاً من قبل. إذا كنت تخطط للوصول إلى Google Cloud Storage باستخدام JSON API، عليك أيضًا التحقّق من تفعيل 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. التواصل مع الشاشة فريق دعم "فيديو 360" يطلب تفعيل ميزة قراءة الكيانات و/أو واجهة برمجة تطبيقات Google Bid Manager.

    بعد تأكيد فريق الدعم لإمكانية الوصول، أنشئ مجموعة Google مخصَّصة. (أو المجموعات) وتعديل الحقول التالية في "الشبكة الإعلانية" تفاصيل شركاء فيديو 360 (يُرجى العلم أنّ المستخدمين فقط الذين لديهم إذن وصول على مستوى الشريك من إجراء هذه التعديلات):

    • قراءة مجموعة Google
      تمتلك المجموعة للقراءة فقط أذونات لقراءة الملفات وإدراج محتوى حِزم التخزين.
    • مجموعة Google لإدارة السجلّات
      تمتلك مجموعة الإدارة جميع أذونات المجموعة للقراءة فقط، ولكن يمكنها أيضًا تغيير قوائم التحكم بالوصول (ACLs) للملفات داخل المجموعات. يُرجى ملاحظة أنّه حتى مجموعة الإدارة ليس لديها الإذن اللازم. بتغيير قوائم التحكم بالوصول (ACL) للحزمة، وليس لديهم إذن لإنشاء ملفات أو تعديلها أو حذفها.

    بعد إضافة "مجموعة Google"، يمكنك إضافة مستخدمين إلى "مجموعة Google" وإزالتهم حسب الحاجة. بدون أي مشاركة إضافية من "الشبكة الإعلانية" فريق دعم "فيديو 360" هؤلاء المستخدمين فقط سيكون بإمكان المستخدمين في مجموعتك الوصول إلى بياناتك.

الوصول إلى بياناتك

الوصول إلى البيانات باستخدام أداة gsutil

أداة gsutil هي تطبيق سطر أوامر يتيح لك الوصول إلى تخزين البيانات في Google Cloud Storage بسهولة وبدون أي برمجة المستخدم. يمكنك، على سبيل المثال، استخدام أداة gsutil كجزء من نص برمجي أو ملف دفع بدلاً من إنشاء تطبيقات مخصصة.

لبدء استخدام أداة gsutil، اقرأ وثائق أداة gsutil. ستظل بحاجة إلى المصادقة باستخدام OAuth 2 كما كان من قبل، ولكن أداة gsutil نفسها ستطالبك بيانات الاعتماد في أول مرة تستخدمها، ثم تخزّنها لاستخدامها لاحقًا.

الوصول إلى البيانات آليًا

تتضمن خدمة Google Cloud Storage واجهات برمجة تطبيقات للعديد من لغات البرمجة التي تتيح. الوصول إلى بياناتك بطريقة آلية يوضح النموذج أدناه كيفية إجراء عملية تنزيل أحد ملفات قراءة الكيان من Google Cloud Storage تذكر أن الجمهور فقط يتم تخزين ملفات قراءة الكيان في حزمة واحدة (gdbm-public) الخاص بك سيتم تخزين ملفات قراءة الكيانات في حِزم بيانات خاصة بالشريك والمعلِن.

Java

يستخدم المثال التالي واجهة Google مكتبة عملاء واجهات برمجة التطبيقات في Java، تتيح الوصول إلى البيانات التي تم الاحتفاظ بها في Google التخزين بسهولة في السحابة الإلكترونية بالإضافة إلى مكتبة برامج Google APIs العامة الرئيسية، يجب أيضًا تنزيل تطبيق مكتبة في 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:

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

بعد أن أصبح لديك عنصر Storage جديد، أصبحت جاهزًا لبدء إرسال طلبات إلى واجهة برمجة التطبيقات. أنت هنا بصدد إرسال طلب لاسترداد عنصر محدّد. bucketObjectName من الحزمة 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 اعتمادًا على أي جزء من واجهة برمجة التطبيقات يمكنك الوصول إليه فارجع إلى القسم المناسب حول تسمية للملف.

#C

يستخدم المثال التالي دالة مكتبة برامج Google APIs لنظام .NET، وهي تجعل الوصول إلى البيانات المحفوظة في 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 جديد يمكنك استخدامه لإنشاء مثيل Storage جديد لجميع الطلبات المستقبلية في واجهة برمجة التطبيقات Google Cloud Storage:

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

بعد أن أصبح لديك عنصر Storage جديد، أصبحت جاهزًا لبدء إنشاء الطلبات. بواجهة برمجة التطبيقات. هنا تقدم طلبًا لاسترداد عنصر معين، bucketObjectName، من الحزمة 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 حسب جزء واجهة برمجة التطبيقات الذي تستخدمه حاليًا، فراجع القسم المناسب حول اصطلاحات التسمية.

الملحق: "عيّنات" الكاملة

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

    }
}