2012-04-24 2 views
45

Я искал хорошее решение весь день, но google развивается так быстро, что я не могу найти что-то работающее. Что я хочу сделать, так это то, что у меня есть веб-приложение, в котором есть раздел администратора, в котором пользователю необходимо войти в систему, чтобы просмотреть информацию. В этом разделе я хочу показать некоторые данные из GA, например просмотры страниц для некоторых определенных URL-адресов. Поскольку это не информация пользователя, которую я показываю, но пользователь google analytics, я хочу подключить передачу информации (имя пользователя/пароль или APIKey), но я не могу узнать, как это сделать. Весь образец, который я нашел, использует OAuth2 (ведьма, если я понимаю, попросит посетителя войти в систему, используя Google).Используйте API Google Analytics для отображения информации на C#

То, что я нашел до сих пор:

Может быть, я просто устал, и что завтра будет легко найти решение, но сейчас мне нужна помощь!

Благодаря

+0

Я смог передать всю проблему, с которой вы столкнулись (с которой я столкнулся) в своей аналитике google analytics Api v3, извлекающей данные из службы .NET .NET C# WCf. Работа с последней версией v3 в .net была реальной проблемой –

ответ

29

Я сделал много поиска и, наконец, либо смотрит вверх код из нескольких мест, а затем оборачивать свой собственный интерфейс вокруг него я придумал следующее решение. Не уверен, что люди здесь вставляют весь свой код, но я думаю, почему бы не сохранить все остальное время :)

Предварительные требования: вам необходимо установить пакет Google.GData.Client и google.gdata.analytics/dll.

Это основной класс, который выполняет эту работу.

namespace Utilities.Google 
{ 
    public class Analytics 
    { 
     private readonly String ClientUserName; 
     private readonly String ClientPassword; 
     private readonly String TableID; 
     private AnalyticsService analyticsService; 

     public Analytics(string user, string password, string table) 
     { 
      this.ClientUserName = user; 
      this.ClientPassword = password; 
      this.TableID = table; 

      // Configure GA API. 
      analyticsService = new AnalyticsService("gaExportAPI_acctSample_v2.0"); 
      // Client Login Authorization. 
      analyticsService.setUserCredentials(ClientUserName, ClientPassword); 
     } 

     /// <summary> 
     /// Get the page views for a particular page path 
     /// </summary> 
     /// <param name="pagePath"></param> 
     /// <param name="startDate"></param> 
     /// <param name="endDate"></param> 
     /// <param name="isPathAbsolute">make this false if the pagePath is a regular expression</param> 
     /// <returns></returns> 
     public int GetPageViewsForPagePath(string pagePath, DateTime startDate, DateTime endDate, bool isPathAbsolute = true) 
     { 
      int output = 0; 

      // GA Data Feed query uri. 
      String baseUrl = "https://www.google.com/analytics/feeds/data"; 

      DataQuery query = new DataQuery(baseUrl); 
      query.Ids = TableID; 
      //query.Dimensions = "ga:source,ga:medium"; 
      query.Metrics = "ga:pageviews"; 
      //query.Segment = "gaid::-11"; 
      var filterPrefix = isPathAbsolute ? "ga:pagepath==" : "ga:pagepath=~"; 
      query.Filters = filterPrefix + pagePath; 
      //query.Sort = "-ga:visits"; 
      //query.NumberToRetrieve = 5; 
      query.GAStartDate = startDate.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture); 
      query.GAEndDate = endDate.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture); 
      Uri url = query.Uri; 
      DataFeed feed = analyticsService.Query(query); 
      output = Int32.Parse(feed.Aggregates.Metrics[0].Value); 

      return output; 
     } 

     public Dictionary<string, int> PageViewCounts(string pagePathRegEx, DateTime startDate, DateTime endDate) 
     { 
      // GA Data Feed query uri. 
      String baseUrl = "https://www.google.com/analytics/feeds/data"; 

      DataQuery query = new DataQuery(baseUrl); 
      query.Ids = TableID; 
      query.Dimensions = "ga:pagePath"; 
      query.Metrics = "ga:pageviews"; 
      //query.Segment = "gaid::-11"; 
      var filterPrefix = "ga:pagepath=~"; 
      query.Filters = filterPrefix + pagePathRegEx; 
      //query.Sort = "-ga:visits"; 
      //query.NumberToRetrieve = 5; 
      query.GAStartDate = startDate.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture); 
      query.GAEndDate = endDate.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture); 
      Uri url = query.Uri; 
      DataFeed feed = analyticsService.Query(query); 

      var returnDictionary = new Dictionary<string, int>(); 
      foreach (var entry in feed.Entries) 
       returnDictionary.Add(((DataEntry)entry).Dimensions[0].Value, Int32.Parse(((DataEntry)entry).Metrics[0].Value)); 

      return returnDictionary; 
     } 
    } 
} 

