#!/usr/bin/perl # # アクセス解析 Ver0.21 # # Copyright (C) 2003 Silver Making All rights reserved. # # ■標準的なディレクトリ階層 # public_html ┬ cgi-bin ─ access ─ access.cgi # └ index.html # # ■パーミッション # -------------------------------------------------- # ファイル名 アクセス権 # -------------------------------------------------- # access 777(ディレクトリ) # access.cgi 755(プログラム) # -------------------------------------------------- &main; sub main { &initialize; &file_check; &form_decode; &load_log; if ($form{'function'} eq "count") { &count; &image_draw; } elsif ($form{'function'} eq "yesterday") { &html_yesterday_access; } else { &html_access; } } sub initialize { $text = "#000000"; $link = "#0000FF"; $vlink = "#800080"; $alink = "#FF0000"; $bgcolor = "#FFFFFF"; $background = ""; $title_name = "アクセス解析"; $home = "http://www.making-led.com/index2.html"; ($S, $M, $H, $d, $m, $y, $A) = localtime(time); $y += 1900; $m++; $a = ("日", "月", "火", "水", "木", "金", "土")[$A]; $date = sprintf("%d年%d月%d日 %s曜日", $y, $m, $d, $a); } sub file_check { unless (-e "log.txt") { open(LOG_FILE, ">log.txt"); flock(LOG_FILE, 2); printf(LOG_FILE "HEAD=date=%s\n", $date); flock(LOG_FILE, 8); close(LOG_FILE); } } sub form_decode { if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } @pairs = split(/&/, $buffer); foreach (@pairs) { ($form_name, $form_value) = split(/=/); $form_value =~ tr/+/ /; $form_value =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg; $form{$form_name} = $form_value; } } sub load_log { if ($form{'function'} eq "yesterday") { $file_name = "log1.txt"; } else { $file_name = "log.txt"; } open(LOG_FILE, $file_name); foreach () { chop; ($log_head, $log_key, $log_value) = split(/=/); if ($log_head eq "HEAD") { $head{$log_key} = $log_value; } elsif ($log_head eq "TODAY_COUNT") { $today{$log_key} = $log_value; } elsif ($log_head eq "HTTP_USER_AGENT") { if( $log_key =~ /MSIE ([\d\.]+)/ ){ $log_key_browser = "Microsoft InternetExplorer $1"; } elsif( $log_key =~ /DreamPassport\/([\d\.]+)/ ){ $log_key_browser = "DreamPassport $1"; } elsif( $log_key =~ /Getweb!\/([\d\.]+)/ ){ $log_key_browser = "Getweb! $1"; } elsif( $log_key =~ /WebTV\/([\d\.]+)/ ){ $log_key_browser = "WebTV $1"; } elsif( $log_key =~ /Nutscrape\/([\d\.]+)/ ){ $log_key_browser = "Nutscrape $1"; } elsif( $log_key =~ /PNWalker\/([\d\.]+)/ ){ $log_key_browser = "ぷらネットウォーカー $1"; } elsif( $log_key =~ /Mozilla.*compatible/ ){ $log_key =~ /\(.*\)/; ($Value1, $Value2) = split( /;/, $1 ); unless( $Value2 ) { $log_key_browser = "NetscapeNavigator互換ブラウザ"; } else { $log_key_browser = $log_key; } } elsif( $log_key =~ /Mozilla\/([\d\.]+)/ ){ $log_key_browser = "NetscapeNavigator $1"; } else{ $log_key_browser = $log_key; } if( $log_key =~ /Win([\w ]*)(95|98|NT)[ ]*([\d\.]*)/i ) { if( $3 >= 5 ) { $log_key_os = "Windows 2000"; }else{$log_key_os = "Windows $2 $3"; } } elsif( $log_key =~ /Mac/i ) { $log_key_os = "Macintosh"; } elsif( $log_key =~ /FreeBSD ([\d\.]+)/ ){ $log_key_os = "FreeBSD $1"; } elsif( $log_key =~ /SunOS ([\d\.]+)/ ){ $log_key_os = "Sun Microsystems Solaris $1"; } elsif( $log_key =~ /Linux ([\d\.-]+)/ ){ $log_key_os = "Linux $1"; } elsif( $log_key =~ /HP-UX ([^\;\)]+)/ ){ $log_key_os = "HP-UX $1"; } elsif( $log_key =~ /X11/ ){ $log_key_os = "X-Window System"; } elsif( $log_key =~ /DreamPassport/ ) { $log_key_os = "Dreamcast"; } else{ $log_key_os = "不明"; } $agent{$log_key} = $log_value; $os{$log_key_os} += $log_value; $browser{$log_key_browser} += $log_value; } elsif ($log_head eq "REMOTE_HOST") { $host{$log_key} = $log_value; } } close(LOG_FILE); } sub count { if ($head{'date'} eq $date) { ++$head{'today'}; } else { open(LOG_FILE, ">log1.txt"); flock(LOG_FILE, 2); foreach (keys(%head)) { printf(LOG_FILE "HEAD=%s=%s\n", $_, $head{$_}); } foreach (keys(%today)) { printf(LOG_FILE "TODAY_COUNT=%s=%d\n", $_, $today{$_}); } foreach (keys(%agent)) { printf(LOG_FILE "HTTP_USER_AGENT=%s=%d\n", $_, $agent{$_}); } foreach (keys(%host)) { printf(LOG_FILE "REMOTE_HOST=%s=%d\n", $_, $host{$_}); } flock(LOG_FILE, 8); close(LOG_FILE); %today = %agent = %host = (); $head{'yesterday'} = $head{'today'}; $head{'today'} = 1; $head{'date'} = $date; } open(LOG_FILE, ">log.txt"); flock(LOG_FILE, 2); ++$head{'total'}; foreach (keys(%head)) { printf(LOG_FILE "HEAD=%s=%s\n", $_, $head{$_}); } ++$today{$H}; foreach (keys(%today)) { printf(LOG_FILE "TODAY_COUNT=%s=%d\n", $_, $today{$_}); } ++$agent{$ENV{'HTTP_USER_AGENT'}}; foreach (keys(%agent)) { printf(LOG_FILE "HTTP_USER_AGENT=%s=%d\n", $_, $agent{$_}); } if( $ENV{'REMOTE_HOST'} eq $ENV{'REMOTE_ADDR'} ) { $addr = gethostbyaddr( pack( 'C4', split( /\./, $ENV{'REMOTE_ADDR'} ) ), 2 ); } else { $addr = $ENV{'REMOTE_HOST'}; } ++$host{$addr}; foreach (keys(%host)) { printf(LOG_FILE "REMOTE_HOST=%s=%d\n", $_, $host{$_}); } flock(LOG_FILE, 8); close(LOG_FILE); } sub image_draw { printf("Content-type: image/gif\n\n"); open(GIF_FILE, "access.gif"); while (read(GIF_FILE, $buffer, 16384)) { printf("%s", $buffer); } close(GIF_FILE); } sub html_access { printf("Content-type: text/html\n\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("アクセス解析\n"); printf("\n"); printf("\n"); printf("\n", $bgcolor, $background, $text, $link, $vlink, $alink); printf("\n"); printf("\n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); printf("
ホームへ戻る|", $home); if (-e "log1.txt") { printf("昨日のアクセス解析"); } else { printf("昨日のアクセス解析"); } printf("
\n"); printf("\n"); printf("

