ga.jsのキャンペーン処理関連の動きを追う。

修正: 2009/11/16 16:45(いろいろ書き直しました)

前回の処理の続きです。

initData内の3つの処理を見るシリーズで、今回は3つめのutmzの処理(キャンペーンに関する部分)です。

  1. 新規セッションなのかどうか(utma, utmb, utmc)
  2. utmvの処理(setVar, setCustomVar)に関する所
  3. utmzの処理(referrerを、どうutmzに組み込むか) (この記事)

他の回と同様に、Ga.jsのコードを追います。(変数名は、私の独自定義です)

initData()の中で、

campaignManager = new Z.Camp(

b.domainhash, b.modifiedreferrer, b.time, defaultvalues);

という感じで、utmzを扱うオブジェクトを作っておいて、

b.Ta = campaignManager.cc(b.cookiemanager, b.isNewSession)

cookie全体の操作を扱うオブジェクトと,1の新規セッションかどうかを判定したフラッグ変数を引数に、メソッドを実行します。

返値は、””, utmcr=1, utmcn=1です。キャンペーンに関係なければ、””, nがnew campaignで、rがrepeart campaignだと思います。

それで、campaingManager.cc(b.cookiemanager, b.isNewSession)の動きです。

いろいろな条件分岐で、referrerとcookienのutmzの部分を見て、キャンペーンに関係のあるセッションか? 関係あるなら、新規キャンペーンか既存か?を判定しています。

最終的に、その判定を返り値で、メインのAPIを操作するオブジェクトのプロパティに返して、データ送信時に使います。

条件としては、以下の状態return “”になります。(3パラメータ条件=”id, source, gclid”のいずれかがある)

  1. pageTracker._linkのタイプで飛んだ先の場合、既にキャンペーンがあれば、return “”
  2. 3パラメータ条件を満たすけど、urlのパラメータにnooverride=1が入っていたら、return “”
  3. sourceに検索エンジンの値を入れる。このとき、無視するキーワード(自分host名とかにaddIgnoredOrganicで設定)なら、return “”
  4. 検索エンジンの値が無い+新規セッションの場合、sourceに参照サイトを入れる。無視する参照元なら、return “”
  5. 参照元もない+新規セッション+utmzの蓄えがない場合、sourceをDirectとする。
  6. 3パラメータ条件に当てはまらない場合には、return “”

で、上の条件で、return “”とならなかった場合には、

  1. (新規セッション Or utmzの値とreferrerからの値にズレ)  の時、utmcn=1を返す
  2. それ以外は、utmcr=1を返す

という作業になります。

これで、initDataの3つの処理は終わりになります。

その後、trackePageviewなら、特殊処理をして、requestを飛ばす作業に入るし、他の設定系のAPIの場合は、値を返したり、Setしたりする作業に移っています。

コードにつけたメモを付けておきます。(中身はあまり信用しないで下さい、指摘してもらえるとありがたいです)

       //initDataで呼ばれるもの
     //return "" or "&utmcn=1" or "&utmcr=1"
     //arguments g=>"cookiemanager, h=>"isNewVisit?"
     cmp.cc = function (cookiemanager, newsession) { //?, h
       var k = "",
       n = "-",
       r, a = 0,
       d, l, domainhash = cmp.c;
       if (!cookiemanager) return "";
       l = cookiemanager.getCookieStr(); //lにcookie値を入れる
       k = cmp.getSearchTerm(dfvls.a["location"]); //kにはsearchが入る
       //_linkで遷移してきて、validataに通った場合
       if (dfvls.allowLinker && cookiemanager.verify()) {
         n = cookiemanager.na(); //utmzに関する値が、cookiemanager内変数のutmzArにあるか?
         //linkで飛んだ先に、既存のcampaignがあれば、return ""
         if (!NoVl(n) && !GaIndexOf(n, ";")) { //nに値があり、;がきちんとあれば、
           cookiemanager.Ga(); //utmzの値をcookieに書き込み
           return ""; //campaignには関係なしと
         }
       }
       n = Q(l, "__utmz=" + domainhash + ".", ";"); //nには今までのcookieにあるutmzが入る
       r = cmp.setAndGetDataHolder(k); //rに$.Camp.DataHolderオブジェクトがはいる, kはlocation.searchパ\\
ラメータ

       //nooverride=1の時
       if (cmp.L(r)) {
         k = Q(k, dfvls.utm_nooverride + "=", "&"); //nooverrideの値を取得
         if ("1" == k && !NoVl(n)) return ""; //1で utmzに値があれば、""
       }

       //無視する検索ワードの場合に return ""
       if (!cmp.L(r)) { //id, source, gclidのどれもない
         r = cmp.setOrganic(); //new Z.Camp.DataHolder()が入る
         if (!NoVl(n) && cmp.isIgnoredTerm(r)) return ""; //追加の無視キーワードであれば
       }

       //新規セッションなら、referrerを調査して、無視する検索キーワードならreturn ""
       if (!cmp.L(r) && newsession) {
         r = cmp.setReferral(); //referralをsetしたcmp.DataHolderが入る
         if (!NoVl(n) && cmp.isIgnoredRef(r)) return ""; //無視する参照元なら、""
       }

       //新規セッションで、cookieが""なら直接参照をset
       if (!cmp.L(r)) if (NoVl(n) && newsession) r = cmp.setDirect(); //utmzが空なら、直接参照

       //directでsetしたなら、return ""
       if (!cmp.L(r)) return "";

       //utmzに値があれば、referrerのものと比較
       if (!NoVl(n)) {
         //a [ <domainhash><birth-time><num_of_session><num_of_camp> + csr]
         a = n.split(".");
         d = new Z.Cmp.DataHolder;
         d.setValueFromStr(a.slice(4).join("."));//utmzのutmc値から、dオブジェクトに値をset
         d = ToLower(d.getStr()) == ToLower(r.getStr()); //dオブジェクトの値を文字列化して、比較
         a = a[3] * 1; //aにはキャンペーンセッション回数
       }
       if (!d || newsession) {//cookieとreferrerが違うか、newsessionなら
         //utmaの値を取得
         newsession = Q(l, "__utma=" + domainhash + ".", ";");
         //最後の"."の場所を取得
         l = newsession.lastIndexOf(".");
         //session回数を取得 l>9にならない場合があるのか? domain-hashが1でも、session-idがあるし?
         newsession = l > 9 ? GaSubstr(newsession, l + 1) * 1 : 0;
         a++; //campain-counterを++
         //0を1に。他はそのまま
         newsession = 0 == newsession ? 1 : newsession;
         //referrerからの値で、cookiemanagerに値をSet
         cookiemanager.wb([domainhash, cmp.timenow, newsession, a, r.getStr()].join("."));
         cookiemanager.Ga(); //書き込み
         return "&" + "utmcn=1";
       } else return "&" + "utmcr=1"; //repeartの場合は、utmzは変更しない
     };
   };
This entry was posted in 解説 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="">