И это интерфейс и реализация, которые я использую для его завершения.

namespace Utilities 
{ 
    public interface IPageViewCounter 
    { 
     int GetPageViewCount(string relativeUrl, DateTime startDate, DateTime endDate, bool isPathAbsolute = true); 
     Dictionary<string, int> PageViewCounts(string pagePathRegEx, DateTime startDate, DateTime endDate); 
    } 

    public class GooglePageViewCounter : IPageViewCounter 
    { 
     private string GoogleUserName 
     { 
      get 
      { 
       return ConfigurationManager.AppSettings["googleUserName"]; 
      } 
     } 

     private string GooglePassword 
     { 
      get 
      { 
       return ConfigurationManager.AppSettings["googlePassword"]; 
      } 
     } 

     private string GoogleAnalyticsTableName 
     { 
      get 
      { 
       return ConfigurationManager.AppSettings["googleAnalyticsTableName"]; 
      } 
     } 

     private Analytics analytics; 

     public GooglePageViewCounter() 
     { 
      analytics = new Analytics(GoogleUserName, GooglePassword, GoogleAnalyticsTableName); 
     } 

     #region IPageViewCounter Members 

     public int GetPageViewCount(string relativeUrl, DateTime startDate, DateTime endDate, bool isPathAbsolute = true) 
     { 
      int output = 0; 
      try 
      { 
       output = analytics.GetPageViewsForPagePath(relativeUrl, startDate, endDate, isPathAbsolute); 
      } 
      catch (Exception ex) 
      { 
       Logger.Error(ex); 
      } 

      return output; 
     } 

     public Dictionary<string, int> PageViewCounts(string pagePathRegEx, DateTime startDate, DateTime endDate) 
     { 
      var input = analytics.PageViewCounts(pagePathRegEx, startDate, endDate); 
      var output = new Dictionary<string, int>(); 

      foreach (var item in input) 
      { 
       if (item.Key.Contains('&')) 
       { 
        string[] key = item.Key.Split(new char[] { '?', '&' }); 
        string newKey = key[0] + "?" + key.FirstOrDefault(k => k.StartsWith("p=")); 

        if (output.ContainsKey(newKey)) 
         output[newKey] += item.Value; 
        else 
         output[newKey] = item.Value; 
       } 
       else 
        output.Add(item.Key, item.Value); 
      } 
      return output; 
     } 

     #endregion 
    } 
} 

А теперь остальное очевидное вещество - вам придется добавить значения web.config для вашего приложения конфигурации или WebConfig и вызвать IPageViewCounter.GetPageViewCount

+1

Спасибо за помощь! Чтобы загрузить DLL: http://code.google.com/p/google-gdata/, обратите внимание, что в .net есть хороший выбор. – VinnyG

+0

Нужно ли мне активировать доступ API или что-то еще? – VinnyG

+0

Нет, я не помню, чтобы что-то делал для этого, но, пожалуйста, сообщите об этом, если вы это сделали. – MoXplod

3

я установки что-то очень похожее на выше ответа в пакете nuGet. Он выполняет следующие действия: - подключается к «учетной записи службы», которую вы настроили в консоли API - вытягивает любые данные Google Analytics, которые вы хотели бы - отображает эти данные с помощью API диаграмм Google , и он делает все это в очень легко изменить. Вы можете увидеть больше здесь: https://www.nuget.org/packages/GoogleAnalytics.GoogleCharts.NET/.

77

Это требует некоторой настройки на стороне google, но на самом деле это довольно просто. Я перечислим шаг за шагом.

Сначала вам нужно создать приложение в облачной консоли Google и включить API Google Analytics.

  • Перейти к http://code.google.com/apis/console
  • Выберите падение вниз и создать проект, если вы уже не один
  • После того, как проект будет создан, нажмите на услуги
  • Отсюда включить Analytics API

