|
|
03/16(Sun) 01:58
■ ログ記録CGI webaxs.pl の改造
★「おしらせ」★
○ 「OS&ブラウザ名の取得」部分を最新に更新しました。WindowsXP、2000、MEやMac、UNIX、携帯機種等のOS判別が詳細にできるようになります。(2001/12/09)
■改造項目
- データ項目の追加
(1)webaxs.plはログ記録ファイルlog.csvに次のデータを記録します。
- 時刻(時),リンク元,リモートホスト名,ブラウザ名
(2)このデータに以下のデータを追加する改造を行います。
- 訪問日,時刻(分),カウンター数,再訪問回数
- InfowebのDNS逆引き中止対策として、Look Up Table(ファイル名 ipmas.dat)によるIPアドレスからホスト名を取得するスクリプトの変更。
- 再訪問回数を得るためのクッキー処理ルーチン decode_cookie の追加
- ブラウザの詳細情報の取得
■あなたが準備するファイルとデータ
- この改造は、下記の2つのファイルから単にデータを読み込んで、log.csvに書き出すだけです。従って別に、他のCGIなどで作成された下のデータが必要です。
(1)カウンタ数
- あなたが設置したアクセスカウンタCGIで記録された、カウンタファイル(サンプルでは、count)
(2)再訪問回数
- あなたが別のスクリプトなどで作成した、再訪問回数が記録されてるクッキーデータのクッキー名(サンプルでは、tkiku_new)。クッキーの中に、tkiku_new=count:10,・・・ の形式で記録されてるものとして処理しています。countは再訪問回数を表し名前は固定です。数字の10は再訪問回数です。クッキーについては、クッキー入門を参考にして下さい。
- DNS逆引き用、Look Up Table
- こちらからipmas.dat (約33KB、12/27(Tue) 17:23版) をダウンロードして下さい(左クリックすると表示するか保存するか聞いてきますので「ファイルに保存」を選択するとdowncnt.cgi という名で保存されますので、ファイル名をipmas.datに変更して下さい)。DNS逆引きスクリプトは下のサンプルには組み込まれています。ipmas.datをセットするだけです。
(注)DNS逆引きのみを適用したい方は、アクセス解析、アクセス解析2の方ををご覧下さい。こちらのほうが解りやすいと思います。
- 再訪問回数を得るためのクッキー読み込みルーチン decode_cookie の追加
- 下のサンプルには組み込まれています。スクリプトの最後のあたりにある sub decode_cookie がそうです。
- ブラウザの詳細情報の取得
- 下のサンプルには組み込まれています。
下のスクリプトをマウスでドラッグして「コピー」し、エディタに「貼りつけ」るとコピーできます。
#!/usr/bin/perl
#↑perlの存在するpathに書き換えてください。
#
# (SSI式) WebACCESS v2.2 is Free. (c)rescue@ask.or.jp
# modified by http://kikuchisan.net/
# スクリプトの利用規定等
# http://www.ask.or.jp/~rescue/support/
# バグやヴァージョンアップのお知らせ等
# http://www.ask.or.jp/~rescue/webboard/
#-------------------------------------------------------------------#
# あなたの環境にあわせて変更するところ--------
# ログ記録ファイルとカウンター記録ファイルおよび# DNS逆引き用
# look up tableをフルパスで設定。
# 相対パスで指定するときは、SSI記述するHTMLから見た位置を指定
#
$log = "./log.csv"; #ログ記録ファイル
$cnt = "./count"; #カウンター記録ファイル(count)
$ipmas = "./ipmas.dat"; #DNS逆引き用look up table
$cookie_name = 'tkiku_new'; #クッキー名
# 集計に含めないURLを指定(この文字列を含むデータを記録しない)
#$mine = "http://kikuchisan.net/";
# 最大ログ記録件数
$max = "1000";
# 変更するところ(ここまで)--------
#----- 訪問回数の取得-----------------------------------------------#
&decode_cookie($cookie_name); #$COOKIE{'count'}に訪問回数がセット
$vcount = $COOKIE{'count'};
#----- カウンター数の取得-------------------------------------------#
open (CNT,"$cnt")||die"$cnt :$!";
$ncount = ;
close(CNT);
#----- 時刻取得-----------------------------------------------------#
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = gmtime(time + 9*3600);
$month = ($mon + 1);
if ($month < 10) { $month = "0$month"; }
if ($mday < 10) { $mday = "0$mday"; }
if ($hour < 10) { $hour = "0$hour"; }
if ($min < 10) { $min = "0$min"; }
#-------------------------------------------------------------------#
# OS&ブラウザ名の取得
$HTTP_USER_AGENT = $ENV{'HTTP_USER_AGENT'};
$HTTP_USER_AGENT =~ s/</g;
$HTTP_USER_AGENT =~ s/>/>/g;
$HTTP_USER_AGENT =~ s/,//g;
if ($HTTP_USER_AGENT =~ /NT 5.0/i) { $OS = "Windows2000"; }
elsif ($HTTP_USER_AGENT =~ /NT 5.1/i) { $OS = "WindowsXP"; }
elsif ($HTTP_USER_AGENT =~ /Win 9x/i) { $OS = "WindowsME"; }
elsif ($HTTP_USER_AGENT =~ /Win(.*)(95|98|NT)/i)
{ $OS = $2; $OS =~ y/a-z/A-Z/; $OS = "Windows$OS"; }
elsif ($HTTP_USER_AGENT =~ /Macintosh/i) { $OS = "Macintosh"; }
elsif ($HTTP_USER_AGENT =~ /Mac_PowerPC/i) { $OS = "Mac_PowerPC"; }
elsif ($HTTP_USER_AGENT =~ /X11/i) { $OS = "X11"; }
elsif ($HTTP_USER_AGENT =~ /Linux/i) { $OS = "Linux"; }
elsif ($HTTP_USER_AGENT =~ /SunOS/i) { $OS = "SunOS"; }
elsif ($HTTP_USER_AGENT =~ /FreeBSD/i) { $OS = "FreeBSD"; }
elsif ($HTTP_USER_AGENT =~ /WebTV/i) { $OS = "WebTV"; }
elsif ($HTTP_USER_AGENT =~ /AIX/i) { $OS = "AIX"; }
elsif ($HTTP_USER_AGENT =~ /OSF1/i) { $OS = "OSF1"; }
elsif ($HTTP_USER_AGENT =~ /NEWS-OS/i) { $OS = "NEWS-OS"; }
elsif ($HTTP_USER_AGENT =~ /IRIX/i) { $OS = "IRIX"; }
elsif ($HTTP_USER_AGENT =~ /HP-UX/i) { $OS = "HP-UX"; }
elsif ($HTTP_USER_AGENT =~ /BSD\/OS/i) { $OS = "BSD/OS"; }
elsif ($HTTP_USER_AGENT =~ /DoCoMo/i) { $OS = "DoCoMo"; }
elsif ($HTTP_USER_AGENT =~ /J-PHONE/i){ $OS = "J-sky"; }
elsif ($HTTP_USER_AGENT =~ /UP\.Browser/i){ $OS = "EZweb"; }
else {$OS = "Etc."; }
($hua,$vers) = split('/',$HTTP_USER_AGENT);
if ($vers =~ /MSIE/) {
($hua,$vers) = split(/MSIE /,$vers);
($vers,$hua) = split(/\;/,$vers);
$HTTP_USER_AGENT ="MSIE/$vers $OS";
} elsif ($hua eq "Mozilla") {
($vers,$hua) = split(/ \[/,$vers);
($vers,$hua) = split(/\(/,$vers);
$HTTP_USER_AGENT ="Mozilla/$vers $OS";
} else {
($vers,$hua3) = split(/\(/,$HTTP_USER_AGENT);
$HTTP_USER_AGENT ="$vers $OS";
}
$hua = $HTTP_USER_AGENT;
#-------------------------------------------------------------------#
# リモートホスト名の判定
$rh = $ENV{'REMOTE_HOST'};
$addr = $ENV{'REMOTE_ADDR'};
#--DNS逆引き------
open(FP,"<$ipmas") || die "Can't open $ipmas\n";
$flg=0;
while(){
($id1,$name1)=split(/\s+/);
if($rh =~ /$id1/){
$flg=1;
$rh = $name1;
last;
}
}
close(FP);
if($flg==0){
if ($rh eq $addr) { $rh = gethostbyaddr(pack('C4',split(/\./,$rh)),2) || $addr; }
if ($rh =~ /(.*)\.(\d+)$/) { ; }
elsif ($rh =~ /(.*)\.(.*)\.(.*)\.(.*)$/) { $rh = "\*\.$2\.$3\.$4"; }
elsif ($rh =~ /(.*)\.(.*)\.(.*)$/) { $rh = "\*\.$2\.$3"; }
}
#--DNS逆引き(ここまで)----------------------------------------------#
# リンク元の取得
$ref = $ENV{'HTTP_REFERER'};
#if ($ref =~ /$mine/i || $ref =~ /file:/) { $ref = ""; }
#-------------------------------------------------------------------#
if (!open(DB,"$log")) { &error(1); }
@lines = ;
close(DB);
$ic = 0;
foreach $line (@lines) {
$ic++;
if ($ic == $max) { last; }
push(@new,$line);
}
$value = "$hour\,$ref\,$rh\,$hua\,$year\/$month\/$mday\,$min\,$ncount\,$vcount\n";
unshift(@new,$value);
if (!open(DB,">$log")) { &error(2); }
print DB @new;
close(DB);
exit;
#--クッキー読み込みルーチン-----------------------------------------#
sub decode_cookie {
local($cookie) = @_;
local($name,$value,$cookies);
foreach (split(/\;/,$ENV{'HTTP_COOKIE'}))
{
($name, $value) = split(/=/);
$name =~ s/ //g;
$COOKIES{$name} = $value;
}
foreach (split(/\,/,$COOKIES{$cookie}))
{
($name, $value) = split(/:/);
$COOKIE{$name} = $value;
}
}
#-------------------------------------------------------------------#
sub error { print "ERROR $_[0]"; exit; }
|
|
|