私は、hi-hoにWebページを開設してすぐに、hi-ho提供のアクセスカウンタを設置しました。しばらくは順調に動いていましたが、Yahoo! JAPANにURL登録をしてアクセスが集中したためか、リセットされてしまいました。ぐすん。またいつ同じことが起こるかと思うと心配なので、別のカウンタを探すことにしました。
いろいろ探して見つけたのが、とほほさんのカウンタです(ここで使用しているバージョンは3.07です)。これは、ちゃんとロック処理がしてあって安心です(hi-hoのやつは、同時アクセスに弱いようなのです)。しかもアクセスログを生成して、自動でメール送信する機能まであります。これなら、アクセス数がいくつになっているか把握できますし、もしおかしくなってしまっても、いくつからおかしくなったか調べることができます。
おまけに、アクセスログの内容が詳しく、これを少し改造すると、さらに詳細な情報を得ることができます。そんなわけで、このページは、カウンタの設置とアクセス調査がしたいというかたのために書きました。基本的に、hi-hoにWebページを開設しているかたを対象にしています。
ソースを書き換える際には、もとのコードを消すのではなく、「#」をつけてコメントアウトする方法をおすすめします。ここでの説明も、ほとんどそうしています。いじった場所には、意図的に「#追加」「#削除」「#変更」などと書いておくのもよいでしょう。そのうち、どこを変えたのかわからなくなってきますので。
最初に、とほほさんのページからカウンタのCGIをダウンロードします。設置法は、とほほさんのページを読めばわかると思いますので、詳しくは書きません。ここでは、CGIカウンタの設置法で話を進めていきます。
hi-hoに加入しているかたは、まずhi-hoのページでCGIのセットアップを行います。それから、指定されたファイルをcgi-binディレクトリに置き、lockという名前のディレクトリを作成します。.htaccessファイルは特に必要ありません。
HTMLファイルからCGIを呼び出すには、hi-hoの場合は、以下のように書いてください。usernameにはユーザー名を書きます。私なら、t-inukaiが入ります。
<IMG SRC="/cgi-bin/user/username/wwwcount.cgi?gif">
きちんと表示されれば成功です。
うまくいったら、WIDTH、HEIGHT、ALT属性をつけておきましょう。
もし数字の画像を別のものにしたいと思ったら、数字を書いた10個の画像ファイルを用意します。縦のサイズが同じであれば、画像の大きさは問いません。ファイル名は、0.gif〜9.gifにします。フリーの素材集で気に入ったものがあれば、それを使うのもよいでしょう。
枠つきの画像にしたい場合は、それぞれの数字の画像の上下に枠を書いておき、左右の枠は、また別に画像ファイルを作成します。そして、「左の枠」「数字」「右の枠」というように、並べて画像を表示させます。
あまり凝った枠でなくてもよいのなら、TABLEタグを使う方法もあります。ちょっと邪道な気がしますが。
レポート送信機能を使うには、wwwcount.cgiの「$mailto ='';」に、あなたのメールアドレスを記入します。そして、hi-hoのかたは、ssendmailのセットアップをhi-hoのページで済ませたあとに、「$sendmail = './ssendmail';」とします。
ずっと先に、「アクセスログをメールで送信する」というコメント行があり、その少し先に「$msg = "";」という行があります。その次の行からの数行をコメントアウトします。
#$msg .= "To: $mailto\n";
#$msg .= "From: $count_name\n";
#$msg .= "Subject: ACCESS $date_log $tmp_count\n";
#$msg .= "\n";
それから少し先にopen文がありますので、そこをコメントアウトして、hi-hoのssendmailの仕様に合わせて書き換えます。
#open(OUT, "| $sendmail $mailto");
open(OUT, "| $sendmail -s \"[ACCESS] $date_log $tmp_count\" $mailto");
このようにすると、「[ACCESS] 2000/02/02 45」のように、[ACCESS]という文字列と、日付と、その日のアクセス数が書かれたサブジェクトでメールが送信されます。メールの振り分けには、「サブジェクトが[ACCESS]のメール」を条件にするとよいでしょう。
HTMLファイルには、ちょっと長いですが、こんなふうに書きます。URLや画像のサイズなどは各自で変更してください。また、これは左右に枠の画像をつけているので、必要なければ省いてかまいません。さらに余談ですが、この場合、数字の画像はcgi-binディレクトリに置くのですが、左右の枠の画像はcgi-binディレクトリではなく、htmlディレクトリの下のimageディレクトリに置いています。
<SCRIPT>
<!--
xx = escape(document.referrer);
yy = "";
for (i = 0; i < xx.length; i++) {
zz = xx.charAt(i);
yy += (zz == "+") ? "%2B" : zz;
}
document.write('<IMG SRC="image/fleft.gif" WIDTH=4 HEIGHT=28 ALT="[">');
document.write('<IMG SRC="/cgi-bin/user/t-inukai/wwwcount.cgi?gif+ref+', yy, '" WIDTH=90 HEIGHT=28 ALT="counter">');
document.write('<IMG SRC="image/fright.gif" WIDTH=4 HEIGHT=28 ALT="]">');
// -->
</SCRIPT>
なお、<SCRIPT>は、<SCRIPT LANGUAGE="JavaScript">と書くのが一般的ですが、私は<HEAD>〜</HEAD>内に、以下のように書いているので、LANGUAGE属性は書いていません。
<META HTTP-EQUIV="Content-Script-Type" CONTENT="text/javascript">
LANGUAGE属性は、HTML3.2の仕様に入っていないからという理由なのですが、まあ私のちょっとしたこだわりです(^^;
これで、日付が変わって初めてアクセスがあると、メールが送られてきます。すぐに知りたければ、cgi-binディレクトリにあるwwwcount.accというファイルを開くと、その日のアクセス状況が分かります。内容は、以下のような形式の繰り返しになっています。
COUNT = [ 4375 ] TIME = [ 00:25:30 ] ADDR = [ 210.153.171.8 ] AGENT = [ Mozilla/4.08 [en] (Win95; I) ] FROM = [ http://www.tim.hi-ho.ne.jp/t-inukai/midi.html ]
「カウント数」「アクセス時刻」「IPアドレス」「使用しているブラウザ」「どこから来たか」という情報がわかります。ただし、FROMがないこともあります。上記の例の場合、サーチエンジンか何かでMIDIのページに来て、それからトップページに来たのだろうと想像できます。このFROMは、JavaScriptでブラウザの履歴を取得しているようです。たまに、全く関係ないURLが書かれていることもありますので、あくまで参考程度にお考えください。
ここから、もう少し便利にする方法を次に書きます。
例えば、標準では以下のようなアクセスログが送られてきます。
COUNT = [ 4430 ] TIME = [ 05:28:12 ] ADDR = [ 210.153.171.8 ] AGENT = [ Mozilla/4.08 [en] (Win95; I) ] FROM = [ http://search.yahoo.co.jp/bin/search?p=%A5%D5%A5%EA%A1%BC%A5%BD%A5%D5%A5%C8 ]
これを、次のようにしてしまおうというのが目的です。
COUNT = [ 4430 (05:28:12) ] HOST = [ pl008.nas112.tokai.nttpc.ne.jp (210.153.171.8) ] AGENT = [ Mozilla/4.08 [en] (Win95; I) ] FROM = [ http://search.yahoo.co.jp/bin/search?p=フリーソフト ]
具体的には、アクセス時刻をカウントの場所にまとめて、リモートホスト名の表示と、URL形式のエンコードを行います。改造しなくても、リモートホスト名が取得できることがありますが、これから説明するやり方のほうが、より取得できる可能性が高くなります。
まず、jcode.plを入手して、cgi-binディレクトリに置いてください。それから、wwwcount.cgiの「カスタマイズ」という項目のあたりに、以下のように追加します。
#
# 日本語コード変換ライブラリ
#
require './jcode.pl';
次に、「アクセスログをメールで送信する」で、いくつかコメントアウトした行の後ろにある処理を書き換えます。場所は、「if ($account_detail)」の中です。ここで、メール送信するために、日本語をJISコードに変換しています。
open(IN, "< $file_access");
#while (<IN>) {
while ($line = <IN>) {
&jcode'convert(*line,'jis');
#$msg .= $_;
$msg .= $line;
}
それから、このように書いてある行を探します。
#
# すでに同アドレスからのアクセスがあればカウントアップしない
#
このすぐ下に、以下のように追加します。ここでリモートホスト名の取得を行っています。
$host = $ENV{'REMOTE_HOST'};
$addr = $ENV{'REMOTE_ADDR'};
if ($host eq $addr) {
$host = gethostbyaddr(pack('C4',split(/\./,$host)),2) || $addr;
}
そして、少し下にあるwhile文の中にif文がありますが、これをコメントアウトして、その下に別のif文を書きます。ちなみにここは、同一アドレスをチェックする部分です。今回の改造で出力形式を変更するために、ここも書き換えておく必要があるわけです。
#if ($_ eq "ADDR = [ $ENV{'REMOTE_ADDR'} ]\n") {
if ($_ eq "HOST = [ $host ($addr) ]\n") {
次は、こんなコメントが書いてある所を探しましょう。
#
# アクセスログを記録する
#
この行の上に、2行つけ足します。これは、URL形式をエンコードして、ShiftJISに変換しています。ここでは、サーバ上のwwwcount.accを見る際に、個人的に都合がいいということでShiftJISにしていますが、本当は、Perlで日本語を扱うにはEUCにしておいたほうが無難だったりします。気になるかたは、'sjis'を'euc'にしてください。
$reffile =~s/%(..)/pack("C", hex($1))/ge;
&jcode'convert(*reffile,'sjis');
説明が前後しますが、先ほど述べたように、メール送信する際にはJISに変換します。上記の処理で'jis'を指定して、最初からJISに変換しておけば、変換は一度だけで済むのですが、文字化けすることが多かったのでやめました。
さて、「アクセスログを記録する」という部分の処理ですが、ここもいくつか変更点があります。まず、カウント数の横に時間を書き込むように変更します。
#print(OUT "COUNT = [ $count ]\n");
print(OUT "COUNT = [ $count ($time_now) ]\n");
#print(OUT "TIME = [ $time_now ]\n";
そして、リモートホスト名とIPアドレスを書き込む処理も変更します。
#print(OUT "ADDR = [ $ENV{'REMOTE_ADDR'} ]\n");
print(OUT "HOST = [ $host ($addr) ]\n");
最後に、以下の部分をコメントアウトします。
#if ($ENV{'REMOTE_HOST'} ne $ENV{'REMOTE_ADDR'}) {
# print(OUT "HOST = [ $ENV{'REMOTE_HOST'} ]\n");
#}
以上で完了です。これで、サーチエンジンからのアクセスで、使われたキーワードを知ることができるので、どんなことに興味を持ってアクセスしてきたのかということを把握できます。
アクセス数が非常に多いサイトの場合、送られてくるメールも巨大になりますので、その点はご注意ください。wwwcount.cgiの$account_detailの値を0にすれば、アクセス件数のみメール送信させることができます。