-
-
Save 0liver/11229128 to your computer and use it in GitHub Desktop.
/* based on the docs at: https://developers.google.com/analytics/devguides/collection/protocol/v1/devguide */ | |
/* | |
* LICENSE: MIT | |
* AUTOHR: [email protected] | |
*/ | |
using System; | |
using System.Collections.Generic; | |
using System.IO; | |
using System.Linq; | |
using System.Net; | |
using System.Text; | |
using System.Web; | |
namespace Generic.Core.WebContext | |
{ | |
public class GoogleAnalyticsApi | |
{ | |
public static void TrackEvent(string category, string action, string label, int? value = null) | |
{ | |
Track(HitType.@event, category, action, label, value); | |
} | |
public static void TrackPageview(string category, string action, string label, int? value = null) | |
{ | |
Track(HitType.@pageview, category, action, label, value); | |
} | |
private static void Track(HitType type, string category, string action, string label, | |
int? value = null) | |
{ | |
if (string.IsNullOrEmpty(category)) throw new ArgumentNullException("category"); | |
if (string.IsNullOrEmpty(action)) throw new ArgumentNullException("action"); | |
var request = (HttpWebRequest) WebRequest.Create("http://www.google-analytics.com/collect"); | |
request.Method = "POST"; | |
// the request body we want to send | |
var postData = new Dictionary<string, string> | |
{ | |
{ "v", "1" }, | |
{ "tid", "UA-XXXXXX-XX" }, | |
{ "cid", "555" }, | |
{ "t", type.ToString() }, | |
{ "ec", category }, | |
{ "ea", action }, | |
}; | |
if (!string.IsNullOrEmpty(label)) | |
{ | |
postData.Add("el", label); | |
} | |
if (value.HasValue) | |
{ | |
postData.Add("ev", value.ToString()); | |
} | |
var postDataString = postData | |
.Aggregate("", (data, next) => string.Format("{0}&{1}={2}", data, next.Key, | |
HttpUtility.UrlEncode(next.Value))) | |
.TrimEnd('&'); | |
// set the Content-Length header to the correct value | |
request.ContentLength = Encoding.UTF8.GetByteCount(postDataString); | |
// write the request body to the request | |
using (var writer = new StreamWriter(request.GetRequestStream())) | |
{ | |
writer.Write(postDataString); | |
} | |
try | |
{ | |
var webResponse = (HttpWebResponse) request.GetResponse(); | |
if (webResponse.StatusCode != HttpStatusCode.OK) | |
{ | |
throw new HttpException((int) webResponse.StatusCode, | |
"Google Analytics tracking did not return OK 200"); | |
} | |
} | |
catch (Exception ex) | |
{ | |
// do what you like here, we log to Elmah | |
// ElmahLog.LogError(ex, "Google Analytics tracking failed"); | |
} | |
} | |
private enum HitType | |
{ | |
// ReSharper disable InconsistentNaming | |
@event, | |
@pageview, | |
// ReSharper restore InconsistentNaming | |
} | |
} | |
} |
Also you should update this to be https:
According to their docs:
https://developers.google.com/analytics/devguides/collection/protocol/v1/reference
Transport
URL Endpoint
You send data using the Measurement Protocol by making HTTP requests to the following end point:
https://www.google-analytics.com/collect
All data should be sent securely with the HTTPS protocol.
You can send data using either POST or GET requests.
Hi,
I think for tracking pages, the code is not correct. Need to pass parameters dh, dp, dt
See documentation:
https://developers.google.com/analytics/devguides/collection/protocol/v1/devguide
v=1 // Version.
&tid=UA-XXXXX-Y // Tracking ID / Property ID.
&cid=555 // Anonymous Client ID.
&t=pageview // Pageview hit type.
&dh=mydemo.com // Document hostname.
&dp=/home // Page.
&dt=homepage // Title.
Google Analytics 4 ?
No 😁 The gist was last edited in 2015 - I think we had GAv2 back then 😉
Will this work with GA-4 key ?
Please try it out for yourself - I am not maintaining this piece of code. Thank you.
Hi There, thanks for the code but no events are recorded when I use it. I think this may be to do with "cid", "555" -- where do I get the value which should overwrite the "555" from your sample code ? thanks C