Теперь, когда API Google Analytics включен, следующий шаг будет состоять в том, чтобы включить учетную запись службы для доступа к вашим запрошенным профилям/сайтам аналитики. Учетная запись службы позволит вам войти в систему, не запрашивая у пользователя учетные данные.

  • Перейти к http://code.google.com/apis/console и выберите проект, который вы созданный из выпадающего.
  • Далее перейдите в раздел «Доступ к API» и нажмите кнопку «Создать другой клиентский идентификатор».
  • В окне Создать идентификатор клиента выберите учетную запись службы и нажмите создать идентификатор клиента.
  • Загрузите открытый ключ для этой учетной записи, если он не запустил загрузку . Это необходимо позже, когда вы код для авторизации.
  • Перед тем, как закрыть копию, автоматически создайте адрес электронной почты службы, который вам понадобится в следующем шаге. Клиент электронной почты выглядит @ developer.gserviceaccount.com

Теперь, когда у нас есть учетная запись службы, вам необходимо разрешить этот сервис учетной записи для доступа к вашим анкетам/сайтов в Google Analytics.

  • Зайти в Google Analytics.
  • После входа в систему нажмите кнопку «Администратор» в правом верхнем углу экрана .
  • В администраторе нажмите на раскрывающийся список учетной записи и выберите учетную запись/сайт, на который вы хотите получить доступ к своей учетной записи службы, затем нажмите «Управление пользователями» в разделе учетной записи.
  • Введите адрес электронной почты, который был создан для вашей учетной записи службы, и дайте ему прочитать и проанализировать разрешение.
  • Повторите эти действия для любой другой учетной записи/сайта, к которой у вас будет доступ к вашему сервису.

Теперь, когда настройка выполняется для учетной записи службы для доступа к Google Analytics через API, мы можем начать код.

Получить этот пакет из NuGet:

Google.Apis.Analytics.v3 Client Library

Добавьте эти usings:

using Google.Apis.Analytics.v3; 
using Google.Apis.Analytics.v3.Data; 
using Google.Apis.Services; 
using System.Security.Cryptography.X509Certificates; 
using Google.Apis.Auth.OAuth2; 
using System.Collections.Generic; 
using System.Linq; 

Некоторые вещи отметить это.

  • keyPath - это путь к файлу ключа, который вы загрузили с расширением файла .p12.
  • accountEmailAddress - это письмо api, которое мы получили ранее.
  • Сфера - это Enum в классе Google.Apis.Analytics.v3.AnalyticService, который диктует URL для использования для авторизации (например: AnalyticsService.Scope.AnalyticsReadonly).
  • Имя приложения - это ваше имя, которое сообщает google api, что к нему обращается (ака: это может быть то, что вы когда-либо выбираете).

Затем код для выполнения некоторых основных вызовов следующий.

public class GoogleAnalyticsAPI 
{ 
    public AnalyticsService Service { get; set; } 

    public GoogleAnalyticsAPI(string keyPath, string accountEmailAddress) 
    { 
     var certificate = new X509Certificate2(keyPath, "notasecret", X509KeyStorageFlags.Exportable); 

     var credentials = new ServiceAccountCredential(
      new ServiceAccountCredential.Initializer(accountEmailAddress) 
      { 
       Scopes = new[] { AnalyticsService.Scope.AnalyticsReadonly } 
      }.FromCertificate(certificate)); 

     Service = new AnalyticsService(new BaseClientService.Initializer() 
      { 
       HttpClientInitializer = credentials, 
       ApplicationName = "WorthlessVariable" 
      }); 
    } 

    public AnalyticDataPoint GetAnalyticsData(string profileId, string[] dimensions, string[] metrics, DateTime startDate, DateTime endDate) 
    { 
     AnalyticDataPoint data = new AnalyticDataPoint(); 
     if (!profileId.Contains("ga:")) 
      profileId = string.Format("ga:{0}", profileId); 

     //Make initial call to service. 
     //Then check if a next link exists in the response, 
     //if so parse and call again using start index param. 
     GaData response = null; 
     do 
     { 
      int startIndex = 1; 
      if (response != null && !string.IsNullOrEmpty(response.NextLink)) 
      { 
       Uri uri = new Uri(response.NextLink); 
       var paramerters = uri.Query.Split('&'); 
       string s = paramerters.First(i => i.Contains("start-index")).Split('=')[1]; 
       startIndex = int.Parse(s); 
      } 

      var request = BuildAnalyticRequest(profileId, dimensions, metrics, startDate, endDate, startIndex); 
      response = request.Execute(); 
      data.ColumnHeaders = response.ColumnHeaders; 
      data.Rows.AddRange(response.Rows); 

     } while (!string.IsNullOrEmpty(response.NextLink)); 

     return data; 
    } 

