WebOS Goodies

WebOS の未来を模索する、ゲームプログラマあがりの Web 開発者のブログ。

WebOS Goodies へようこそ! WebOS はインターネットの未来形。あらゆる Web サイトが繋がり、共有し、協力して創り上げる、ひとつの巨大な情報システムです。そこでは、あらゆる情報がネットワーク上に蓄積され、我々はいつでも、どこからでも、多彩なデバイスを使ってそれらにアクセスできます。 WebOS Goodies は、さまざまな情報提供やツール開発を通して、そんな世界の実現に少しでも貢献するべく活動していきます。
Subscribe       

AccessAnalyzer に自分のアクセスをカウントさせない方法

先日ご紹介した AccessAnalyzer ですが、なかなかいい感じです。どの記事がよく参照されているか、どんな方法でここに辿り着いているかがわかって、とても参考になります。けっこう意外な結果が出ていて、データを解析することの重要性を再認識しました。しかし、少し困るのが自分がアクセスした分もカウントされてしまうことです。あまり頻繁にアクセスするとデータの信用度がどんどん落ちてしまいます。そこで、今回は自分のアクセスをアクセス解析から取り除く方法をご紹介します。

やり方はいくつかありますが、ポイントはどのように自分のアクセスを見分けるかです。もし貴方が固定 IP のアクセス回線を持っているリッチマン(笑)なら、何の問題もありません。単純に IP アドレスで判別できるでしょう。しかし、ほとんどの人は動的 IP でアクセスしているものと思います。そうなると、自分のアクセスを見分けるのは少し面倒です。
勘のいい人はもうわかったかもしれませんが、ここで昨日ご紹介した JavaScript によるユーザー認証を使います。パスワード設定用のフォームを置いておけば簡単にブラウザを設定できますし、暗号化のおかげで成りすましもある程度は防げます。他にはブラウザの UserAgent をカスタマイズする方法もありますが、私は会社と自宅双方で複数のブラウザを使用していて、設定が面倒なのでやめました。また、AccessAnalyzer にも条件を設定して解析から除外する機能があるのですが、解析が遅くなる上に設定できる条件がいまいちなので、私は使っていません。

概要


AccessAnalyzer では、以下のようなタグを HTML に埋め込むことでアクセスをカウントします。

<script type="text/javascript"
    language="JAVASCRIPT"
    src="http://j1.ax.xrea.com/l.j?id=<サイトID>">
</script>

したがって、このタグを動的に生成する JavaScrip を作成し、自分がアクセスしたときだけはその処理をスキップすればよさそうです。具体的には、以下のような実装になります。

if(<条件式>)
{
    document.open();
    document.write('<scr' + 'ipt type="text/javascript" language="JAVASCRIPT" src="http://j1.ax.xrea.com/l.j?id=<サイトID>"></scr' + 'ipt>');
    document.close();
}

