ga.js: 新規セッション管理部分

コードのコメントをそのまま載せておく形式で書きます。

この処理の部分は、initDataの中のb.pcが担当なんだけど、(bとかpcは、compile化された後の変数なのでsourceで名前は不明)

* ga.jsのversionは、4.5.9

initDataの前提として、

  • そのinitDataが呼ばれるのは、
    • trackePageview, GASO, trackEvent, CustomVar関連, link, setAutoTrackBound(使われてない)、、などなど
  • 処理の中身は、3つに分けられる。
    1. 新規・既存セッションの判別・処理(b.pc)
    2. utmv(CustomVar)に関する処理(n.tc)
    3. utmz(Campaign)に関する処理(c.mm)

となっているのですが、

この記事では、1番の新規・既存セッションの判別・処理部分(b.pc)を見ていきます。

やっていることは、(コードの流れとはずれますが)

  1. pageTracker._linkなどのurl渡しのcookieデータが来た時の処理
  2. ドメインハッシュが一致しているか?(不一致で、新規セッション)
  3. urlからcookieへの値の設定
  4. utmb, utmcでの新規・既存check
  5. 新規なら、utmaをset, 既存ならutmbをsetする(utmbのpageview部分がcountされるのは、送信直前処理)
  6. 実際にcookieに書き込み

では、コードと、僕が付けたコメント

(変数名、関数名は、僕が勝手につけたので、他人が読む意味ないかもしれないけど、他に良い方法が見あたらない)

