普通、カウンタって増えて欲しいものです。なんでわざわざ増えにくいカウンタを作るのか?
このような小規模なサイトをやっているとままあることですが、あまりにもマイナーサイト過ぎて*1、自分が(チェックなどで)一番カウンタ回していて罪悪感を感じたり、サイト内の移動でTOPに戻ったときカウントしてしまったり、とかあるわけです。
そこで本当にまわって欲しいときだけカウントするカウンタが欲しいと思って作ったのがこれです。ちなみにSSIを使ったテキストカウンタです。
#!/usr/bin/perl
use strict;
#------------------------------------------------------------------------#
my $EXREF = 'http://www.uso800.or.jp/~uso/';
my $PASS = 'SaitamaSaitama';
my $LOGFILE = './count.log';
#------------------------------------------------------------------------#
my $addr = $ENV{'REMOTE_ADDR'};
my $mes;
if ( $ENV{'QUERY_STRING'} eq $PASS and $PASS ) {
$mes = "Content-type: text/html\n\nAdmin IP changed to $addr\n";
}
open FILE, "+<$LOGFILE" or die;
flock FILE, 2;
my ( $count, $ip, $admin_ip ) = split( /:/, <FILE> );
seek( FILE, 0, 0 );
if ( $mes ) {
print FILE "$count:$ip:$addr";
} elsif ( $ENV{'HTTP_REFERER'} !~ /^$EXREF/ and $addr ne $ip and $addr ne $admin_ip ) {
$count++;
print FILE "$count:$addr:$admin_ip";
} else {
seek( FILE, 0, 2 );
}
truncate( FILE, tell );
close FILE;
$mes = sprintf ( "Content-type: text/plain\n\n%.5d", $count ) unless $mes;
print $mes;
必ず変更する必要があるのは、上のソースで強調されている上側の二行だけです。
桁揃えの桁を変えたい場合、一番下のほうにある%.5dという部分の数字を桁数に変えてください。10桁にしたいなら、%.10dにすれば良いでしょう。
700、logの方は600にして下さい。設置はこれでおしまいです。
このcgiはカウントした数字しか出力しないので、タグとかは自分で書く必要があります。
呼び出すには数字を埋め込みたい位置に
<!--#exec cgi="カウンタを置いた場所/count.cgi"-->
とSSI構文を入れて下さい。
自分からのアクセスでカウントさせたくない場合、ブラウザのURL欄に
http://カウンタのURL/count.cgi?設定したパスワード
と入れてアクセスしてください。ブックマークに登録すると良いでしょう。
するともしパスワードが合っていたなら、その時のIPを覚えます。(成功時にはメッセージが出ます)以後、新たに覚えさせるまで、そのIPでアクセスがあってもカウントしません。
カウンタは最も簡単なcgiの一つなので沢山世に出ています。なのに何故わざわざ自分で作るのか?とお思いになるでしょう。少し探してみればわかりますが、多機能なカウンタが多く、本当に数を数えるということだけに絞ったカウンタは意外と少ないのです。もしくは、数を数えるだけなら数行のプログラムになるので配布するまでもないのかもしれません。
しかし、カウンタはその特性上、出来る限り小さなものの方が好ましいはずです。余計な機能は要らないと思ってる人が自分の他にいてもおかしくないと思いこのページを作りました。
perlで初めてcgiを作る人の参考になるかも?しれません。