    private DataResource.GaResource.GetRequest BuildAnalyticRequest(string profileId, string[] dimensions, string[] metrics, 
                     DateTime startDate, DateTime endDate, int startIndex) 
    { 
     DataResource.GaResource.GetRequest request = Service.Data.Ga.Get(profileId, startDate.ToString("yyyy-MM-dd"), 
                      endDate.ToString("yyyy-MM-dd"), string.Join(",", metrics)); 
     request.Dimensions = string.Join(",", dimensions); 
     request.StartIndex = startIndex; 
     return request; 
    } 

    public IList<Profile> GetAvailableProfiles() 
    { 
     var response = Service.Management.Profiles.List("~all", "~all").Execute(); 
     return response.Items; 
    } 

    public class AnalyticDataPoint 
    { 
     public AnalyticDataPoint() 
     { 
      Rows = new List<IList<string>>(); 
     } 

     public IList<GaData.ColumnHeadersData> ColumnHeaders { get; set; } 
     public List<IList<string>> Rows { get; set; } 
    } 
} 

Другие ссылки, которые окажутся полезными:

Analytic API Explorer - Query API From The Web

Analytic API Explorer version 2 - Query API From The Web

Dimensions and Metrics Reference

Надеюсь, это поможет кто-то пытается сделать это в будущем.

+7

