static void Main(string[] args)
        {
            var credential = Google.Apis.Auth.OAuth2.GoogleCredential.FromFile("serviceAccount.json")
                             .CreateScoped(new[] { Google.Apis.AnalyticsReporting.v4.AnalyticsReportingService.Scope.AnalyticsReadonly });

            using (var analytics = new Google.Apis.AnalyticsReporting.v4.AnalyticsReportingService(new Google.Apis.Services.BaseClientService.Initializer {
                HttpClientInitializer = credential
            })) {
                var request = analytics.Reports.BatchGet(new GetReportsRequest {
                    ReportRequests = new[] {
                        new ReportRequest {
                            DateRanges = new[] { new DateRange {
                                                     StartDate = "2019-01-01", EndDate = "2019-01-31"
                                                 } },
                            Dimensions = new[] { new Dimension {
                                                     Name = "ga:date"
                                                 } },
                            Metrics = new[] { new Metric {
                                                  Expression = "ga:sessions", Alias = "Sessions"
                                              } },
                            ViewId = "99999999"
                        }
                    }
                });
                var response = request.Execute();
                foreach (var row in response.Reports[0].Data.Rows)
                {
                    Console.Write(string.Join(",", row.Dimensions) + ": ");
                    foreach (var metric in row.Metrics)
                    {
                        Console.WriteLine(string.Join(",", metric.Values));
                    }
                }
            }
            Console.WriteLine("Done");
            Console.ReadKey(true);
        }
Пример #2
0
        public List <DimensionResult4Columns> GetDimensionsAndMetricsUneven(string authenticationJson, string viewId, List <Dimension> dimensions, List <Metric> metrics, string startDate, string endDate, string filter = "", OrderBy orderBy = null)
        {
            var browserSessions = new List <DimensionResult4Columns>();

            var credential = Google.Apis.Auth.OAuth2.GoogleCredential.FromJson(authenticationJson)
                             .CreateScoped(new[] { Google.Apis.AnalyticsReporting.v4.AnalyticsReportingService.Scope.AnalyticsReadonly });

            using (var analytics = new Google.Apis.AnalyticsReporting.v4.AnalyticsReportingService(new Google.Apis.Services.BaseClientService.Initializer
            {
                HttpClientInitializer = credential
            }))
            {
                // Create the DateRange object.
                DateRange dateRange = new DateRange()
                {
                    StartDate = startDate, EndDate = endDate
                };

                // Create the ReportRequest object.
                // Create the ReportRequest object.
                ReportRequest reportRequest = new ReportRequest
                {
                    ViewId     = viewId,
                    DateRanges = new List <DateRange>()
                    {
                        dateRange
                    },
                    Dimensions        = dimensions, // new List<Dimension>() { browser, campaign, age },
                    FiltersExpression = filter,
                    PageSize          = 10000,
                    OrderBys          = new List <OrderBy>()
                    {
                        orderBy
                    },
                    Metrics = metrics, // new List<Metric>() { sessions, pageviews }
                };

                List <ReportRequest> requests = new List <ReportRequest>();
                requests.Add(reportRequest);

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

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

                var rows = response.Reports.FirstOrDefault().Data.Rows;
                foreach (var row in rows)
                {
                    if ((row.Dimensions.Count() == 3 || row.Dimensions.Count() == 4) && row.Metrics.Count() == 1)
                    {
                        browserSessions.Add(new DimensionResult4Columns()
                        {
                            FirstColumn  = row.Dimensions[0],
                            SecondColumn = row.Dimensions[1],
                            ThirdColumn  = row.Dimensions[2],
                            Value        = row.Metrics.FirstOrDefault().Values[0]
                        });
                    }
                }
            }

            return(browserSessions);
        }
