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<Site> sites = new List<Site>();
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<String> lines = new List<string>();
lines.Add("Site;Users;Sessions;PageViews;Year;Month;Day;Hour;Interest;Category;Gender;Age");
List<String> interests = new List<string>();
interests.Add("OtherCategory");
interests.Add("InMarketCategory");
interests.Add("AffinityCategory");
var Filter = new DimensionFilter();
var FilterClause = new DimensionFilterClause();
int requestCount = 0;
List<Conditions> conditions = new List<Conditions>();
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> { dateRange },
Dimensions = new List<Dimension> {},
Metrics = new List<Metric> { users, sessions, pageviews},
DimensionFilterClauses = new List<DimensionFilterClause> {},
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<string> { "" };
FilterClause.Filters = new List<DimensionFilter> { 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> { 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<UserCredential> 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))
{
return await GoogleWebAuthorizationBroker.AuthorizeAsync
(
GoogleClientSecrets.Load(stream).Secrets,
new[] { AnalyticsReportingService.Scope.Analytics },
loginEmailAddress, CancellationToken.None
);
}
}
}
}