%s

\n", $title_name); printf("\n"); printf("\n"); printf(" \n"); printf(" \n", $date); printf(" \n"); printf(" \n"); printf("
%s 現在のアクセス状況です。\n"); printf(" \n"); printf(" \n"); printf(" \n", $head{'yesterday'}); printf(" \n"); printf("
総合アクセス回数:%d件
\n", $head{'total'}); printf(" 今日アクセス回数:%d件
\n", $head{'today'}); printf(" 昨日アクセス回数:%d件
\n"); printf("
\n"); printf("\n"); printf("\n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); ($today_max) = sort { $b <=> $a } values(%today); for ($i = 0; $i < 24; ++$i) { printf(" \n"); } printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); printf("
■現在のアクセス状況
\n"); if ($today{$i} > 0) { printf(" \n"); if ($i == $H) { printf(" \n", $today{$i} / $today_max * 100); } else { printf(" \n", $today{$i} / $today_max * 100); } printf(" \n"); } printf(" \n"); printf(" \n", $i); printf(" \n"); printf("
%02d
\n"); printf("
\n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); for ($i = 0; $i < 6; ++$i) { printf(" \n"); for ($j = 0; $j < 4; ++$j) { printf(" \n", $i + $j * 6); if ($today{$i + $j * 6} == 0) { printf(" \n"); } else { printf(" \n", $today{$i + $j * 6}, $today{$i + $j * 6} / $head{'today'} * 100); } if ($j < 3) { printf(" \n"); } } printf(" \n"); } printf("
時間人数 時間人数 時間人数 時間人数
%02d:00〜-%d(%.1f%%) 
\n"); printf("
\n"); printf("\n"); printf("
\n"); printf("\n"); printf("

■ブラウザ使用状況

\n"); printf("\n"); printf("\n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); ($browser_max) = sort { $b <=> $a } values(%browser); foreach (sort { $browser{$b} <=> $browser{$a} || $b cmp $a } keys(%browser)) { printf(" \n"); printf(" \n"); if ($_) { printf(" \n", $_); } else { printf(" \n"); } printf(" \n"); } printf("
アクセス状況ブラウザ名
\n"); printf(" \n"); printf(" \n", $browser{$_} / $browser_max * 100); printf(" \n", $browser{$_}, $browser{$_} / $head{'today'} * 100); printf(" \n"); printf("
%d(%.1f%%)
\n"); printf("
%s不明
\n"); printf("\n"); printf("
\n"); printf("\n"); printf("

■OS使用状況

\n"); printf("\n"); printf("\n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); ($os_max) = sort { $b <=> $a } values(%os); foreach (sort { $os{$b} <=> $os{$a} || $a cmp $b } keys(%os)) { printf(" \n"); printf(" \n"); if ($_) { printf(" \n", $_); } else { printf(" \n"); } printf(" \n"); } printf("
アクセス状況OS名
\n"); printf(" \n"); printf(" \n", $os{$_} / $os_max * 100); printf(" \n", $os{$_}, $os{$_} / $head{'today'} * 100); printf(" \n"); printf("
%d(%.1f%%)
\n"); printf("
%s不明
\n"); printf("\n"); printf("
\n"); printf("\n"); printf("

■ホスト名調査

\n"); printf("\n"); printf("\n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); ($host_max) = sort { $b <=> $a } values(%host); foreach (sort { $host{$b} <=> $host{$a} || $a cmp $b } keys(%host)) { printf(" \n"); printf(" \n"); if ($_) { printf(" \n", $_); } else { printf(" \n"); } printf(" \n"); } printf("
アクセス状況ホスト名
\n"); printf(" \n"); printf(" \n", $host{$_} / $host_max * 100); printf(" \n", $host{$_}, $host{$_} / $head{'today'} * 100); printf(" \n"); printf("
%d(%.1f%%)
\n"); printf("
%s不明
\n"); printf("\n"); printf("
\n"); printf("\n"); printf("\n"); printf(" \n"); printf(" \n"); printf("
Copyright (C) 2003 Silver \n"); printf(" Making All rights reserved.
\n"); printf("
\n"); printf("\n"); printf("\n"); } sub html_yesterday_access { printf("Content-type: text/html\n\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("アクセス解析\n"); printf("\n"); printf("\n"); printf("\n", $bgcolor, $background, $text, $link, $vlink, $alink); printf("\n"); printf("\n"); printf(" \n"); printf(" \n"); printf(" \n", $home); printf(" \n"); printf("
ホームへ戻る今日のアクセス解析
\n"); printf("\n"); printf("

%s

\n", $title_name); printf("\n"); printf("\n"); printf(" \n"); printf(" \n", $head{'date'}); printf(" \n"); printf(" \n"); printf("
%sのアクセス状況です。\n"); printf(" \n"); printf(" \n"); printf(" \n", $head{'yesterday'}); printf(" \n"); printf("
昨日の総合アクセス回数:%d件
\n", $head{'total'}); printf(" 昨日のアクセス回数:%d件
\n", $head{'today'}); printf(" 一昨日のアクセス回数:%d件
\n"); printf("
\n"); printf("\n"); printf("\n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); ($today_max) = sort { $b <=> $a } values(%today); for ($i = 0; $i < 24; ++$i) { printf(" \n"); } printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); printf("
■昨日のアクセス状況
\n"); if ($today{$i} > 0) { printf(" \n"); printf(" \n", $today{$i} / $today_max * 100); printf(" \n"); } printf(" \n"); printf(" \n", $i); printf(" \n"); printf("
%02d
\n"); printf("
\n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); for ($i = 0; $i < 6; ++$i) { printf(" \n"); for ($j = 0; $j < 4; ++$j) { printf(" \n", $i + $j * 6); if ($today{$i + $j * 6} == 0) { printf(" \n"); } else { printf(" \n", $today{$i + $j * 6}, $today{$i + $j * 6} / $head{'today'} * 100); } if ($j < 3) { printf(" \n"); } } printf(" \n"); } printf("
時間人数 時間人数 時間人数 時間人数
%02d:00〜-%d(%.1f%%) 
\n"); printf("
\n"); printf("\n"); printf("
\n"); printf("\n"); printf("

■ブラウザ使用状況

\n"); printf("\n"); printf("\n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); ($browser_max) = sort { $b <=> $a } values(%browser); foreach (sort { $browser{$b} <=> $browser{$a} || $b cmp $a } keys(%browser)) { printf(" \n"); printf(" \n"); if ($_) { printf(" \n", $_); } else { printf(" \n"); } printf(" \n"); } printf("
アクセス状況ブラウザ名
\n"); printf(" \n"); printf(" \n", $browser{$_} / $browser_max * 100); printf(" \n", $browser{$_}, $browser{$_} / $head{'today'} * 100); printf(" \n"); printf("
%d(%.1f%%)
\n"); printf("
%s不明
\n"); printf("\n"); printf("
\n"); printf("\n"); printf("

■OS使用状況

\n"); printf("\n"); printf("\n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); ($os_max) = sort { $b <=> $a } values(%os); foreach (sort { $os{$b} <=> $os{$a} || $a cmp $b } keys(%os)) { printf(" \n"); printf(" \n"); if ($_) { printf(" \n", $_); } else { printf(" \n"); } printf(" \n"); } printf("
アクセス状況OS名
\n"); printf(" \n"); printf(" \n", $os{$_} / $os_max * 100); printf(" \n", $os{$_}, $os{$_} / $head{'today'} * 100); printf(" \n"); printf("
%d(%.1f%%)
\n"); printf("
%s不明
\n"); printf("\n"); printf("
\n"); printf("\n"); printf("

■ホスト名調査

\n"); printf("\n"); printf("\n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); ($host_max) = sort { $b <=> $a } values(%host); foreach (sort { $host{$b} <=> $host{$a} || $a cmp $b } keys(%host)) { printf(" \n"); printf(" \n"); if ($_) { printf(" \n", $_); } else { printf(" \n"); } printf(" \n"); } printf("
アクセス状況ホスト名
\n"); printf(" \n"); printf(" \n", $host{$_} / $host_max * 100); printf(" \n", $host{$_}, $host{$_} / $head{'today'} * 100); printf(" \n"); printf("
%d(%.1f%%)
\n"); printf("
%s不明
\n"); printf("\n"); printf("
\n"); printf("\n"); printf("\n"); printf(" \n"); printf(" \n"); printf(" \n"); printf("
Copyright (C) 1998 CGI \n"); printf(" Arkadia All rights reserved.
\n"); printf(" Script written by Shintaro Wakayama.
\n"); printf("\n"); printf("\n"); }