Use Google Analytics API to show information in C#
Use Google Analytics API to show information in C#
I been looking for a good solution all day but google evolve so fast that I can't find something working. What I want to do is that, I have a Web app that has an admin section where user need to be logged in to see the information. In this section I want to show some data from GA, like pageviews for some specific urls. Since it's not the user information that I'm showing but the google analytics'user I want to connect passing information (username/password or APIKey) but I can't find out how. All the sample I found use OAuth2 (witch, if I understand, will ask the visitor to log in using google).
What I found so far :
- Google official Client Library for .Net : http://code.google.com/p/google-api-dotnet-client/, no sample for GA
- official developers help : https://developers.google.com/analytics/
- an other question with code on SO : Google Analytics API - Programmatically fetch page views in server side but I get a 403 when I try to authenticate
- some source that access the API : http://www.reimers.dk/jacob-reimers-blog/added-google-analytics-reader-for-net downloaded the source but I can't figure out how it works
- this other question on SO : Google Analytics Access with C# but it does not help
- while writing this they suggest me this 09 old post Google Analytics API and .Net...
Maybe I'm just tired and that tomorrow it will be easy to find a solution but right now I need help!
Thanks
Answer by MoXplod for Use Google Analytics API to show information in C#
I did a lot of search and finally either looking up code from multiple places and then wrapping my own interface around it i came up with the following solution. Not sure if people paste their whole code here, but i guess why not save everyone else time :)
Pre-requisites, you will need to install Google.GData.Client and google.gdata.analytics package/dll.
This is the main class that does the work.
namespace Utilities.Google { public class Analytics { private readonly String ClientUserName; private readonly String ClientPassword; private readonly String TableID; private AnalyticsService analyticsService; public Analytics(string user, string password, string table) { this.ClientUserName = user; this.ClientPassword = password; this.TableID = table; // Configure GA API. analyticsService = new AnalyticsService("gaExportAPI_acctSample_v2.0"); // Client Login Authorization. analyticsService.setUserCredentials(ClientUserName, ClientPassword); } /// /// Get the page views for a particular page path /// /// /// /// /// make this false if the pagePath is a regular expression /// public int GetPageViewsForPagePath(string pagePath, DateTime startDate, DateTime endDate, bool isPathAbsolute = true) { int output = 0; // GA Data Feed query uri. String baseUrl = "https://www.google.com/analytics/feeds/data"; DataQuery query = new DataQuery(baseUrl); query.Ids = TableID; //query.Dimensions = "ga:source,ga:medium"; query.Metrics = "ga:pageviews"; //query.Segment = "gaid::-11"; var filterPrefix = isPathAbsolute ? "ga:pagepath==" : "ga:pagepath=~"; query.Filters = filterPrefix + pagePath;
And this is the interface and implementation that i use to wrap it up with.
namespace Utilities { public interface IPageViewCounter { int GetPageViewCount(string relativeUrl, DateTime startDate, DateTime endDate, bool isPathAbsolute = true); Dictionary PageViewCounts(string pagePathRegEx, DateTime startDate, DateTime endDate); } public class GooglePageViewCounter : IPageViewCounter { private string GoogleUserName { get { return ConfigurationManager.AppSettings["googleUserName"]; } } private string GooglePassword { get { return ConfigurationManager.AppSettings["googlePassword"]; } } private string GoogleAnalyticsTableName { get { return ConfigurationManager.AppSettings["googleAnalyticsTableName"]; } } private Analytics analytics; public GooglePageViewCounter() { analytics = new Analytics(GoogleUserName, GooglePassword, GoogleAnalyticsTableName); } #region IPageViewCounter Members public int GetPageViewCount(string relativeUrl, DateTime startDate, DateTime endDate, bool isPathAbsolute = true) { int output = 0; try { output = analytics.GetPageViewsForPagePath(relativeUrl, startDate, endDate, isPathAbsolute); } catch (Exception ex) { Logger.Error(ex); } return output; } public Dictionary PageViewCounts(string pagePathRegEx, DateTime startDate, DateTime endDate) { var input = analytics.PageViewCounts(pagePathRegEx, startDate, endDate); var output = new Dictionary(); foreach (var item in input) { if (item.Key.Contains('&')) { string[] key = item.Key.Split(new char[] { '?', '&' }); string newKey = key[0] + "?" + key.FirstOrDefault(k => k.StartsWith("p=")); if (output.ContainsKey(newKey)) output[newKey] += item.Value; else output[newKey] = item.Value; } else output.Add(item.Key, item.Value); } return output; }
0 comments:
Post a Comment