-
-
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