AMAZING post! Святой Грааль после моего дня купания в суде Google .NET API. Вы случайно использовали [Google.Apis.Oauth2.v2] (http://www.nuget.org/packages/Google.Apis.Oauth2.v2/)? Я попробую его, как только я получу разрешение на адрес электронной почты. XD – craastad

+1

OAuth2Authenticator - это фактически клиентская библиотека OAuth2 API Google API. –

+0

Я спросил, потому что я хотел бы знать, какой пакет Nuget вы загрузили (и добавьте ссылки в ответ). – craastad

11

Я надеялся просто добавить комментарий к ответу для бета-версии v3, но точки повторения предотвращают это. Тем не менее, я думал, что это было бы хорошо для других, чтобы иметь эту информацию, так вот она:

using Google.Apis.Authentication.OAuth2; 
using Google.Apis.Authentication.OAuth2.DotNetOpenAuth; 
using System.Security.Cryptography.X509Certificates; 
using Google.Apis.Services; 

Эти пространства имен используются в коде в этом сообщении. Я всегда хотел, чтобы люди чаще публиковали пространства имен, я, кажется, трачу много времени на их поиск. Надеюсь, это сэкономит несколько человек на несколько минут работы.

+1

+1 Я добавил это в ответ – mattmanser

0

Другой подход к работе

Добавить ниже код в ConfigAuth

var googleApiOptions = new GoogleOAuth2AuthenticationOptions() 
     { 
      AccessType = "offline", // can use only if require 
      ClientId = ClientId, 
      ClientSecret = ClientSecret, 
      Provider = new GoogleOAuth2AuthenticationProvider() 
      { 
       OnAuthenticated = context => 
       { 
        context.Identity.AddClaim(new Claim("Google_AccessToken", context.AccessToken)); 

        if (context.RefreshToken != null) 
        { 
         context.Identity.AddClaim(new Claim("GoogleRefreshToken", context.RefreshToken)); 
        } 
        context.Identity.AddClaim(new Claim("GoogleUserId", context.Id)); 
        context.Identity.AddClaim(new Claim("GoogleTokenIssuedAt", DateTime.Now.ToBinary().ToString())); 
        var expiresInSec = 10000; 
        context.Identity.AddClaim(new Claim("GoogleTokenExpiresIn", expiresInSec.ToString())); 


        return Task.FromResult(0); 
       } 
      }, 

      SignInAsAuthenticationType = DefaultAuthenticationTypes.ApplicationCookie 
     }; 
     googleApiOptions.Scope.Add("openid"); // Need to add for google+ 
     googleApiOptions.Scope.Add("profile");// Need to add for google+ 
     googleApiOptions.Scope.Add("email");// Need to add for google+ 
     googleApiOptions.Scope.Add("https://www.googleapis.com/auth/analytics.readonly"); 

     app.UseGoogleAuthentication(googleApiOptions); 

Добавить ниже код, пространства имен и относительные ссылки

using Google.Apis.Analytics.v3; 
using Google.Apis.Analytics.v3.Data; 
using Google.Apis.Auth.OAuth2; 
using Google.Apis.Auth.OAuth2.Flows; 
using Google.Apis.Auth.OAuth2.Responses; 
using Google.Apis.Services; 
using Microsoft.AspNet.Identity; 
using Microsoft.Owin.Security; 
using System; 
using System.Threading.Tasks; 
using System.Web; 
using System.Web.Mvc; 

public class HomeController : Controller 
{ 
    AnalyticsService service; 
    public IAuthenticationManager AuthenticationManager 
    { 
     get 
     { 
      return HttpContext.GetOwinContext().Authentication; 
     } 
    } 

    public async Task<ActionResult> AccountList() 
    { 
     service = new AnalyticsService(new BaseClientService.Initializer() 
     { 
      HttpClientInitializer = await GetCredentialForApiAsync(), 
      ApplicationName = "Analytics API sample", 
     }); 


     //Account List 
     ManagementResource.AccountsResource.ListRequest AccountListRequest = service.Management.Accounts.List(); 
     //service.QuotaUser = "MyApplicationProductKey"; 
     Accounts AccountList = AccountListRequest.Execute(); 



     return View(); 
    } 

    private async Task<UserCredential> GetCredentialForApiAsync() 
    { 
     var initializer = new GoogleAuthorizationCodeFlow.Initializer 
     { 
      ClientSecrets = new ClientSecrets 
      { 
       ClientId = ClientId, 
       ClientSecret = ClientSecret, 
      }, 
      Scopes = new[] { "https://www.googleapis.com/auth/analytics.readonly" } 
     }; 
     var flow = new GoogleAuthorizationCodeFlow(initializer); 

     var identity = await AuthenticationManager.GetExternalIdentityAsync(DefaultAuthenticationTypes.ApplicationCookie); 
     if (identity == null) 
     { 
      Redirect("/Account/Login"); 
     } 

     var userId = identity.FindFirstValue("GoogleUserId"); 

     var token = new TokenResponse() 
     { 
      AccessToken = identity.FindFirstValue("Google_AccessToken"), 
      RefreshToken = identity.FindFirstValue("GoogleRefreshToken"), 
      Issued = DateTime.FromBinary(long.Parse(identity.FindFirstValue("GoogleTokenIssuedAt"))), 
      ExpiresInSeconds = long.Parse(identity.FindFirstValue("GoogleTokenExpiresIn")), 
     }; 

     return new UserCredential(flow, userId, token); 
    } 
} 

Добавить это в Application_Start() в Global.asax

AntiForgeryConfig.UniqueClaimTypeIdentifier = ClaimTypes.NameIdentifier; 
1

Надежда Google предоставит надлежащую документацию когда-нибудь. Здесь я перечисляю все шаги по интеграции проверки подлинности на стороне сервера Google Analytics в ASP.NET C#.

Шаг 1: Создание проекта в Google консоли

Goto ссылка https://console.developers.google.com/iam-admin/projects и создать проект, нажав на кнопку «Создать проект» и укажите название проекта в всплывающем окне и представить его.

Шаг 2: Создание учетных данных и учетной записи службы

После создания проекта, вы будете перенаправлены на страницу «API-менеджер». Нажмите на учетные данные и нажмите кнопку «Создать учетные данные». выберите «ключ учетной записи службы» из раскрывающегося списка, который будет перенаправлен на следующую страницу. В раскрывающемся списке «Сервис» выберите «Новая учетная запись службы». Заполните имя учетной записи службы и загрузите ключ p12. Он будет иметь расширение p12. вы получите всплывающее окно с паролем «notasecret», который по умолчанию и ваш личный ключ будет загружен.

Шаг 3: Создание 0auth клиента ID

нажмите на «создать учетные данные» выпадающего меню и выберите «0auth идентификатор клиента» вы будете перенаправлены на вкладку «Экран согласия 0auth». укажите случайное имя в текстовом поле имени проекта. выберите тип приложения как «Веб-приложение» и нажмите кнопку «Создать». Скопируйте сгенерированный идентификатор клиента в блокнот.

Шаг 4: Включите API,

На левой стороне мыши на вкладке «Обзор» и выберите «Enabled APIs» на вкладке горизонтальной. В строке поиска найдите «API Google Analytics», нажмите на раскрывающийся список и нажмите кнопку «Включить». Теперь снова найдите «Отчетность по аналитикам V4» и включите его.

Шаг 5: Установите NuGet пакеты

В Visual Studio Перейти к Инструменты> NuGet Package Manager> Package Manager Console. Скопируйте код ниже в консоли, чтобы установить пакеты nuget.

Install-Package Google.Apis.Analytics.v3

Install-Package DotNetOpenAuth.Core -Version 4.3.4.13329

Вышеприведенные два пакета Google Analytics и DotNetOpenAuth пакеты NuGet.

Шаг 6: Обеспечение «Просмотр и анализ» разрешение на обслуживание учетной записи

Перейти к учетной записи Google Analytics и нажмите на вкладку «Администрирование» и выберите «Управление пользователями» из левого меню, выберите домен из которых вы хотите получить доступ к данным аналитики и вставить в нее идентификатор электронной почты учетной записи службы и выбрать разрешение «Прочитать и проанализировать» из раскрывающегося списка. Идентификатор электронной почты учетной записи службы выглядит так: [email protected].

Рабочий код

FRONT END CODE:

Скопируйте и вставьте ниже аналитику вставлять скрипт в передней части, или же вы можете получить этот код от Google странице аналитика документации также.

<script> 
    (function (w, d, s, g, js, fs) { 
     g = w.gapi || (w.gapi = {}); g.analytics = { q: [], ready: function (f) { this.q.push(f); } }; 
     js = d.createElement(s); fs = d.getElementsByTagName(s)[0]; 
     js.src = 'https://apis.google.com/js/platform.js'; 
     fs.parentNode.insertBefore(js, fs); js.onload = function() { g.load('analytics'); }; 
    }(window, document, 'script'));</script> 

Вставьте приведенный ниже код в тег тела вашей передней части страницы.

<asp:HiddenField ID="accessToken" runat="server" /> 
<div id="chart-1-container" style="width:600px;border:1px solid #ccc;"></div> 
     <script> 
      var access_token = document.getElementById('<%= accessToken.ClientID%>').value; 

      gapi.analytics.ready(function() { 
       /** 
       * Authorize the user with an access token obtained server side. 
       */ 
       gapi.analytics.auth.authorize({ 
        'serverAuth': { 
         'access_token': access_token 
        } 
       }); 
       /** 
       * Creates a new DataChart instance showing sessions. 
       * It will be rendered inside an element with the id "chart-1-container". 
       */ 
       var dataChart1 = new gapi.analytics.googleCharts.DataChart({ 
        query: { 
         'ids': 'ga:53861036', // VIEW ID <-- Goto your google analytics account and select the domain whose analytics data you want to display on your webpage. From the URL ex: a507598w53044903p53861036. Copy the digits after "p". It is your view ID 
         'start-date': '2016-04-01', 
         'end-date': '2016-04-30', 
         'metrics': 'ga:sessions', 
         'dimensions': 'ga:date' 
        }, 
        chart: { 
         'container': 'chart-1-container', 
         'type': 'LINE', 
         'options': { 
          'width': '100%' 
         } 
        } 
       }); 
       dataChart1.execute(); 


       /** 
       * Creates a new DataChart instance showing top 5 most popular demos/tools 
       * amongst returning users only. 
       * It will be rendered inside an element with the id "chart-3-container". 
       */ 


      }); 
</script> 

Вы также можете получить вид ID из https://ga-dev-tools.appspot.com/account-explorer/

НАЗАД END КОД:

using System; 
    using System.Linq; 
    using System.Collections.Generic; 
    using System.Collections.Specialized; 
    using System.Web.Script.Serialization; 
    using System.Net; 
    using System.Text; 
    using Google.Apis.Analytics.v3; 
    using Google.Apis.Analytics.v3.Data; 
    using Google.Apis.Services; 
    using System.Security.Cryptography.X509Certificates; 
    using Google.Apis.Auth.OAuth2; 
    using Google.Apis.Util; 
    using DotNetOpenAuth.OAuth2; 
    using System.Security.Cryptography; 

    namespace googleAnalytics 
    { 
     public partial class api : System.Web.UI.Page 
     { 
      public const string SCOPE_ANALYTICS_READONLY = "https://www.googleapis.com/auth/analytics.readonly"; 

      string ServiceAccountUser = "[email protected]"; //service account email ID 
      string keyFile = @"D:\key.p12"; //file link to downloaded key with p12 extension 
      protected void Page_Load(object sender, EventArgs e) 
      { 

       string Token = Convert.ToString(GetAccessToken(ServiceAccountUser, keyFile, SCOPE_ANALYTICS_READONLY)); 

       accessToken.Value = Token; 

       var certificate = new X509Certificate2(keyFile, "notasecret", X509KeyStorageFlags.Exportable); 

       var credentials = new ServiceAccountCredential(

        new ServiceAccountCredential.Initializer(ServiceAccountUser) 
        { 
         Scopes = new[] { AnalyticsService.Scope.AnalyticsReadonly } 
        }.FromCertificate(certificate)); 

       var service = new AnalyticsService(new BaseClientService.Initializer() 
       { 
        HttpClientInitializer = credentials, 
        ApplicationName = "Google Analytics API" 
       }); 

       string profileId = "ga:53861036"; 
       string startDate = "2016-04-01"; 
       string endDate = "2016-04-30"; 
       string metrics = "ga:sessions,ga:users,ga:pageviews,ga:bounceRate,ga:visits"; 

       DataResource.GaResource.GetRequest request = service.Data.Ga.Get(profileId, startDate, endDate, metrics); 


       GaData data = request.Execute(); 
       List<string> ColumnName = new List<string>(); 
       foreach (var h in data.ColumnHeaders) 
       { 
        ColumnName.Add(h.Name); 
       } 


       List<double> values = new List<double>(); 
       foreach (var row in data.Rows) 
       { 
        foreach (var item in row) 
        { 
         values.Add(Convert.ToDouble(item)); 
        } 

       } 
       values[3] = Math.Truncate(100 * values[3])/100; 

       txtSession.Text = values[0].ToString(); 
       txtUsers.Text = values[1].ToString(); 
       txtPageViews.Text = values[2].ToString(); 
       txtBounceRate.Text = values[3].ToString(); 
       txtVisits.Text = values[4].ToString(); 

      } 


     public static dynamic GetAccessToken(string clientIdEMail, string keyFilePath, string scope) 
     { 
      // certificate 
      var certificate = new X509Certificate2(keyFilePath, "notasecret"); 

      // header 
      var header = new { typ = "JWT", alg = "RS256" }; 

      // claimset 
      var times = GetExpiryAndIssueDate(); 
      var claimset = new 
      { 
       iss = clientIdEMail, 
       scope = scope, 
       aud = "https://accounts.google.com/o/oauth2/token", 
       iat = times[0], 
       exp = times[1], 
      }; 

      JavaScriptSerializer ser = new JavaScriptSerializer(); 

      // encoded header 
      var headerSerialized = ser.Serialize(header); 
      var headerBytes = Encoding.UTF8.GetBytes(headerSerialized); 
      var headerEncoded = Convert.ToBase64String(headerBytes); 

      // encoded claimset 
      var claimsetSerialized = ser.Serialize(claimset); 
      var claimsetBytes = Encoding.UTF8.GetBytes(claimsetSerialized); 
      var claimsetEncoded = Convert.ToBase64String(claimsetBytes); 

      // input 
      var input = headerEncoded + "." + claimsetEncoded; 
      var inputBytes = Encoding.UTF8.GetBytes(input); 

      // signature 
      var rsa = certificate.PrivateKey as RSACryptoServiceProvider; 
      var cspParam = new CspParameters 
      { 
       KeyContainerName = rsa.CspKeyContainerInfo.KeyContainerName, 
       KeyNumber = rsa.CspKeyContainerInfo.KeyNumber == KeyNumber.Exchange ? 1 : 2 
      }; 
      var aescsp = new RSACryptoServiceProvider(cspParam) { PersistKeyInCsp = false }; 
      var signatureBytes = aescsp.SignData(inputBytes, "SHA256"); 
      var signatureEncoded = Convert.ToBase64String(signatureBytes); 

      // jwt 
      var jwt = headerEncoded + "." + claimsetEncoded + "." + signatureEncoded; 

      var client = new WebClient(); 
      client.Encoding = Encoding.UTF8; 
      var uri = "https://accounts.google.com/o/oauth2/token"; 
      var content = new NameValueCollection(); 

      content["assertion"] = jwt; 
      content["grant_type"] = "urn:ietf:params:oauth:grant-type:jwt-bearer"; 

      string response = Encoding.UTF8.GetString(client.UploadValues(uri, "POST", content)); 


      var result = ser.Deserialize<dynamic>(response); 

      object pulledObject = null; 

      string token = "access_token"; 
      if (result.ContainsKey(token)) 
      { 
       pulledObject = result[token]; 
      } 


      //return result; 
      return pulledObject; 
     } 

     private static int[] GetExpiryAndIssueDate() 
     { 
      var utc0 = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc); 
      var issueTime = DateTime.UtcNow; 

      var iat = (int)issueTime.Subtract(utc0).TotalSeconds; 
      var exp = (int)issueTime.AddMinutes(55).Subtract(utc0).TotalSeconds; 

      return new[] { iat, exp }; 
     } 

     } 
    } 
