/// <summary> /// Gets historical data based on the specified <paramref name="options"/>. /// </summary> /// <param name="options">The options for the request to the API.</param> /// <returns>An instance of <see cref="AnalyticsGetDataResponse"/> representing the response.</returns> public AnalyticsGetDataResponse GetData(AnalyticsGetDataOptions options) { if (options == null) { throw new ArgumentNullException(nameof(options)); } return(AnalyticsGetDataResponse.ParseResponse(Raw.GetData(options))); }
/// <summary> /// Gets historical data based on the specified <paramref name="options"/>. /// </summary> /// <param name="options">The options for the call to the API.</param> /// <returns>An instance of <see cref="IHttpResponse"/> representing the response.</returns> public IHttpResponse GetData(AnalyticsGetDataOptions options) { if (options == null) { throw new ArgumentNullException(nameof(options)); } return(Client.GetResponse(options)); }
private object GetHistory(AnalyticsEndpoint analytics, string profileId, IPublishedContent content, AnalyticsDataMode mode, Period period) { // Declare the options for the request AnalyticsGetDataOptions options = new AnalyticsGetDataOptions { ProfileId = profileId, StartDate = period.StartDate, EndDate = period.EndDate, Metrics = AnalyticsMetrics.Sessions + AnalyticsMetrics.Pageviews, Dimensions = AnalyticsDimensions.Hour }; if (mode == AnalyticsDataMode.Page) { // Google Analytics sees the same URL with and without a trailing slash as two different pages, so we should tell the query to check both string pageUrlTrimmed = content.Url.TrimEnd('/'); string pageUrlSlashed = pageUrlTrimmed + '/'; options.Filters.Add(new AnalyticsDimensionFilter(AnalyticsDimensions.PagePath, AnalyticsDimensionOperator.ExactMatch, pageUrlTrimmed)); options.Filters.Add(new AnalyticsDimensionFilter(AnalyticsDimensions.PagePath, AnalyticsDimensionOperator.ExactMatch, pageUrlSlashed)); } // Determine the dimension based on the length of the period if (period.Days <= 1) { options.Dimensions = AnalyticsDimensions.Hour; } else if (period.Days <= 31) { options.Dimensions = AnalyticsDimensions.Date; } else { options.Dimensions = AnalyticsDimensions.YearWeek; } // Get the data from the Analytics API AnalyticsGetDataResponse response = analytics.Data.GetData(options); // Return an empty model if there are no valid rows if (response.Body.Rows.All(x => x.GetInt32(AnalyticsMetrics.Sessions) == 0)) { return(new AnalyticsHistory()); } // Initialize the data sets ChartJsDataSet pageviews = new ChartJsDataSet("Pageviews", "#F1BFBD"); ChartJsDataSet sessions = new ChartJsDataSet("Sessions", "#1D274E"); // Initialize the chart data ChartJsData chart = new ChartJsData { DataSets = new List <ChartJsDataSet> { pageviews, sessions } }; // Populate the labels and data of each data set foreach (AnalyticsDataRow row in response.Body.Rows) { if (row.TryGetValue(AnalyticsDimensions.Date, out string date)) { DateTime dt = DateTime.ParseExact(date, "yyyyMMdd", CultureInfo.InvariantCulture); chart.Labels.Add(dt.ToString("MMM d")); } else if (row.TryGetValue(AnalyticsDimensions.Hour, out string hour)) { chart.Labels.Add(hour); } else if (row.TryGetValue(AnalyticsDimensions.YearWeek, out string yearWeek)) { chart.Labels.Add("W" + Int32.Parse(yearWeek.Substring(4))); } else { chart.Labels.Add(row.Cells[0].Value); } chart.Rows.Add(row); pageviews.Data.Add(row.GetString(AnalyticsMetrics.Pageviews)); sessions.Data.Add(row.GetString(AnalyticsMetrics.Sessions)); } return(new AnalyticsHistory { Chart = chart }); }