Пример #3
0
        static void Main(string[] args)
        {
            Console.WriteLine("Google Analytics Reports and ADSense revenue analyser");

            try
            {
                DateTime now     = DateTime.Now;
                int      lastDay = DateTime.DaysInMonth(now.Year, now.Month);

                DateTime startDate = new DateTime(now.Year, now.Month, 01);
                DateTime endDate   = new DateTime(now.Year, now.Month, lastDay);

                Console.WriteLine("Report from {0} to {1}", startDate, endDate);

                string gaViewID = "142868091";                  //View ID in Google Analytics

                string jsonAPIFile = Environment.GetEnvironmentVariable(ENV_VAR_JSON_SECRET_FILE);
                if (string.IsNullOrEmpty(jsonAPIFile))
                {
                    Console.WriteLine("Environment variable not found:" + ENV_VAR_JSON_SECRET_FILE);
                }

                UriBuilder uri       = new UriBuilder(Assembly.GetExecutingAssembly().CodeBase);
                string     startPath = Path.GetDirectoryName(Uri.UnescapeDataString(uri.Path));

                string jsonAPIAuth = Path.Combine(startPath, jsonAPIFile);

                UserCredential credential;

                using (var stream = new FileStream(jsonAPIAuth, FileMode.Open, FileAccess.Read))
                {
                    //в этой подпапке будут сохраняться "подтвержденные" данные авторизации. До тех пор, пока эта вещь живая, спрашивать в браузере не будут
                    //А вот если ее удалить, то запустят браузер и спросят подтверждение через gmail
                    string credPath = Path.Combine(startPath, "creds.json");

                    credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
                        GoogleClientSecrets.Load(stream).Secrets,
                        _SCOPES,
                        "user",
                        CancellationToken.None,
                        new FileDataStore(credPath, true)).Result;
                }

                var init = new BaseClientService.Initializer
                {
                    ApplicationName       = "kawaiimobile-ga2",
                    HttpClientInitializer = credential
                };

                //https://developers.google.com/analytics/devguides/reporting/core/v4/samples?hl=ru#c

                var service = new Google.Apis.AnalyticsReporting.v4.AnalyticsReportingService(init);

                bool buildRevenueReport = true;
                bool buildPagesReport   = true;

                //URL => сведения о показах и доходе с него
                Dictionary <string, RevenueReportRow> urlToRevenueRow = new Dictionary <string, RevenueReportRow>();

                if (buildRevenueReport)
                {
                    var publisherRevenueReport = new PublisherRevenueReportBuilder(service, gaViewID);
                    var revenueReport          = publisherRevenueReport.Build(startDate, endDate);

                    var reportRows = revenueReport.Rows;

                    if (reportRows != null)
                    {
                        Dictionary <string, PostGroup> urlToRows = new Dictionary <string, PostGroup>();

                        foreach (var item in reportRows)
                        {
                            urlToRevenueRow[item.URL] = item;

                            if (!urlToRows.TryGetValue(item.MainPostURL, out PostGroup postGroup))
                            {
                                postGroup = new PostGroup(item.MainPostURL);
                                urlToRows[item.MainPostURL] = postGroup;
                            }

                            postGroup.Add(item);
                        }

                        //теперь сгруппируем по доходу

                        var ord = (from x in urlToRows orderby x.Value.TotalRevenue descending select x.Value).ToArray();

                        string reportFileName = Path.Combine(startPath, "Revenue report full.txt");
                        _SaveRevenueReport(reportFileName, ord, revenueReport.TotalRevenue, false);

                        //и еще краткий отчет - где исключено все, что мало смысленно
                        string reportFileNameOpt = Path.Combine(startPath, "Revenue report optimized.txt");
                        _SaveRevenueReport(reportFileNameOpt, ord, revenueReport.TotalRevenue, true);
                    }

                    Console.WriteLine("ADSense revenue report done...");
                }

                if (buildPagesReport)
                {
                    var pagesReportBuilder = new PagesReport.VisitedPagesReportBuilder(service, gaViewID);
                    var pagesReport        = pagesReportBuilder.Build(startDate, endDate);

                    var pagesReportRows = pagesReport.Rows;

                    string reportPagesFileName = Path.Combine(startPath, "Pages report.txt");

                    _SavePagesReport(reportPagesFileName, pagesReportRows);

                    Console.WriteLine("Visited pages report done...");

                    //теперь можно найти все страницы с более-менее приличной посещаемостью, но без показов ADSense - это значит у них "проблемы"
                    int minViews = 10;                      //это минимальный порог просмотров для анализа

                    string badPagesFileReport = Path.Combine(startPath, "Failed pages report.txt");

                    using (var failedLog = File.CreateText(badPagesFileReport))
                    {
                        foreach (var row in pagesReportRows)
                        {
                            int views = row.PageViews;
                            if (views < minViews)
                            {
                                continue;
                            }

                            //смотрим по этому же урлу статус отчета ADSense - показов должно быть больше 0. Если 0 - это страница под "баном"
                            string url = row.URL;

                            //в корне сайта нет баннеров
                            if (url == "/")
                            {
                                continue;
                            }

                            //баннеров нет на страницах (1-2-3...) , на тегах, категориях, библиотеке и архиве
                            if (url.StartsWith("/page/") || url.StartsWith("/tag/") || url.StartsWith("/category/") || url.StartsWith("/library/") || url.StartsWith("/anime-by-genres/") || url.StartsWith("/archives/") || url.StartsWith("/?source=pwa") || url.StartsWith("/?s="))
                            {
                                continue;
                            }

                            string adsViews = "NO ADS";
                            if (urlToRevenueRow.TryGetValue(url, out RevenueReportRow foundRev))
                            {
                                if (foundRev.Impressions > 0)
                                {
                                    //показы были, но может это единичные вещи - а посещаемость страницы весьма неплохая?
                                    //какой процент показов ?
                                    float percent      = views / 100;
                                    float viewsPercent = foundRev.Impressions / percent;

                                    if (viewsPercent > 35)                                      //35% от общего числа просмотров страницы считаем плохим показателем
                                    {
                                        continue;
                                    }

                                    adsViews = $"Impressions: {foundRev.Impressions}   Revenue: {foundRev.Revenue}";
                                }
                            }

                            failedLog.WriteLine($"{url} - Page views: {row.PageViews} - {adsViews}");
                        }
                    }                    //using failedLog
                }



                Console.WriteLine("Done");
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
        }