gaがデータを送信しているように見えるdoubleclick.netとは?

doubleclick.net 
アクセスすると、doubleclickbygoogle にリダイレクトされます。。よくわからないですね。トラッキングのデータがすべて入ってくるので、広告関係をやっているのでしょうか?サイトを見ると、adコンテンツばかりです。
googleの検索アルゴリズムと、double clickが無関係(な訳ないか)なのか、どう連携しているのかも気になるところですが、運営がgoogleになっている。。
https://www.doubleclickbygoogle.com/

再び、ga.jsですが、どうやってデータを送っているのか、よくわかりません。この変だと思うのですが。。。

return"https:"==J.location.protocol||M.G?"https://ssl.google-analytics.com":"http://www.google-analytics.com"},
														Ce=function(a){
															this.name="len";this.message=a+"-8192"},
															De=function(a){
																this.name="ff2post";
																this.message=a+"-2036"},Sa=function(a,b,c,d){b=b||Fa;if(d||2036>=a.length)gf(a,b,c);
																	else if(8192>=a.length){
																		if(0<=W.navigator.userAgent.indexOf("Firefox")&&![].reduce)throw new De(a.length);

cookieの読み込み

document.cookieでcookieを全て取得します。

console.log(GetCookie('key1'));
function GetCookie(name){
	var result = null;

	var cookieName = name + '=';
	var allcookies = document.cookie;

	var position = allcookies.indexOf(cookieName);
	if(position != -1){
		var startIndex = position + cookieName.length;
		var endIndex = allcookies.indexOf(';', startIndex);
		if(endIndex == -1){
			endIndex == allcookies.length;
		}

		result = decodeURIComponent(allcookies.substring(startIndex, endIndex));
	}
	return result;
}

indexOfは全文検索。allcookieの中で、key3=のポジションを取得
indexOf(‘hoge’, n) は、nの位置から、hogeを全文検索
つまり、indexOf(‘;’, 308)は、308以降の次の’;’を検索
allcookie.substring()で、valueを切り抜いています。

console.log(document.cookie);
console.log(document.cookie.indexOf('key3=')); //position
console.log(308); // start index 
console.log(document.cookie.indexOf(';', 308)); // end index 311
console.log(document.cookie.substring(308, 311));

cookieの書き込み

phpはsetcookie, jsはdocument.cookie

<?php
setcookie("key1", "value1")
?>
<script>
	document.cookie = 'key2=value2';
</script>

有効期限を設定

<script>
	var key = 'fsa';
	var expire = new Date();
	expire.setTime( expire.getTime() + 1000 * 3600 * 24 * 7);
	document.cookie = 'key=' + encodeURIComponent(key)+ '; path = /sample.php; expires = ' + expire.toUTCString();
</script>

アフィリエイトタグとコンバージョンタグの仕組みについて

例えば、VCで広告を作成すると、以下のようなタグは発行される
sidは個人のidで固定, pidは広告の種類によって異なるので、おそらく広告ごとのid?
リンク先がurlでパラメーターとして送られているので、getで取得してsid, pidを保存、setCookieして、設定されたURLリダイレクトさせて、コンバージョンページに行ったら、jsで処理しているのか??

<script language="javascript" src="//ad.jp.ap.valuecommerce.com/servlet/jsbanner?sid=xxxxxxx&pid=yyyyyyyyy"></script><noscript><a href="//ck.jp.ap.valuecommerce.com/servlet/referral?sid=xxxxxxx&pid=yyyyyyyyy" target="_blank" rel="nofollow"><img src="//ad.jp.ap.valuecommerce.com/servlet/gifbanner??sid=xxxxxxx&pid=yyyyyyyyy" border="0"></a></noscript>

gaタグの挙動を理解する

最初gaタグは以下のような記述になっているかと思います。

<script type="text/javascript">
    var _gaq = _gaq || [];
    _gaq.push(['_setAccount', 'UA-xxxxx-x']);
    _gaq.push(['_trackPageview']);
    (function() {

        var ga = document.createElement('script');
        ga.type = 'text/javascript';
        ga.async = true;
        ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
        var s = document.getElementsByTagName('script')[0];
        s.parentNode.insertBefore(ga, s);
    })();
</script>

ga.jsのダミーとして同じディレクトリにtest.jsを作ります。
test.js

console.log(obj[0]);

test.php
objの配列にidを入れて、test.phpからtest.jsを呼び込みます。

<script type="text/javascript">
    var obj = obj || [];
    obj.push('id:1');
    (function() {
        var sa = document.createElement('script');
        sa.type = 'text/javascript';
        sa.async = true;
        sa.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://') + '192.168.33.10:8000/test.js';
        var s = document.getElementsByTagName('script')[0];
        s.parentNode.insertBefore(sa, s);
    })();
</script>

配列のid:1がtest.jsに渡されて、console.logが実行されます。

test.jsの中身を以下に書き換えると

console.log(obj[0]);
console.log(location.pathname);

test.phpのlocation.pathnameが表示されます。

つまり、setAccountとtrackPageviewを配列としてga.jsに渡して、対象ページのユーザー情報、挙動やcookieをga.jsでcollectしているということですね。
  _gaq.push([‘_setAccount’, ‘UA-xxxxxx-x’]);
_gaq.push([‘_trackPageview’]);

あれ、もしかして、アフィリエイトのコンバージョンタグも同じ仕組み?? マジ?

Google Analyticsでip情報を取得する方法

Google Analytics -> 管理 -> プロパティ -> カスタム定義 -> カスタムディメンション をクリック
「+新しいカスタムディメンション」を押下

カスタム ディメンションを追加 で名前を追加
JavaScript(ユニバーサルアナリティクスのプロパティのみで有効)から、
ga(‘set’, ‘dimension1’, dimensionValue); をコピー

GA JSにdimension1 とphpのREMOTE_ADDRの情報を送る

<script>
  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

  ga('create', 'UAxxxxxx-xx', 'auto');
  ga('set', 'dimension1', <?php echo $_SERVER&#91;‘REMOTE_ADDR’&#93;; ?>);
  ga('send', 'pageview');

</script>

あとは、セカンダリディメンション・カスタムディメンションで指定した名前を見れば、ipアドレスを閲覧できますね。

ga.jsでは、タグから送られてきたdimension1とipアドレスを配列に入れて、processingしてgaにレポーティングいるだけですな。
なるほど!ga.jsはまだ途上だが、仕組み自体は少しづつ分かってきた!

javascriptでユーザー情報を取得

<script type="text/javascript">
document.write("HOST : " + location.host + "<br>");
document.write("HOSTNAME : " + location.hostname + "<br>");
document.write("PORT : " + location.port + "<br>");
document.write("REQUEST : " + location.pathname + "<br>");
document.write("CODE : " + navigator.appCodeName + "<br>");
document.write("BROWSER : " + navigator.appName + "<br>");
document.write("VERSION : " + navigator.appVersion + "<br>");
document.write("LANG : " + navigator.language + "<br>");
document.write("PLATFORM : " + navigator.platform + "<br>");
document.write("USERAGENT : " + navigator.userAgent + "<br>");
document.write("REFERER : " + document.referrer + "<br>");
document.write("DOMAIN : " + document.domain + "<br>");
document.write("SCREEN.W : " + screen.width + "<br>");
document.write("SCREEN.H : " + screen.height + "<br>");
document.write("SCREEN.COL : " + screen.colorDepth + "Bit" + "<br>");
</script>

ipアドレスがありませんね。
ga.jsでipに関する記述を見てみると、
line10: Xa=Va(“anonymizeIp”)
くらいしかみつけられません。

Google analyticsのユーザー エクスプローラはipアドレスではなく、ユーザー固有の数字のようです。

ga.js line80-84

どうしよう、これ?このレベルまでもっていかないとお話にならないんですか。。。

var d=new Image(1,1);
d.src=c+a;
d.onload=function(){
	d.onload=null;
	d.onerror=null;
	b()};
d.onerror=function(){
	d.onload=null;
	d.onerror=null;
	b()}},
ef=function(a,b){
	if(0!=Ne().indexOf(J.location.protocol))return!1;
var c=W.XDomainRequest;
if(!c)return!1;
c=new c;
c.open("POST",Ne()+"/p/__utm.gif");
c.onerror=function(){b()};
c.onload=b;
c.send(a);
return!0},df=function(a,b,c,d){
	var e=W.XMLHttpRequest;if(!e)return!1;
	var f=new e;
	if(!("withCredentials"in f))return!1;
	f.open("POST",c||Ne()+"/p/__utm.gif",!0);
	f.withCredentials=
!0;
f.setRequestHeader("Content-Type","text/plain");
f.onreadystatechange=function(){
	if(4==f.readyState){
		if(d)try{var a=f.responseText;
			if(1>a.length||"1"!=a.charAt(0))Ra("xhr","ver",a),b();else if(3<d.count++)Ra("xhr","tmr",""+d.count),b();
			else if(1==a.length)b();
			else{var c=a.charAt(1);
				if("d"==c){var e=d.gb;
					a=(a=b)||Fa;
					df("",a,"https://stats.g.doubleclick.net/j/collect?"+e,d)}
					else if("g"==c){var t="https://www.google.%/ads/ga-audiences?".replace("%","com");
					gf(d.google,b,t);
					var Za=a.substring(2);
					if(Za)if(/^&#91;a-z.&#93;{1,6}$/.test(Za)){var Ma=
"https://www.google.%/ads/ga-audiences?".replace("%",Za);gf(d.google,Fa,Ma)}else Ra("tld","bcc",Za)}else Ra("xhr","brc",c),b()}}catch(mb){b()}else b();
f=null}};
f.send(a);
return!0},Ee=function(a,b){if(!J.body)return We(function(){Ee(a,b)},100),!0;
a=encodeURIComponent(a);
try{
	var c=J.createElement('<iframe name="'+a+'"></iframe>')}catch(e){c=J.createElement("iframe"),c.name=a}c.height="0";
	c.width="0";
	c.style.display="none";
	c.style.visibility="hidden";
	var d=Ne()+"/u/post_iframe.html";
	Ga(W,"beforeunload",
function(){
	c.src="";
	c.parentNode&&c.parentNode.removeChild(c)});
setTimeout(b,1E3);
J.body.appendChild(c);
c.src=d;return!0};
var qf=function(){
	this.G=this.w=!1;0==Ea()%1E4&&(H(142),this.G=!0);
	this.C={};
	this.D=[];
	this.U=0;
	this.S=[["www.google-analytics.com","","/plugins/"]];
	this._gasoCPath=this._gasoDomain=this.bb=void 0;Re();Se()};
	E=qf.prototype;E.oa=function(a,b){return this.hb(a,void 0,b)};
	E.hb=function(a,b,c){b&&H(23);c&&H(67);void 0==b&&(b="~"+M.U++);
	a=new U(b,a,c);
	M.C[b]=a;
	M.D.push(a);
	return a};
	E.u=function(a){
		a=a||"";
		return M.C[a]||M.hb(void 0,a)};
	E.pa=function(){
		return M.D.slice(0)};
		E.ab=function(){
			return M.D.length};
E.aa=function(){this.w=!0};
E.la=function(){this.G=!0};
var Fe=function(a){
	if("prerender"==J.visibilityState)return!1;
	a();
	return!0};
	var M=new qf;
	var D=W._gat;
	D&&Ba(D._getTracker)?M=D:W._gat=M;
	var Z=new Y;
	(function(a){if(!Fe(a)){H(123);
		var b=!1,c=function(){if(!b&&Fe(a)){b=!0;
			var d=J,e=c;
			d.removeEventListener?d.removeEventListener("visibilitychange",e,!1):d.detachEvent&&d.detachEvent("onvisibilitychange",e)}};
			Ga(J,"visibilitychange",c)}})(function(){var a=W._gaq,b=!1;
				if(a&&Ba(a.push)&&(b="[object Array]"==Object.prototype.toString.call(Object(a)),!b)){Z=a;
					return}W._gaq=Z;b&&Z.push.apply(Z,a)});
			function Yc(a){var b=1,c;
				if(a)for(b=0,c=a.length-1;0<=c;c--){var d=a.charCodeAt(c);
					b=(b<<6&268435455)+d+(d<<14);
					d=b&266338304;b=0!=d?b^d>>21:b}return b};
				}).call(this);

