ga-js-の勉強の時より、多少理解が進んだ。まだまだだけど。
コードは、http://www.google-analytics.com/ga.js
まずは、整形する。
http://jsbeautifier.org/
ファイルに保存。以後の行数は、この整形されたファイルの行数を使用。
全体の構成
このga.jsは、文字数を少なく書く事が目標となっており、一文字変数が多い。
false,trueも、一文字の変数に代入している。
4-134行 window._gat={}
オブジェクトリテラルで_gatが定義されている。
いろいろな、文字列が一文字・二文字の変数に代入され、文字列処理utilityメソッドが定義されている。
135行 var F = window._gat 変数Fに入れている
136-1669行 Fのプロパティの設定が延々と続いて終わる。
コードとしては、これだけ。
実際に、利用する場合には、pageTracker=_gat.getTracker("UA-XXXXX-Y")と呼ぶのだが、
この_gat.getTrackerは、最後行あたりの F._getTracker=function(g,l){return new F.qc(g,l)}
で定義されており、このreturn値が、pageTracker変数に入る。
F.qc
1070-1666行
a=thisとして、その後、延々とaにプロパティ追加されている。
この中のプロパティで、_がprefixされているものが、Google AnalyticsのAPI。
なので、APIを調べる時は、ここが出発点になる。
また、重要な変数として、aの他に, fがある。
f=new F.lcと代入される変数
F.lc
136-188行にある
g=thisしたあとに、gにいろいろ詰め込んでいる。
g.bはdocument, g.cはwindow,g.Laは検索エンジン名のオブジェクト
ga.jsの設定値に関わる部分になる。
もう一度, F.qcで出来るオブジェクトについて書くと、
fは、new F.lc()で作成されるオブジェクト、f.bはdocument, f.cはwindow。
a=this で、aに設定していってる。
a._trackPageview
aのプロパティを全部見るのは難しいので、主要APIのa._trackPageviewの所だけ見る。
行番号付きで表示すると、
1365 a._trackPageview = function (b) {
1366 if (t()) {
1367 a._initData();
1368 f.H && a.od();
1369 a.td(b);
1370 a.T = E
1371 }
1372 };
この処理を順番にみる。
t() 1127-1129行
ドメインが、正常な物かどうかを判別する?
定義は、function t(){ return "file:" != f.b.location.protocol && i()}
f.bはdocument。
i()は
<pre>
1110 function i() {
1111 var b = f.e,
1112 h = r(b, "www.google.") * r(b, ".google.") * r(b, "google.");
1113 return h || "/" != f.n || r(b, "google.org") > -1
1114 }
</pre>
ちなみに、f.eはデファルトでは、"auto"(_setDomainName()のデフォルト値)
* r=function(g,l){return g.indexOf(l)}
fileではなく、domainにgoogleがなければ、trackPageviewは処理に入る。
a._initData() 1292-1321行
少し長いが抜き出す。
1292 a._initData = function () {
1293 var b;
1294 if (!s) {
1295 if (!a.N) {
1296 a.N = new F.kc(f);
1297 a.N.Kc()
1298 }
1299 a.f = a.Oc();
1300 a.o = new F.ra(f);
1301 a.k = new F.da;
1302 B = new F.nc(f, a.f, a.o, a.k);
1303 a.$c()
1304 }
1305 if (t()) {
1306 a.Yc();
1307 B.bd()
1308 }
1309 if (!s) {
1310 if (t()) {
1311 a.ya = a.Fc(a.Cb, f.b.domain);
1312 if (f.ta) {
1313 b = new F.w(a.f, a.ya, a.D, f);
1314 a.ub = b.Lc(a.o, a.T)
1315 }
1316 }
1317 a.Eb = new F.da;
1318 s = c
1319 }
1320 F.Lb || a.ad()
1321 };
sは、_gat={s=E}と、設定されており、false。
t()は、(上に書いた,protocol,domainチェック)。trueなら、処理に入る。
a.N=kで、k=F.aで、たぶん?7行目のa:undefinedになっている。
1296-1297 a.N = new F.kc(f);
a.N.Kc()の部分は、
581-650 F.kc
l=g, a=l.c(window), k=thisと変数に入れ、
その後、browserやosの値を取得している
640のk.qdは、でそれらの値の文字出力メソッド。
645のk.Icでは、
history-object(https://developer.mozilla.org/ja/DOM/window.history)
F.sはHashを作るメソッドか、(31-45)
this.Kc()も設定値を返している。詳細は追わない。
1299 a.Oc()
これは、domainハッシュを返す関数(setDomain()した場合は1を返す形
1300 new F.ra(f)のcalleeは、278-439行
…疲れたので、飛ばす。
その後も、aのプロパティに値を設定する処理が続いている。
まとめとしては、a._initData()は、データの初期化部分、、、_Pageview()時に取得できる情報をsetしてる。
_initDataは、他の 部分でも、呼ばれてる。データを送る際に、前処理として呼ばれる。下はoccur a._initDataした結果。
1291: a._initData = function () {
1323: a._initData();1329: a._initData();
1368: a._initData();
1380: a._initData();
1394: a._initData();
1420: a._initData();
1426: a._initData();
1430: a._initData();
1434: a.initData();
1442: a._initData();
1448: a._initData();
1471: a._initData();
1476: a._initData();
1483: a._initData();
1496: a._initData();
F.qc部分に戻る。
f.H && a.od()
f.Hは、undefinedになっているので、次の行へ。
a.td(b)
a.tdの定義部分の抜き出す。
1185 a.td = function (b) {
1186 if (a.X()) {
1187 var h = "";
1188 if (a.k != k && a.k.U().length > 0) h += "&utme=" + x(a.k.U());
1189 h += a.Oa(b);
1190 y.V(h, a.F, a.f)
1191 }
1192 };
yは、F.pcの値が入っている。
(a.initDaataの中の1303行目で、a.$c()をcallしている。a.$c=function(){y= new F.pc(f)}
F.pc(f)
440-506行にある。y.V(a.tdの中では、l.V)は、455-475で定義されている。
リクエスト文字列が作られれ、l.Bbをcallする。
l.Bbは、479-486行
<img>タグを作り、onloadメソッドを定義。リクエストが走る。
a.T=E
そのまま、falseを指定してるだけ?
—————————
終了
—————————
尻切れトンボになったが、これが、pageTrackerを作り、 trackPageviewメソッドを行う、なかの流れ。
ちなみに、APIのなかには、これから使用予定のものも、顔を出している。
http://www.google.com/support/forum/p/Google+Analytics/thread?tid=3dfa688533e09141&hl=en
1. _setAutoTrackOutbound,
2. _setTrackOutboundSubdomain,
3. _setHreExamineLimit
4. _setRefferOverride
あまり、実際のアクセス解析には役に立たないかな。
http://www.analyticsmarket.com/
このサイトを見てたら、GAの情報を自分のサーバーにも飛ばしていた。
GAの研究をするなら、こういうのが必要なのかな。
今の俺には、無理だ。
Pingback: Google AnalyticsのCookie &パラメーター 一覧 | カグア!