#!/usr/local/bin/perl # Web Counter Ver. 0.31 # USAGE : # 1) webcnt.cgi?test --- テスト # 2) webcnt.cgi? --- カウント # 3) webcnt.cgi?hide --- 隠しカウント # 4) webcnt.cgi?cmt+xxx --- ログに'xxx'とコメントを付加します 指定無の場合はカウンター名 # 5) http://〜/cgi-bin/webcnt.cgi?syuukei --- アクセス状況の集計 # 6) webcnt.cgi?image+xxx.gif --- 隠しカウンター(gifイメージの表示) # *) SSIのコマンドモードやコマンドラインでの実行の場合は'?'や'+'は空白にしてください ####################### # 設定 ####################### $print_http_header = 0; $column = 6; $lock_timeout = 240; $file_lock_enable = 1; $address_check_enable = 1; $cnt_timeout = 60; @reject_domain = (""); @reject_address = (""); $create_history = 1; $log_max = 1000; $script_dir = ''; $my_url = ''; $image_dir = '../image/'; @robots = ("WWWC","WebFetch","Lycos","indexpert","Scooter","robot", "OpenTextSiteCrawler","Googlebot","Slurp","NEC-MeshExplorer", "InfoSeek","WebFetch"); $log_ip = 1; ####################### # 設定項目の説明 ####################### # $print_http_header : "Content-type: text/html"の出力 (0:Off / 1:On) # : 集計、テスト等のCGIモードでは強制で表示します # $column : 表示桁数 ('0'を補間して指定桁数で表示。0の場合は有効な数字のみ) # $lock_timeout : ロックファイルタイムアウト ファイルロックのタイムアウト (秒) # $file_lock_enable : ファイルロック (0: Off / 1: On) # $address_check_enable : アドレスチェック (0: Off / 1: On) # 以前にアクセスされたかをチェックしカウントを制限します # $cnt_timeout : カウントタイムアウト(アドレスチェックが有効のときに有効) # 最後のアクセスから次のカウントを有効にするまでの時間(分) # カウントを行う ( 0は日付が変わるまで) # @reject_domain : カウントしないドメイン # ex. @reject_domain = ("foo.var.com", "abc.org"); # *.foo.var.com, *.abc.org はカウントしません # @reject_address : カウントしないIPアドレス # ex. @reject_address = ("172","192.168.19.101-128","200.1.1.1"); # 172.*, 192.168.19.101〜192.168.19.128, 200.1.1.1 のアドレスからはカウントしない # "202.19"と指定すると 202.19.*.* や 202.19?.*.* が対象になります # 202.19.* を対象にしたい場合は "202.19." と指定してください # reject_domain,reject_address に書かれた場合はログも出力しません # $create_history : アクセスログのヒストリー作成 ( 0: Off / 1: On ) # $log_max : ログファイルの最大行数 # $script_dir : スクリプトのある絶対ディレクトリ cmd=で実行する場合に指定します # $my_url : 自分のウェブサイトのURL (リンク元がこの中のページの場合は # ログ中のリンク元を「OwnPage」とします # $image_dir : イメージファイルの置き場 # (スクリプトのあるディレクトリ (cgi-bin/等) からの相対パス) # @robots : カウントを行わないブラウザ (ロボット対策?) # リスト中の文字が含まれるブラウザ(HTTP_USER_AGENT)はカウントを行わない。 # ex. @robots = ("robot","WebFetch"); # $log_ip : ログファイルドメイン別集計で IP アドレスを CLASS B で集約する # (個別の IP アドレスでなく最下位の1オクテットをまとめる。) # ( 0: Off / 1: On ) # ex. 192.168.0.1 〜 192.168.0.254 → 192.168.0.X ################# # 使用ファイル ################# $my_name = 'webcnt'; $counter_file = "$script_dir" . "$my_name" . ".cnt"; $access_log = "$script_dir" . "$my_name" . ".acs"; $bkp_log = "$script_dir" . "$my_name" ."_bkp.acs"; $lock_file = "$script_dir" . "lock/$my_name" . "_lck"; $sum_dom = "$script_dir" . "$my_name" . ".s1"; $sum_idx = "$script_dir" . "$my_name" . ".s2"; $sum_pre = "$script_dir" . "$my_name" . ".s3"; $sum_bro = "$script_dir" . "$my_name" . ".s4"; $cmnt = "$script_dir" . "$my_name"; # $my_name : カウンター名 # $counter_file : カウンターファイル (カウント数を保存) # $access_log : アクセスログ(過去にアクセスのあったアドレスを保存) # $bkp_log : アクセスログヒストリー (1世代前のログ) # $lock_file : ロックファイル # $sum_dom : ドメイン毎集計ファイル # $sum_idx : ページインデックス毎の集計ファイル # $sum_pre : リンク元毎の集計ファイル # $sum_bro : ブラウザ毎の集計ファイル # $cmnt : ログに書き出すコメント(ページインデックス) ####################### # 処理 ####################### # オプションの判断 $mode = ""; for ($i = 0 ; $i <= $#ARGV ; $i++) { if ($ARGV[$i] eq "test") { # テストモード $mode="test"; } elsif ($ARGV[$i] eq "hide") { # 隠しカウンターモード $mode = "hide"; } elsif ($ARGV[$i] eq "name") { # 別名でカウンターを利用する $my_name = $ARGV[++$i]; $counter_file = "$script_dir" . "$my_name" . ".cnt"; $access_log = "$script_dir" . "$my_name" . ".acs"; $bkp_log = "$script_dir" . "lock/$my_name" .".acs.bkp"; $lock_file = "$script_dir" . "lock/$my_name" . "_lck"; } elsif ($ARGV[$i] eq "cmt") { # コメントの取得 $cmnt = $ARGV[++$i]; } elsif ($ARGV[$i] eq "syuukei") { # アクセス集計の簡易表示 $mode = "syuukei"; } elsif ($ARGV[$i] eq "image") { # 隠しイメージカウンター $mode = "image"; if ($image_dir =~ /\/$/) { $imagefile =$image_dir & $ARGV[++$i]; } else { $imagefile =$image_dir & "/" & $ARGV[++$i]; } } } if ($mode eq "test" ) { # テスト &cgi_test; } elsif ($mode eq "syuukei") { # 集計 &syuukei("text"); } else { # カウント &go_count; } exit(0); ############################################################################ # サブルーチン ############################################################################ # ロックファイルの残留防止 sub sigexit { rmdir($file_lock); exit(0); } $SIG{'PIPE'} = $SIG{'INT'} = $SIG{'HUP'} = $SIG{'QUIT'} = $SIG{'TERM'} = "&sigexit"; # CGIのテスト sub cgi_test { print "Content-type: text/html\n"; print "\n"; print "\n"; print "
\n"; print "\n"; } if ( ! -r $counter_file ) { print "カウンターファイル : $counter_file が存在しません
\n"; } elsif ( -w $counter_file ) { print "カウンターファイル : $counter_file が書き込み可能でありません
\n"; } if ( ! -r $access_log ) { print "アクセスログ : $access_log が存在しません
\n"; } elsif ( -w $access_log ) { print "アクセスログ : $access_log が書き込み可能でありません
\n";
}
print "\n";
print "\n";
}
# カウント
sub go_count {
$count_step = 1;
# タイムゾーンの設定
$ENV{'TZ'} = "JST-9";
# 日付の取得
($sec, $min, $hour, $mday, $mon, $year) = localtime(time());
$year += 1900;
$ndate = sprintf("%04d/%02d/%02d", $year, $mon + 1, $mday);
$ntime = sprintf("%02d:%02d:%02d", $hour, $min, $sec);
# クライアント情報
$raddr = $ENV{'REMOTE_ADDR'};
$rhost = $ENV{'REMOTE_HOST'};
$ragnt = $ENV{'HTTP_USER_AGENT'};
# ロボットはカウントしない
foreach $rbt (@robots) {
if (index($ragnt, $rbt) > -1) {exit(1);}
}
# リンク元 自分のページの場合は OwnPage と出力
($refer, $remain) = split(/\?/, $ENV{'HTTP_REFERER'});
$refer =~ s/%[0-9a-fA-F][0-9a-fA-F]/pack("C", hex($1))/eg;
if ( $refer =~ /$my_url/ ) {
$refer = "OwnPage";
}
if ( $file_lock_enable ) {
# ファイルのロック
&file_lock;
}
# カウンターの取得
if ( open(CNT, "< $counter_file") ) {
$wrk = \n";
print" \n";
print" \n";
print"アクセス状況集計結果
\n";
print"
アクセス数: $count ($acnt)
\n";
print"日計\n";
print"
\n";
print"\n";
print"
\n";
print" \n";
@swkacnt = sort { $wkacnt{$b} <=> $wkacnt{$a} } keys %wkacnt;
foreach $w ( @swkacnt ) {
$ratio = $wkacnt{$w} * 100 / $count ;
$sratio = sprintf("%3.1f", $ratio);
$hosi = "*" x ($ratio / 4);
print("クライアントホスト/アドレス アクセス 比 率 \n");
}
print"$w $wkacnt{$w} $hosi ($sratio\%) \n";
print"
\n";
print" \n";
@swkicnt = sort { $wkicnt{$b} <=> $wkicnt{$a} } keys %wkicnt;
foreach $w ( @swkicnt ) {
$ratio = $wkicnt{$w} * 100 / $count ;
$sratio = sprintf("%3.1f", $ratio);
$hosi = "*" x ($ratio / 4);
print("ページインデックス アクセス 比 率 \n");
}
print"$w $wkicnt{$w} $hosi ($sratio\%) \n";
print"
\n";
print" \n";
@swkpcnt = sort { $wkpcnt{$b} <=> $wkpcnt{$a} } keys %wkpcnt;
foreach $w ( @swkpcnt ) {
$ratio = $wkpcnt{$w} * 100 / $pre_cnt ;
$sratio = sprintf("%3.1f", $ratio);
$hosi = "*" x ($ratio / 4);
print("リンク元 アクセス 比 率 \n");
}
print"$w $wkpcnt{$w} $hosi ($sratio\%) \n";
print"
\n";
print" \n";
@swkicnt = sort { $wkbcnt{$b} <=> $wkbcnt{$a} } keys %wkbcnt;
foreach $w ( @swkbcnt ) {
$ratio = $wkbcnt{$w} * 100 / $bro_cnt ;
$sratio = sprintf("%3.1f", $ratio);
$hosi = "*" x ($ratio / 4);
print("ブラウザ アクセス 比 率 \n");
}
print"$w $wkbcnt{$w} $hosi ($sratio\%)
\n";
print"日計\n";
print"\n\n";
}
}
# IPアドレスはそのまま、ホスト名は後ろから指定された数の名前?だけ残す
#
sub cut_hostname {
$wkdomain = shift(@_);
if ( $wkdomain =~ /[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/) {
# IPアドレスが含まれる場合
if ( $wkdomain =~ /.*\D$/ ) {
# IP ADDRESS を含むドメインの IP ADDRESS 部を切り取る
$wkdomain =~ s/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+//;
$wkdomain =~ s/^\.//;
$domain = $wkdomain;
} else {
# IP アドレスの場合
if ($log_ip) {
# 下1オクテットをまとめる
$wkdomain =~ s/([0-9]+)\.([0-9])+\.([0-9]+)\.([0-9]+)/$1\.$2\.$3\.X/;
$domain = $wkdomain;
} else {
# IPアドレスをそのまま返す
$domain = $wkdomain;
}
}
} else {
# 通常のドメインの場合はホスト部を切り取る
($host, $domain) = split(/\./, $wkdomain ,2) ;
}
return $domain;
}
# ------------- 使用に際してはこれ以降を切り取ってしまっても構いません -------------
# 但し、配布等に関してはオリジナルのままのファイルを配布してください
###############
# 更新履歴
###############
#
#1999/06/04 Ver. 0.10 完成
#
#1999/06/07 Ver. 0.20 ログ出力方法の変更、通しカウントの追加
# Ver. 0.21 カウントタイムアウトの不具合を修正
#
#1999/06/09 Ver. 0.22 タイムアウト時間の算出方法の修正
#
#1999/06/11 Ver. 0.23 cmd モードで、ファイルの絶対パスを使用できるように修正
#
#1999/06/17 Ver. 0.24 集計機能を追加
#
#1999/07/23 Ver. 0.25 リンク元をログに追加
#
#1999/08/19 Ver. 0.26 httpヘッダの記述ミスを訂正(^^;
#
#1999/08/20 Ver. 0.27 httpヘッダの出力方法を変更
#
#1999/10/22 Ver. 0.28 集計方法の変更(ホスト毎集計をドメイン毎に変更)
#
#1999/10/27 Ver. 0.29 集計に比率を追加、集計のバグ取り
#
#1999/11/05 Ver. 0.30 集計プログラムを別に作成
#
#2000/02/ Ver. 0.31 隠しカウンタとしてイメージを表示させる機能を追加
# 集計項目を追加(リンク元、ブラウザ)
#
#2001/12/11 Ver. 0.32 指定したロボットをカウントしない機能を追加
##############
# その他
##############
#
# このカウンターはフリーソフトです。
# 使用、転載、再配布、改変、について、作者への問い合わせは必要ありません。
# 但し、改変した場合は、その履歴と改変者をドキュメントに付加してください。
#
# このカウンターの使用にあたって発生した障害等について、作者は一切の責任を負いかねます。
#
# 作者 しましま e-mail : shima@propel.ne.jp
# Web Page : http://www.propel.ne.jp/~shima/
#
# このカウンターは とほほ氏の wwwcount.cgi Ver2.92 を参考に作りました
# webcount.cgi 最新版入手先: http://www2e.biglobe.ne.jp/~s-hasei/