ga.js line71-79

E.initData=function(){
this.a.load()};
E.Ba=function(a){
a&&””!=a&&(this.set(Tb,a),this.a.j(“var”))};
var ne=function(a){
“trans”!==a.get(sc)&&500<=a.b(cc,0)&&a.stopPropagation(); if("event"===a.get(sc)){var b=(new Date).getTime(),c=a.b(dc,0),d=a.b(Zb,0); c=Math.floor((b-(c!=d?c:1E3*c))/1E3*1); 0=a.b(R,0)&&a.stopPropagation()}},pe=function(a){“event”===a.get(sc)&&a.set(R,Math.max(0,a.b(R,10)-1))};
var qe=function(){var a=[];
this.add=function(b,c,d){d&&(c=G(“”+c));
a.push(b+”=”+c)};
this.toString=function(){
return a.join(“&”)}},re=function(a,b){(b||2!=a.get(xb))&&a.Za(cc)},se=function(a,b){b.add(“utmwv”,”5.7.1″);
b.add(“utms”,a.get(cc));
b.add(“utmn”,Ea());
var c=J.location.hostname;
F(c)||b.add(“utmhn”,c,!0);
a=a.get(vb);
100!=a&&b.add(“utmsp”,a,!0)},te=function(a,b){b.add(“utmht”,(new Date).getTime());
b.add(“utmac”,Da(a.get(Wa)));
a.get(Oc)&&b.add(“utmxkey”,a.get(Oc),!0);a.get(vc)&&b.add(“utmni”,1);
a.get(of)&&b.add(“utmgtm”,a.get(of),!0);
var c=a.get(Ic);
c&&0=a.length)gf(a,b,c);
else if(8192>=a.length){if(0<=W.navigator.userAgent.indexOf("Firefox")&&![].reduce)throw new De(a.length); df(a,b)||ef(a,b)||Ee(a,b)||b()}else throw new Ce(a.length); },gf=function(a,b,c){c=c||Ne()+"/__utm.gif?"; [/code]