I'm trying to debug this code, to find out where is it erroring, but can't do it.
I'm not sure if viewId
should just be an int or ga:<viewId>
, I tried both ways and still getting null data.
List<Report>.Data
always returns null.
Code:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web;
using Google.Apis.Analytics.v3;
using Google.Apis.Analytics.v3.Data;
using Google.Apis.Services;
using Google.Apis.AnalyticsReporting.v4;
using Google.Apis.AnalyticsReporting.v4.Data;
using Google.Apis.Auth.OAuth2;
using Google.Apis.Util;
using Google.Apis.Logging;
public class GoogleAnalyticsApi
{
private const string keyPath = @"<JsonFileAbsolutePath>";
private string accountEmailAddress = "googleaccount@mail";
private string keyPassword = "<secret>";
private string viewId;
public AnalyticsService Service { get; set; }
private AnalyticsReportingService gaService;
public GoogleAnalyticsApi(string viewId)
{
try
{
var logger = new ConsoleLogger(LogLevel.Error);
GoogleCredential credentials;
using (var stream = new FileStream(keyPath, FileMode.Open, FileAccess.Read))
{
string[] scopes = {AnalyticsReportingService.Scope.AnalyticsReadonly};
var googleCredential = GoogleCredential.FromStream(stream);
credentials = googleCredential.CreateScoped(scopes).ThrowIfNull("");
}
this.gaService = new AnalyticsReportingService(
new BaseClientService.Initializer
{
ApplicationName = "Testing",
HttpClientInitializer = credentials
});
}
catch (Exception e)
{
throw new Exception("Can't start Google service.");
}
this.viewId = viewId;
}
public IList<Report> GetReports(DateRange dateRange, List<Metric> metrics, List<Dimension> dimensions, string filters = null, List<OrderBy> orderBys = null)
{
var reportRequest = new ReportRequest
{
DateRanges = new List<DateRange> { dateRange },
Dimensions = dimensions,
Metrics = metrics,
FiltersExpression = filters,
ViewId = this.viewId,
OrderBys = orderBys
};
var getReportsRequest = new GetReportsRequest
{
ReportRequests = new List<ReportRequest> { reportRequest }
};
ReportsResource.BatchGetRequest batchRequest = this.gaService.Reports.BatchGet(getReportsRequest);
GetReportsResponse resp = batchRequest.Execute();
return resp.Reports;
}
public IList<Profile> GetAvailableProfiles()
{
var response = Service.Management.Profiles.List("~all", "~all").Execute();
return response.Items;
}
}
The category I'm trying to filter exists, and if I try to use these exact metrics, dimensions, and filters at: https://ga-dev-tools.appspot.com/query-explorer/#report-end it all works just fine.
And I'm calling it from this Controller:
private void Test(HttpContext ctx)
{
var dateRange = new DateRange
{
StartDate = "2018-01-01",
EndDate = "2018-02-01"
};
List<Metric> metrics = GenerateMetricsListFromStrings(new ArrayList()
{
"ga:pageviews",
"ga:totalEvents",
"ga:pageviewsPerSession",
"ga:users",
"ga:sessions"
});
List<Dimension> dimensions = GenerateDimensionsListFromStrings(new ArrayList()
{
"ga:browser",
"ga:operatingSystem",
"ga:country",
"ga:hour",
"ga:date"
});
string filters = "ga:eventCategory==Test";
IList<Report> data = this.ga.GetReports(dateRange, metrics, dimensions, filters);
foreach (var item in data.First().Data.Rows)
{
ctx.Response.Write(
String.Join(", ", item.Dimensions) + " " + String.Join(", ", item.Metrics.First().Values)
);
}
}
/**
* ...
*/
private List<Metric> GenerateMetricsListFromStrings(ArrayList metrics)
{
List<Metric> metrictsList = new List<Metric>();
foreach (string metric in metrics)
{
metrictsList.Add(new Metric()
{
Expression = metric
});
}
return metrictsList;
}
/**
* ...
*/
private List<Dimension> GenerateDimensionsListFromStrings(ArrayList dimensions)
{
List<Dimension> dimensionsList = new List<Dimension>();
foreach (string dim in dimensions)
{
dimensionsList.Add(new Dimension()
{
Name = dim
});
}
return dimensionsList;
}
Thanks.
Good grief, I had wrong the date...
I was trying to get data from 2018 instead of this year...
var dateRange = new DateRange
{
StartDate = "2018-01-01",
EndDate = "2019-02-01"
};