bがpageTracker変数が参照するオブジェクトになります。

 //セッションに関する処理を行う
   b.pc = function () {
     var timenow = b.r, //現在時間がb.rに入っている
     cookiemanager = b.cookiemanager,     //CookiManagerオブジェクト d
     cookievalue = cookiemanager.getCookieStr(),   //cookieの値を取得 l
     domainhash = b.domainhash + "", //t=b.domainhash ドメインハッシュ "none"なら1
     o = dfvls.e,     //dfvlsは初期値格納オブジェ、.eはwindowsオブジェになっている
     u = o ? o.gaGlobal : undefined, //たぶん、そのままwindowsオブジェクト
     y,           //アンカーで"#"を指定した場合に、アンカー以下のURIが入ってくる
     B = GaIndexOf(cookievalue, "__utma=" + domainhash + "."), //_utmaある?
     O = GaIndexOf(cookievalue, "__utmb=" + domainhash),       //_utmbある?
     ma = GaIndexOf(cookievalue, "__utmc=" + domainhash),     // _utmcある?
     G,          //_utmaの値を格納
     J = [],     //_utmbの値を配列で格納
     S = "",    //y+"&"
     ha = false; //gaGlobalの判別flag(ドメインハッシュが一致しない場合はtrue)
     //b.pcの内部変数宣言終わり

     //"-"とかを""にする
     cookievalue = NoVl(cookievalue) ? "" : cookievalue;

     //c.allowLinkerはsetAllowLinker(true)で1
     //urlから値を取得、この時に、utmkがハッシュでの改ざんcheckになる
     if (dfvls.allowLinker) {
       y = dfvls.a["location"] && dfvls.a["location"].hash ? dfvls.a["location"].href.substring(dfvls.a["location"].href.indexOf("#")) : "";
       //b.setAllowAnchorで設定, anchorでの文字列があれば、Sに代入
       if (dfvls.allowAnchor && !NoVl(y)) S = y + "&";
       //search部分も引っ付ける
       S += dfvls.a["location"].search;
       //Sに_utmaが含まれれば
       if (!NoVl(S) && GaIndexOf(S, "__utma=")) {
         debugger;
         cookiemanager.setValuesAndG(S); //Sの値をcookieに入れて、utmk値をGにSet
         //verifyで、gが未設定か、urlの値がきちんとcookieに入ったかをHashでcheck
         //失敗なら、gはundefinedに、utmA..Z設定用変数の中身もclear
         cookiemanager.verify() || cookiemanager.Sb();
         G = cookiemanager.ja(); //_utma設定用変数から値をGに Sb()を実行した場合には、G="-"となる
       }
       //utmxのsetter, getter, cookiewriter, true(Decodeする)
       //utmx をcookieに書き込み
       n(cookiemanager.ma, cookiemanager.vb, cookiemanager.Eb, true);
       //utmv をcookieに書き込み
       n(cookiemanager.la, cookiemanager.Aa, cookiemanager.Fa);
     }
     //以上でAllowLinkerがtrueの時の作業終わり

     //通常(linkでない)の場合と、上記でutmaがなかった場合
     if (NoVl(G)){
       //Bは、domainHashに対応したutmaのcheck-flag
       if (B){
         //utmb, utmcが無い場合、新規セッション
         if (!O || !ma) {
           //utmaの値を現在時間で更新して代入
           G = setUtmaArray(cookievalue, ";", timenow);
           //b.Fは、キャンペーン処理での新規セッション判定に使われる
           b.F = true;
         //継続セッションの場合
         } else {
           //utmaの値を取得
           G = Q(cookievalue, "__utma=" + domainhash + ".", ";");
           //utmbをset, 配列にいれておく
           J = GaSplit(Q(cookievalue, "__utmb=" + domainhash, ";"), ".");
         }
       //utmaのドメインハッシュが一致しない
       }else {
         //新規にutma用の配列を作る
         G = GaJoin([domainhash, b.jc(), timenow, timenow, timenow, 1], ".");
         //新規セッションflag
         ha = b.F = true; //haはGaGlobalで使う
       }
     //utmaがあるけど、utmb or utmcがない=>新規セッション
     }else if (NoVl(cookiemanager.C()) || NoVl(cookiemanager.ka())) { //utmb, utmcのどちらかが、"-"だったとき
       //値を現在時間で更新してGに入れる
       G = setUtmaArray(S, "&", timenow);
       //新規セッションflagをtrueに
       b.F = true;
     //utma, utmb, utmcあり
     } else {
       //utmbをset
       J = GaSplit(cookiemanager.C(), ".");
       //utmbの先頭要素がドメインハッシュに?
       domainhash = J[0];
     }
     //G(utma), J(utmb)の設定終わり

     G = G.split(".");

     //gaGlobalがある時
     if (o && u && u.dh == domainhash && !dfvls.namespace) {
       G[4] = u.sid ? u.sid : G[4];
       if (ha) {
         G[3] = u.sid ? u.sid : G[4];
         if (u.vid) {
           timenow = u.vid.split("."); //from string to array
           G[1] = timenow[0];
           G[2] = timenow[1];
         }
       }
     }

     //utmaの値を、クッキーマネージャーオブジェクトにset
     cookiemanager.tb(G.join("."));
     //utmbをsetしていく

     J[0] = domainhash;
     J[1] = J[1] ? J[1] : 0;
     J[2] = undefined != J[2] ? J[2] : dfvls.Jc; //dfvls.Jc = 10
     J[3] = J[3] ? J[3] : G[4]; //session開始時間

     //utmbをset
     cookiemanager.ya(J.join("."));
     //utmcをset
     cookiemanager.ub(domainhash);
     //クッキーマネージャーオブジェクトの変数gがなければ、
     //cookiemanager.setG(cookiemanager.getAllStr())でutmkの値を入れる
     NoVl(cookiemanager.lc()) || cookiemanager.setG(cookiemanager.getAllStrToHash());
     //utmaをcookieに書き込み
     cookiemanager.Cb();
     //utmbをcookieに書き込み
     cookiemanager.Ea();
     //utmcをcookieに書き込み
     cookiemanager.Db();
   };
    //End of b.pc()
This entry was posted in ANALYTICS and tagged , , , , . Bookmark the permalink.

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