+0

Я думаю, что это решение не оптимально, так как вы размещаете секретный токен в простом виде на веб-странице! Это нормально, если вы владеете данными Google Analytics и единственным человеком, который может получить доступ к веб-странице, но если это доля, я бы не подумал, что это хорошая идея. – Phil

4

Этот ответ является для тех, кто хочет доступ к своим собственным Analytics счета и хотите использовать новый Analytics Reporting API v4.

Недавно я написал blog post о том, как получить данные Google Analytics с помощью C#. Прочитайте там все подробности.

Сначала вам нужно выбрать между подключением к OAuth2 или учетной записью службы. Я предполагаю, что у вас есть учетная запись Google Analytics, поэтому вам нужно создать «ключ учетной записи службы» на странице API Google Credentials.

Как только вы создадите это, загрузите файл JSON и поместите его в свой проект (я поместил свою в свою папку App_Data).

Затем установите пакет Google.Apis.AnalyticsReporting.v4 Nuget. Также установите Newtonsoft Json.NET.

Включите этот класс где-то в вашем проекте:

public class PersonalServiceAccountCred 
{ 
    public string type { get; set; } 
    public string project_id { get; set; } 
    public string private_key_id { get; set; } 
    public string private_key { get; set; } 
    public string client_email { get; set; } 
    public string client_id { get; set; } 
    public string auth_uri { get; set; } 
    public string token_uri { get; set; } 
    public string auth_provider_x509_cert_url { get; set; } 
    public string client_x509_cert_url { get; set; } 
} 

