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); }
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); }
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()); } }