2014-02-21 4 views
4

Я пытаюсь получить данные из Google Analytics с помощью локального консольного приложения. Im может извлечь некоторые данные без входа в учетную запись google и только с использованием API.Извлечение данных из API Google Analytics с использованием .NET/C#

Проблема в том, что я не получаю правильные значения, и я не уверен, как отформатировать код для извлечения правильных значений. Я не буду получать всех посетителей в течение определенного периода времени, в этом случае «2012-01-01» - «2014-02-20». Фактическое количество посетителей в 10 раз больше, когда вы просматриваете панель инструментов Google Analytics. При отладке кода я получаю число 15000. Я показываю d.TotalResults в консоли, которая может быть неправильной, переменная «d» содержит множество разных свойств.

Это код, я бегу:

public static void Main(string[] args) 
{ 
    var serviceAccountEmail = "[email protected]"; 

    var certificate = new X509Certificate2(@"C:\Users\User\Desktop\key.p12", "notasecret", X509KeyStorageFlags.Exportable); 

    var credential = new ServiceAccountCredential(
    new ServiceAccountCredential.Initializer(serviceAccountEmail) 
    { 
     Scopes = new[] { AnalyticsService.Scope.Analytics } 
    }.FromCertificate(certificate)); 

    // Create the service. 
    //Twistandtango 
    var gas = new AnalyticsService(new BaseClientService.Initializer() 
    { 
     HttpClientInitializer = credential, 
     ApplicationName = "TestGoogleAnalytics", 
    }); 

    var r = gas.Data.Ga.Get("ga:MYProfileID", "2012-01-01", "2014-02-20", "ga:visitors"); 

    //Specify some addition query parameters 
    r.Dimensions = "ga:pagePath"; 
    r.Sort = "-ga:visitors"; 
    r.MaxResults = 5; 

    //Execute and fetch the results of our query 
    Google.Apis.Analytics.v3.Data.GaData d = r.Execute(); 


    Console.WriteLine(d.TotalResults); 
    Console.ReadLine(); 
} 

Я пытаюсь запросить результаты, я хочу с этим инструментом https://ga-dev-tools.appspot.com/explorer/. Когда я реализую это в моем коде это выглядит следующим образом:

public static void Main(string[] args) 
{ 
    var serviceAccountEmail = "[email protected]"; 

    var certificate = new X509Certificate2(@"C:\Users\User\Desktop\key.p12", "notasecret", X509KeyStorageFlags.Exportable); 

    var credential = new ServiceAccountCredential(
       new ServiceAccountCredential.Initializer(serviceAccountEmail) 
       { 
        Scopes = new[] { AnalyticsService.Scope.Analytics } 
       }.FromCertificate(certificate)); 

       // Create the service. 
       //Twistandtango 
       var gas = new AnalyticsService(new BaseClientService.Initializer() 
       { 
        HttpClientInitializer = credential, 
        ApplicationName = "TestGoogleAnalytics", 
       }); 

       var r = gas.Data.Ga.Get("ga:MYProfileID", "2012-01-01", "2014-02-20", "ga:visits"); 

       //Specify some addition query parameters 
       r.Dimensions = "ga:visitCount"; 
       r.Metrics = "ga:visits"; 
       r.Segment = "gaid::-1"; 
       //r.Sort = "-ga:visitors"; 
       r.MaxResults = 10000; 

       //Execute and fetch the results of our query 
       Google.Apis.Analytics.v3.Data.GaData d = r.Execute(); 


       Console.WriteLine(d.TotalResults); 
       Console.ReadLine(); 
      } 
     } 

Однако после добавления метрики (r.Metrics = "ga:visits";) для проекта я получаю эту ошибку:

Error 7 Property or indexer 'Google.Apis.Analytics.v3.DataResource.GaResource.GetRequest.Metrics' cannot be assigned to -- it is read only

Также вот индекс классов в аналитике v3:

https://developers.google.com/resources/api-libraries/documentation/analytics/v3/csharp/latest/annotated.html

кто-нибудь есть знания о том, как это работает? Как получить общее количество посетителей с указанного мной временного интервала?

Thx

+0

ваш также выбор PagePath, который вам нужно будет суммировать их все, чтобы получить полную сумму за все. вы уверены, что не ищете визитов и посетителей? – DaImTo

+0

Ну, я просто ищу все визиты между датами, указанными мной. Все визиты полные, новые, старые и т. Д. Как я могу их суммировать?Угадай, что я не понял, как это работает, пробовал разные измерения и показатели, но я думаю, что им не форматировать код правильно, так как я не получаю ожидаемых результатов. Я думаю, вы можете комбинировать фильтры или размеры, но я не уверен – koffe14

ответ

1

Ваша проблема заключается в том, что вы поставляете метрики в методе data.ga.get, вы не используете r.metrics метрики добавить больше их один разделите их ,. В этом случае ga: посещения - это метрики, которые вы запрашиваете.

var r = gas.Data.Ga.Get("ga:MYProfileID", "2012-01-01", "2014-02-20", "ga:visits"); 

Размеры не требуется подано, чтобы вы могли и удалить r.Dimensions = "ga:visitCount"; посмотреть, что возвращается.

Помните, что просто делать Google.Apis.Analytics.v3.Data.GaData d = r.Execute(); не собирается возвращать все строки, если есть больше того, к чему у вас установлен максимальный результат. Вам нужно проверить свою следующую ссылку, чтобы убедиться, что у вас больше строк.


Update в ответ на вопрос ниже о следующей ссылке. У вас есть max-results, установленный в 10000, что является максимальным количеством строк, которое может быть возвращено в куске. Если будет более 10000 строк, тогда вы получите nextlink, вам нужно запросить следующий фрагмент строк. TotalResult даст вам общее количество строк, которые вы должны вернуть. Ниже я продолжаю запрашивать больше данных с использованием .execute до тех пор, пока не появится больше. Следующие ссылки.

List result = new List(); 
do { 
    try 
     { 
     GaData DataList = request.Execute(); // Make the request 
     result.AddRange(DataList.Rows);  // store the Data to return later 
     // hack to get next link stuff 
     totalResults = (!DataList.TotalResults.HasValue) ? 0 : Int32.Parse(DataList.TotalResults.ToString()); 
     rowcnt = rowcnt + DataList.Rows.Count; 
     NextLink = DataList.NextLink;      
     request.StartIndex = rowcnt + 1 ; 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine("An error occurred: " + e.Message); 
      totalResults = 0; 
     } 
} while (request.StartIndex <= totalResults); 
+0

Хорошо, думаю, что у него есть, спасибо. Не уверен, что вы имеете в виду, проверяя следующую ссылку. Да, казалось бы, мое приложение не искажает всех посещений, всего лишь часть из них. Как вы собираетесь собирать общие посещения в качестве альтернативы r.Execute? – koffe14

+0

Обновлено, чтобы добавить дополнительную информацию о nextlink – DaImTo

+0

У меня возникла ошибка, когда я пытаюсь добавить .Rows в коллекцию результатов. Какой тип результата? – Ras

Смежные вопросы