Выгрузка финансовых отчетов из Google Cloud Storage с использованием .NET API

в 7:52, , рубрики: google analytics, Google API, google cloud storage, Google Play, метки: , ,

Привет!
Не так давно на работе столкнулся с задачей автоматизации получения финансовых отчетов из нашего Google-аккаунта. В этой публикации я хотел бы рассказать, как это делается на примере с .NET API (C#) и предостеречь вас от ошибок, с которыми столкнулся сам.

Итак, приступим.

Для начала соберем немного первичной информации:

  • 1. Узнаем свой BucketID
    Для этого заходим на play.google.com/apps/publish, нажимаем на левой панели «Финансовые отчеты». В самом низу будет искомый BucketID. Обратите внимание, далее мы будем использовать BucketID без символов gs://.

    Выгрузка финансовых отчетов из Google Cloud Storage с использованием .NET API

  • 2. Получение credential
    Заходим на console.developers.google.com. Создаем новый проект (кнопка Create Project).

    Выгрузка финансовых отчетов из Google Cloud Storage с использованием .NET API

    Введите свое имя проекта.

    После создания проекта нажимаем на левой панели API & auth, потом Credential:

    Выгрузка финансовых отчетов из Google Cloud Storage с использованием .NET API

    Нажимаем кнопку Create Client ID и выбираем Service account:

    Выгрузка финансовых отчетов из Google Cloud Storage с использованием .NET API

    После создание аккаунта генерируем и скачиваем P12 key файл.

    Выгрузка финансовых отчетов из Google Cloud Storage с использованием .NET API

  • 3. Выдача доступа на чтение фин. отчетов
    Незнание этой фичи отняло у меня >50% от всего времени, потраченного на разработку приложения.

    Итак, чтобы далее все заработало без лишних проблем, нужно для сгенерированного в п.2 аккаунта (поле EMAIL ADDRESS) выдать права на чтение финансовых отчетов.

    Для этого нужно зайти на Google Play Publish Page и сделать инвайт для нашего EMAIL ADDRESS с правом чтения фин. отчетов. Для этого нужны админские права в Google-аккаунте.

Подытожим: мы нашли BucketID, скачали себе .p12 файл, получили Email Address и выслали на него инвайт с возможностью чтения фин. отчетов.

Идем дальше. Создаем в Visual Studio новый проект консольного приложения. Версию .NET Framework желательно выбрать не ниже 4.5 (иначе будут проблемы с пробелами в именах файлов).

После создания проекта устанавливаем nuget пакет с API:

Install-Package Google.Apis.Storage.v1beta2 

Версия API со временем может изменится, так что следите за обновлением.

А вот собственно и весь код (собран по кусочкам из разных мест). Замените в нем Bucket, email и путь к .p12 файлу на свои.

using System;
using System.IO;
using System.Security.Cryptography.X509Certificates;
using Google.Apis.Auth.OAuth2;
using Google.Apis.Services;
using Google.Apis.Storage.v1beta2;

namespace GoogleCloudStorageAPIClient
{
    class Program
    {
        static void Main(string[] args)
        {
            const string bucket = "pubsite_prod_rev_XXXXXXXXXXXXXXXXXXXXX";  // без gs://
            const string email = "YYYYYYYYYYYYYYYYYYYYYY@developer.gserviceaccount.com";

            var certificate = new X509Certificate2(
                    @"<указываем путь к .p12 файлу>",
                    "notasecret",
                    X509KeyStorageFlags.Exportable
                    );

            var credential = new ServiceAccountCredential(new ServiceAccountCredential.Initializer(email)
            {
                Scopes = new[] { StorageService.Scope.DevstorageReadOnly }

            }.FromCertificate(certificate));

            var service = new StorageService(new BaseClientService.Initializer
            {
                HttpClientInitializer = credential,
                ApplicationName = "GoogleReportDownloader"
            });

            var listRequest = service.Objects.List(bucket);

            var list = listRequest.Execute();

            if (list != null)
            {
                Console.WriteLine("File count = {0}rn", list.Items.Count);

                foreach (var item in list.Items)
                {
                    Console.WriteLine(item.Name);

                    // скачать файл
                    var getRequest = service.Objects.Get(bucket, item.Name);
                    var objectName = string.Format("{0}\{1}", @"C:!temp", item.Name);
                    using (var fileStream = new FileStream(objectName, FileMode.Create, FileAccess.Write))
                    {
                        getRequest.Download(fileStream);
                    }

                }
            }
        }
    }
}

Надеюсь, кому-нибудь эта публикация сэкономит массу времени и нервов.

Автор: vorobyev_evgeney

Источник

* - обязательные к заполнению поля