А вот то, что вы так долго ждали: полный пример!

string keyFilePath = Server.MapPath("~/App_Data/Your-API-Key-Filename.json"); 
string json = System.IO.File.ReadAllText(keyFilePath); 

var cr = JsonConvert.DeserializeObject(json); 

var xCred = new ServiceAccountCredential(new ServiceAccountCredential.Initializer(cr.client_email) 
{ 
    Scopes = new[] { 
     AnalyticsReportingService.Scope.Analytics 
    } 
}.FromPrivateKey(cr.private_key)); 

using (var svc = new AnalyticsReportingService(
    new BaseClientService.Initializer 
    { 
     HttpClientInitializer = xCred, 
     ApplicationName = "[Your Application Name]" 
    }) 
) 
{ 
    // Create the DateRange object. 
    DateRange dateRange = new DateRange() { StartDate = "2017-05-01", EndDate = "2017-05-31" }; 

    // Create the Metrics object. 
    Metric sessions = new Metric { Expression = "ga:sessions", Alias = "Sessions" }; 

    //Create the Dimensions object. 
    Dimension browser = new Dimension { Name = "ga:browser" }; 

    // Create the ReportRequest object. 
    ReportRequest reportRequest = new ReportRequest 
    { 
     ViewId = "[A ViewId in your account]", 
     DateRanges = new List() { dateRange }, 
     Dimensions = new List() { browser }, 
     Metrics = new List() { sessions } 
    }; 

    List requests = new List(); 
    requests.Add(reportRequest); 

    // Create the GetReportsRequest object. 
    GetReportsRequest getReport = new GetReportsRequest() { ReportRequests = requests }; 

    // Call the batchGet method. 
    GetReportsResponse response = svc.Reports.BatchGet(getReport).Execute(); 
} 

