再)ga.jsのコードを見てみる。

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の研究をするなら、こういうのが必要なのかな。

今の俺には、無理だ。

This entry was posted in ANALYTICS and tagged . Bookmark the permalink.

One Response to 再)ga.jsのコードを見てみる。

  1. Pingback: Google AnalyticsのCookie &パラメーター 一覧 | カグア!

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <img localsrc="" alt="">