これで、条件式Cookie から取得したパスワードの判定などを入れれば、Cookie 認証によるカウントの抑制が実現できます。ちなみに、script タグの中で文字列を分けているのは、古いブラウザへの対処です。もはや使っている人はあまりいないと思いますが、初期の Netscape などはこうしないと誤動作します。もはや動作確認もままならないので気休めにしかなりませんが(^^ヾ

実際のコード


それでは、実際にこの blog で使っているコードを見ていきましょう。コードは大きく 3 つに分かれています。処理コードをまとめた blogscript.js ファイル、各テンプレートの先頭部分に配置されるコード、トップページにあるパスワード入力フォームです。

blogscript.js


ほとんどの処理コードはこのファイルにまとめられています。容量とロード時間を節約するためにも、別ファイルにしたほうがよいでしょう。ただし、livedoor blog は .js ファイルのアップロードを許可していないので、他の .js が公開ができるサーバーを用意する必要があります。私は XREA.com を有料サービスに移行して使っています。

このファイルには、以下の関数が含まれています。

関数名機能
SWSetCookie汎用の Cookie 設定関数
SWGetCookie汎用の Cookie 取得関数
SWSetAdminPasswordパスワードを Cookie に設定する関数
SWAuthAdminパスワードチェックとタグの出力を行う関数

さらにスクリプトの最後で AccessAnalyzer のカウント用スクリプトのパラメータ設定と、SHA1 ライブラリの読み込みタグの出力を行っています。SHA1 ライブラリはパスワードが未定義のときは必要ないので読み込まないようにしています。

function SWSetCookie(name, value, expire, path)
{
    var cookie = name + '=' + escape(value);
    if(expire)
    {
        cookie += '; expires=' + expire.toGMTString();
    }
    if(path)
    {
        cookie += '; path=' + path;
    }
    document.cookie = cookie;
}

function SWGetCookie(name)
{
    var cookie = document.cookie;

    if(cookie && cookie.length > 0)
    {
        var offset = cookie.indexOf(name + '=');
        var end;
        if(offset != -1)
        {
            offset += name.length + 1;
            end     = cookie.indexOf(';',offset);
            if(end == -1)
            {
                end = cookie.length;
            }
            return unescape(cookie.substring(offset,end));
        }
    }
    return "";
}

function SWSetAdminPassword(password)
{
    var date = new Date();
    date.setTime(date.getTime() + 86400000*365);
    SWSetCookie('sw_AdminPassword', password, date, '/<livedoor ID>/');
}

var ID="<サイトID>";
var AD=0;
var FRAME=0;
var sw_AdminPassword = SWGetCookie('sw_AdminPassword');

function SWAuthAdmin()
{
    var hash = '<ハッシュ変換後のパスワード>'

    if(!sw_AdminPassword || sw_AdminPassword.length <= 0 || hex_sha1(sw_AdminPassword) != hash)
    {
        document.open();
        document.write('<scr' + 'ipt type="text/javascript" language="JAVASCRIPT" src="http://j1.ax.xrea.com/l.j?id=<サイトID>"></scr' + 'ipt>');
        document.close();
    }
}

if(sw_AdminPassword && sw_AdminPassword.length > 0)
{
    SWSetAdminPassword(sw_AdminPassword);
    document.open();
    document.write('<scr' + 'ipt type="text/javascript" language="JAVASCRIPT" src="<sha1.jsのURL>"></scr' + 'ipt>');
    document.close();
}

赤字の部分は、以下を参考にして置き換えてください。

livedoor ID
livedoor のアカウント名です。この blog の場合は sourcewalker
サイトID
にアクセスを解析するサイトを AccessAnalyzer に登録したときに発行された ID。ログイン画面の管理サイト一覧に出ている「アカウント名」です。
ハッシュ変換後のパスワード
パスワードを SHA1 で変換した文字列です。sha1.js のページに生成用のフォームがあるので、それで変換してコピーするのがよいでしょう。
sha1.jsのURL
sha1.js も外部サーバーに置かなくてはいけないので、その URL を指定します。

各テンプレートのスクリプト


次に、正規のカウントスクリプト埋め込み用タグの代わりに使用するタグです。前述の blogscript.js の読み込み、SWAuthAdmin 関数の呼び出し(sha1.js を読み込んだ後でないと実行できないのでタグを分けてあります)を行っています。最後の noscript タグは JavaScript がサポートされていない場合への対処です。

<script type="text/javascript" language="JAVASCRIPT" src="<blogscript.jsのURL>"></script>
<script type="text/javascript" language="JAVASCRIPT"> <!--
SWAuthAdmin();
//-->
</script>
<noscript><a href="http://w1.ax.xrea.com/c.f?id=<サイトID>" target="_blank">
<img src="http://w1.ax.xrea.com/l.f?id=<サイトID>&url=X" border="0">
</a></noscript>

こちらも赤字の部分は適宜置き換えてください。

blogscript.jsのURL
外部サーバーに置いた blogscript.js の URL
サイトID
blogscript.js での意味と同じです。

パスワードの入力フォーム


最後に、パスワードの入力フォームです。どこに置いてもいいのですが、私はトップページの一番下に配置してあります。将来的にはもう少しきちんと隠そうと思っていますが、とりあえずやっつけです(^^ヾ

<div style="text-align: right;">
<input id="sw_AdminPassword" type="password"></input>
<input type="button" value="設定" onClick="SWSetAdminPassword(document.getElementById('sw_AdminPassword').value);"></input>
</div>

これでパスワードを設定したブラウザからのアクセスは AccessAnalyzer に通知されないので、気兼ねなく自分の blog を見れるようになりました(笑)。アクセス解析はほんとうに面白いですし、いろいろな人が自分の blog を見てくれているのがわかって、やる気も出てきます。まだ導入していない方は、ぜひ一度試してみてください!(^^)
関連記事

この記事にコメントする

Recommendations
Books
「Closure Library」の入門書です。
詳しくはこちらの記事をどうぞ!
Categories
Recent Articles