Мы начинаем десериализации учетной записи службы ключевую информацию из файла JSON и преобразовать его в PersonalServiceAccountCred объекта. Затем мы создаем ServiceAccountCredential и подключаемся к Google через AnalyticsReportingService. Используя эту услугу, мы затем готовим некоторые базовые фильтры для перехода к API и отправки запроса.

Возможно, лучше всего установить точку останова на строке, где объявлена ​​переменная response, нажать F10 один раз, затем навести курсор на переменную, чтобы вы могли видеть, какие данные доступны для использования в ответе.

+0

Извините, но это абсолютно не полный пример. Начнем с: где я помещаю второй блок кода и каковы данные, которые мы собираемся использовать/показать и т. Д. –

+0

Второй блок кода отправляется туда, куда вы хотите получить данные из API Google. Поскольку мой проект был проектом ASP.NET MVC, я положил его в Action Controller. Вы можете поместить его туда, где хотите. Как я писал в последнем абзаце, поставьте точку останова на строку с переменной 'response', и когда она попадет, наведите указатель мыши на нее, чтобы увидеть, какие у нее есть свойства, и вы можете создать свой код, чтобы вытащить данные тебе нужно. –

+0

Я следую этому руководству: http://www.markwemekamp.com/blog/c/how-to-read-from-google-analytics-using-c/ –