Привет, Хабр!
Не так давно на работе столкнулся с задачей автоматизации получения финансовых отчетов из нашего Google-аккаунта. В этой публикации я хотел бы рассказать, как это делается на примере с .NET API (C#) и предостеречь вас от ошибок, с которыми столкнулся сам.
Итак, приступим.
Для начала соберем немного первичной информации:
Подытожим: мы нашли BucketID, скачали себе .p12 файл, получили Email Address и выслали на него инвайт с возможностью чтения фин. отчетов.
Идем дальше. Создаем в Visual Studio новый проект консольного приложения. Версию .NET Framework желательно выбрать не ниже 4.5 (иначе будут проблемы с пробелами в именах файлов).
После создания проекта устанавливаем nuget пакет с API:
Версия API со временем может изменится, так что следите за обновлением.
А вот собственно и весь код (собран по кусочкам из разных мест). Замените в нем Bucket, email и путь к .p12 файлу на свои.
Надеюсь, кому-нибудь эта публикация сэкономит массу времени и нервов.
Не так давно на работе столкнулся с задачей автоматизации получения финансовых отчетов из нашего Google-аккаунта. В этой публикации я хотел бы рассказать, как это делается на примере с .NET API (C#) и предостеречь вас от ошибок, с которыми столкнулся сам.
Итак, приступим.
Для начала соберем немного первичной информации:
- 1. Узнаем свой BucketID
Для этого заходим на play.google.com/apps/publish, нажимаем на левой панели «Финансовые отчеты». В самом низу будет искомый BucketID. Обратите внимание, далее мы будем использовать BucketID без символов gs://.

- 2. Получение credential
Заходим на console.developers.google.com. Создаем новый проект (кнопка Create Project).
Введите свое имя проекта.
После создания проекта нажимаем на левой панели API & auth, потом Credential:

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

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

- 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}\r\n", 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); } } } } } }
Надеюсь, кому-нибудь эта публикация сэкономит массу времени и нервов.
