示例#1
0
        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
            });
        }
示例#2
0
        public object GetData(int pageId, string period = "yesterday")
        {
            IPublishedContent content = Umbraco.Content(pageId);

            if (content == null)
            {
                return(Request.CreateResponse(JsonMetaResponse.GetError("Page not found or not published.")));
            }

            IPublishedContent site = GetSiteNode(content);

            if (site == null)
            {
                return(Request.CreateResponse(JsonMetaResponse.GetError("Unable to determine site node.")));
            }

            AnalyticsProfileSelection selection = site.Value("analyticsProfile") as AnalyticsProfileSelection;

            // Get a reference to the configuration of this package
            AnalyticsConfig config = AnalyticsConfig.Current;

            string        profileId = null;
            GoogleService service   = null;

            if (selection != null && selection.IsValid)
            {
                profileId = selection.Profile.Id;

                AnalyticsConfigUser user = config.GetUserById(selection.User.Id);

                if (user != null)
                {
                    service = GoogleService.CreateFromRefreshToken(
                        user.Client.ClientId,
                        user.Client.ClientSecret,
                        user.RefreshToken
                        );
                }
            }

            // Fallback to app settings (if specified)
            if (service == null && config.HasAppSettings)
            {
                profileId = config.AppSettings.AnalyticsProfileId;

                service = GoogleService.CreateFromRefreshToken(
                    config.AppSettings.GoogleClientId,
                    config.AppSettings.GoogleClientSecret,
                    config.AppSettings.GoogleRefreshToken
                    );
            }

            if (String.IsNullOrWhiteSpace(profileId) || service == null)
            {
                return(Request.CreateResponse(JsonMetaResponse.GetError("The Analytics package is not configured.")));
            }



            AnalyticsDataMode mode = content.Id == site.Id ? AnalyticsDataMode.Site : AnalyticsDataMode.Page;

            Period p = Period.Parse(period);

            return(new {
                period = p,
                page = new {
                    id = content.Id,
                    name = content.Name,
                    url = content.Url
                },
                history = GetHistory(service.Analytics, profileId, content, mode, p)
            });
        }