using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.IO; using System.Threading; using Google.Apis.AnalyticsReporting.v4; using Google.Apis.AnalyticsReporting.v4.Data; using Google.Apis.Auth.OAuth2; using Google.Apis.Services; using Google.Apis.Util.Store; using Newtonsoft.Json; namespace GoogleAnalyticsDataDownload { public class Site { public string Name { get; set; } public string ViewId { get; set; } }; public class Conditions { public int Interest { get; set; } public int Category { get; set; } public int Gender { get; set; } public int Age { get; set; } }; class Program { public static object Session { get; private set; } static void Main(string[] args) { try { var credential = GetCredential().Result; //TextWriter dataFile = new StreamWriter(@"C:GaApiReaderHourGranulationGoogleAnalyticsData.txt", false); TextWriter dataFile = new StreamWriter(@"C:HourGranulationGoogleAnalyticsData.txt", false); //TextWriter dataFile = new StreamWriter(@"C:Userskatarzyna.panasiukDesktopGoogleAnalyticsDataDownloadForReportGoogleAnalyticsData.txt", false); using (var svc = new AnalyticsReportingService( new BaseClientService.Initializer { HttpClientInitializer = credential, ApplicationName = "Google Analytics API Console" })) { //weekly DateTime StartDateRange = new DateTime(DateTime.Today.AddDays(-7).Year, DateTime.Today.AddDays(-7).Month, DateTime.Today.AddDays(-7).Day); string YearStartDate = StartDateRange.Year.ToString(); string MonthStartDate = ("0" + StartDateRange.Month.ToString()); MonthStartDate = MonthStartDate.Substring(MonthStartDate.Length - 2, 2); string DayStartDate = ("0" + StartDateRange.Day.ToString()); DayStartDate = DayStartDate.Substring(DayStartDate.Length - 2, 2); DateTime EndDateRange = new DateTime(DateTime.Today.AddDays(-1).Year, DateTime.Today.AddDays(-1).Month, DateTime.Today.AddDays(-1).Day); string YearEndDate = EndDateRange.Year.ToString(); string MonthEndDate = ("0" + EndDateRange.Month.ToString()); MonthEndDate = MonthEndDate.Substring(MonthEndDate.Length - 2, 2); string DayEndDate = ("0" + EndDateRange.Day.ToString()); DayEndDate = DayEndDate.Substring(DayEndDate.Length - 2, 2); //ZAKRES DAT var dateRange = new DateRange { StartDate = YearStartDate + "-" + MonthStartDate + "-" + DayStartDate, EndDate = YearEndDate + "-" + MonthEndDate + "-" + DayEndDate }; Console.WriteLine("Start date: " + YearStartDate + "-" + MonthStartDate + "-" + DayStartDate); Console.WriteLine("End date: " + YearEndDate + "-" + MonthEndDate + "-" + DayEndDate); //MIARY var sessions = new Metric { Expression = "ga:sessions", Alias = "Sessions" }; var pageviews = new Metric { Expression = "ga:pageviews", Alias = "PageViews" }; var users = new Metric { Expression = "ga:users", Alias = "Users" }; //WYMIARY var year = new Dimension { Name = "ga:year" }; var month = new Dimension { Name = "ga:month" }; var day = new Dimension { Name = "ga:day" }; var hour = new Dimension { Name = "ga:hour" }; var age = new Dimension { Name = "ga:userAgeBracket" }; var gender = new Dimension { Name = "ga:userGender" }; //WYMIARY - INTEREST var interestOtherCategory = new Dimension { Name = "ga:interestOtherCategory" }; var interestInMarketCategory = new Dimension { Name = "ga:interestInMarketCategory" }; var interestAffinityCategory = new Dimension { Name = "ga:interestAffinityCategory" }; List sites = new List(); sites.Add(new Site() { Name = "Glamour", ViewId = "4602634" }); sites.Add(new Site() { Name = "Focus", ViewId = "4524300" }); sites.Add(new Site() { Name = "Gala", ViewId = "4695680" }); //sites.Add(new Site() { Name = "SlowlyVeggie", ViewId = "102281875" }); //problem z dostepem ? //sites.Add(new Site() { Name = "Kobieta", ViewId = "4865279" }); //sites.Add(new Site() { Name = "Mój Piękny Ogród", ViewId = "47630724" }); //sites.Add(new Site() { Name = "Burda", ViewId = "61966321" }); //sites.Add(new Site() { Name = "Elle", ViewId = "61961573" }); //sites.Add(new Site() { Name = "InStyle", ViewId = "64813361" }); //sites.Add(new Site() { Name = "CRN", ViewId = "7264016" }); //sites.Add(new Site() { Name = "Moje Gotowanie", ViewId = "4865333" }); //sites.Add(new Site() { Name = "Przyślij Przepis", ViewId = "55337319" }); //sites.Add(new Site() { Name = "National Geographic", ViewId = "4524316" }); //sites.Add(new Site() { Name = "Claudia", ViewId = "119034446" }); List lines = new List(); lines.Add("Site;Users;Sessions;PageViews;Year;Month;Day;Hour;Interest;Category;Gender;Age"); List interests = new List(); interests.Add("OtherCategory"); interests.Add("InMarketCategory"); interests.Add("AffinityCategory"); var Filter = new DimensionFilter(); var FilterClause = new DimensionFilterClause(); int requestCount = 0; List conditions = new List(); conditions.Add(new Conditions() { Interest = 0, Category = 0, Gender = 0, Age = 0 }); conditions.Add(new Conditions() { Interest = 1, Category = 0, Gender = 0, Age = 0}); //conditions.Add(new Conditions() { Interest = 1, Category = 1, Gender = 0, Age = 0}); //conditions.Add(new Conditions() { Interest = 1, Category = 1, Gender = 1, Age = 0}); //conditions.Add(new Conditions() { Interest = 1, Category = 1, Gender = 0, Age = 1}); //conditions.Add(new Conditions() { Interest = 1, Category = 1, Gender = 1, Age = 1}); var interestDimension = new Dimension {}; foreach (var site in sites) { Console.WriteLine(site.Name); var reportRequest = new ReportRequest { DateRanges = new List { dateRange }, Dimensions = new List {}, Metrics = new List { users, sessions, pageviews}, DimensionFilterClauses = new List {}, ViewId = site.ViewId, PageSize = 10000 }; foreach(string interest in interests) { foreach (var condition in conditions) { reportRequest.Dimensions.Add(year); reportRequest.Dimensions.Add(month); reportRequest.Dimensions.Add(day); reportRequest.Dimensions.Add(hour); if ( condition.Interest == 1 && condition.Category == 0 ) { Filter.DimensionName = "ga:interest" + interest; Filter.Expressions = new List { "" }; FilterClause.Filters = new List { Filter }; reportRequest.DimensionFilterClauses.Add(FilterClause); } if( condition.Interest == 1 && condition.Category == 1 ) { interestDimension = new Dimension { Name = "ga:interest" + interest }; reportRequest.Dimensions.Add(interestDimension); if( condition.Gender == 1 ) { reportRequest.Dimensions.Add(gender); } if( condition.Age == 1 ) { reportRequest.Dimensions.Add(age); } } try { if (requestCount == 100) { System.Threading.Thread.Sleep(100000); requestCount = 0; } var getReportsRequest = new GetReportsRequest { ReportRequests = new List { reportRequest } }; requestCount += 1; var batchRequest = svc.Reports.BatchGet(getReportsRequest); var response = batchRequest.Execute(); string responseLine = ""; int xcount = response.Reports.First().Data.Rows.Count; foreach (var x in response.Reports.First().Data.Rows) { responseLine = site.Name + ";" + string.Join(";", x.Metrics.First().Values) + ";"; if (condition.Interest == 0) { lines.Add(responseLine + string.Join(";", x.Dimensions) + ";;;;"); } else { if (condition.Category == 0) { lines.Add(responseLine + string.Join(";", x.Dimensions) + ";" + interest + ";;;"); } else { responseLine += x.Dimensions.ElementAt(0) + ";" + x.Dimensions.ElementAt(1) + ";" + interest + ";" + x.Dimensions.ElementAt(2) + ";"; if (condition.Age == 0 && condition.Gender == 0) { lines.Add(responseLine + ";"); } else if (condition.Age == 0 && condition.Gender == 1) { lines.Add(responseLine + x.Dimensions.ElementAt(3) + ";"); } else if (condition.Age == 1 && condition.Gender == 0) { lines.Add(responseLine + ";" + x.Dimensions.ElementAt(3)); } else { lines.Add(responseLine + x.Dimensions.ElementAt(3) + ";" + x.Dimensions.ElementAt(4)); } } } } } catch (Exception ex) { //TextWriter errorFile = new StreamWriter(@"C:GaApiReaderHourGranulationError.txt", true); TextWriter errorFile = new StreamWriter(@"C:HourGranulationError.txt", true); //TextWriter errorFile = new StreamWriter(@"C:Userskatarzyna.panasiukDesktopGoogleAnalyticsDataDownloadForReportError.txt", true); errorFile.WriteLine("--------------------------------------------------------------------------------------------"); errorFile.WriteLine("ERROR " + site.Name + " " + DateTime.Now); errorFile.WriteLine(ex.ToString()); errorFile.Close(); } reportRequest.DimensionFilterClauses.Clear(); reportRequest.Dimensions.Clear(); } } } string lines2 = string.Join("|", lines); dataFile.WriteLine(lines2); lines.Clear(); } dataFile.Close(); } catch (Exception ex) { //TextWriter errorFile = new StreamWriter(@"C:GaApiReaderHourGranulationError.txt", true); TextWriter errorFile = new StreamWriter(@"C:HourGranulationError.txt", true); //TextWriter errorFile = new StreamWriter(@"C:Userskatarzyna.panasiukDesktopGoogleAnalyticsDataDownloadForReportError.txt", true); errorFile.WriteLine("n ERROR " + DateTime.Now); errorFile.WriteLine(ex.ToString()); errorFile.Close(); Console.WriteLine("ERROR"); Console.WriteLine(ex.ToString()); Console.ReadKey(); } } static async Task GetCredential() { //using (var stream = new FileStream(@"C:Userskatarzyna.panasiukDesktopGoogleAnalyticsDataDownloadclient_secret.json", FileMode.Open, FileAccess.Read)) //using (var stream = new FileStream(@"C:GaApiReaderHourGranulationclient_secret.json", FileMode.Open, FileAccess.Read)) using (var stream = new FileStream(@"C:HourGranulationclient_secret.json", FileMode.Open, FileAccess.Read)) //using (var stream = new FileStream(@"C:Userskatarzyna.panasiukDesktopGoogleAnalyticsDataDownloadForReportclient_secret.json", FileMode.Open, FileAccess.Read)) { const string loginEmailAddress = "pawel.lewko@cfteurope.pl"; return await GoogleWebAuthorizationBroker.AuthorizeAsync ( GoogleClientSecrets.Load(stream).Secrets, new[] { AnalyticsReportingService.Scope.Analytics }, loginEmailAddress, CancellationToken.None ); } } } }