Привет!
Не так давно на работе столкнулся с задачей автоматизации получения финансовых отчетов из нашего 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}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