#!/usr/bin/perl require 'cgi-bin/jcode.pl'; require 'cgi-bin/perl-lib.pl'; #---------------------------------- # 監理者パスワード # 8文字以上で推測できない物に変更 $root = '12345678'; # 自分のサイトのURL # http://は省略する事 $usersite = 'www.yokohama-city.com/mc/'; # ディレクトリにアクセスした場合 # 自動で表示するファイル $defaultindex = 'index.html'; # 世界標準時との時差 $timelag = 9; # データを保存するディレクトリ # あらかじめ作成しておく(755/777) $countdir = 'cgi-bin'; # ページのファイル名を自動取得する場合は1 $acquisition = 1; # 記録しないサーバ名 $NONSITE[0] = 'www.yokohama-city.com'; # 記録しない接続ホスト $NONHOST[0] = '192.168.1.10'; $NONHOST[1] = '192.168.1.11'; # 各ページに表示する画像 # サンプルは1ドットの透明画像 $image = 'images/exspc.gif'; # 表示する件数 $pageview = 1000; #============================================== # 設定はここまで、これ以降は変更禁止 #============================================== !$defaultindex && ($defaultindex = 'index.htm'); $ENV{'TZ'} = "GMT"; $DATE = time + $timelag * 3600; $datenow = jst_time($DATE, 6); ($date, $time) = split(/ /, $datenow); ($year, $month, $day) = split(/\//, $date); $day = sprintf("%02d", $day); ($when, $minute, $second) = split(/:/, $time); $filename = "$countdir/" . sprintf("%04d-%02d", $year, $month) . '.tdb'; readparts('QUERY', '<>', 'sjis'); if ($QUERY{'action'} eq 'view' && $QUERY{'pw'} eq $root) { # 監理者専用解析ページ if (!$QUERY{'date'}) { $datenow = jst_time($DATE, 5); ($year, $month, $day) = split(/\//, $datenow); $QUERY{'date'} = sprintf("%04d-%02d", $year, $month); } ($year, $month) = split(/-/, $QUERY{'date'}); $date = sprintf("%04d/%02d/%02d", $year, $month, 1); @WEEK = ('日','月','火','水','木','金','土'); my(@DATE) = localtime(dateserial($date, $INIT{'timelag'})); $week = $DATE[6]; $days = calendar2($year, $month, $timelag, 0, 1); if (opendir(DIR,"$countdir")) { @FILES = grep(/\.tdb$/, readdir(DIR)); closedir(DIR); } $filename = "$countdir/$QUERY{'date'}" . '.tdb'; htmlhead(); print "
◆ 月間集計
◆ 時間帯集計
◆ ページ別集計
◆ アクセス解析
◆ 接続ホスト集計
"; if ($QUERY{'cmd'} eq 'timeview') { if (open(DB, $filename)) { undef @ACCESS; while () { ($day, $when, $host, $referrer, $page) = split(/\t/, $_); $day = sprintf("%02d", $day); $value = join("\t", $day, $when, $host, $referrer, $page); push(@ACCESS, $value); } close(DB); } $max = 0; $total = 0; foreach (1 .. $days) { $day = sprintf("%02d", $_); @COUNT = grep(/^$day\t/, @ACCESS); @COUNT > $max && ($max = @COUNT); if ($_ == 1) { $min = @COUNT; } @COUNT < $min && ($min = @COUNT); $gtotal += @COUNT; } print "\n"; print "\n"; print "\n"; print "
\n"; print "
\n"; print "
\n"; print "\n"; print ""; print "\n"; print "\n"; print "\n"; print ""; print "\n"; print "\n"; print ""; foreach (0 .. 23) { print "\n"; } print "\n"; $total = 0; foreach (1 .. $days) { print ""; print "\n"; if ($week > 6 ) { $week = 0; } if ($week == 0) { $bgcolor = '#FF9090'; } elsif ($week == 6) { $bgcolor = '#9090FF'; } else { $bgcolor = '#C0C0F0'; } print "\n"; $week++; $day = sprintf("%02d", $_); @COUNT = grep(/^$day\t/, @ACCESS); $count = @COUNT; $total += $count; !$count && ($count = ''); print "\n"; foreach (0 .. 23) { $time = sprintf("%02d", $_); @CNT = grep(/\d+\t$time\t/, @COUNT); $tcnt = @CNT; $TIME{$_} += $tcnt; !$tcnt && ($tcnt = ''); print "\n"; } print "\n"; print "\n"; } print ""; print "\n"; print "\n"; foreach (0 .. 23) { $dummy = $TIME{$_}; !$dummy && ($dummy = ''); print "\n"; } print "\n"; print "\n"; print "
 曜日 アクセス$year 年 $month 月 $pagename率(%)
$_
 $_ 日 $WEEK[$week]$count$tcnt"; if ($count && $max) { $point = sprintf("%3.1f", int($count / $max * 1000 + 0.5) / 10); print $point; } print "
合計$total$dummy
\n"; print "
\n"; print "
\n"; } elsif ($QUERY{'cmd'} eq 'pageview') { if (open(DB, $filename)) { undef @ACCESS; while () { ($day, $when, $host, $referrer, $page, $dummy) = split(/\t/, $_); if ($page) { $page !~ /$usersite/ && ($page = "$usersite$page"); $PAGE{$page}++; $day = sprintf("%02d", $day); $value = join("\t", $day, $when, $host, $referrer, $page, $dummy); push(@ACCESS, $value); } } close(DB); } print "\n"; print "\n"; print "\n"; print "
\n"; print "
\n"; print "
\n"; print "\n"; print ""; print "\n"; print ""; print "\n"; print "\n"; print ""; foreach (1 .. $days) { print "\n"; } print "\n"; print ""; foreach (1 .. $days) { if ($week > 6 ) { $week = 0; } if ($week == 0) { $bgcolor = '#FF9090'; } elsif ($week == 6) { $bgcolor = '#9090FF'; } else { $bgcolor = '#C0C0F0'; } print "\n"; $week++; } print "\n"; foreach $key (sort keys %PAGE) { @COUNT = grep(/\t$key\t/, @ACCESS); $count = @COUNT; $name = $key; $name =~ s/$usersite//; print ""; print "\n"; foreach (1 .. $days) { $day = sprintf("%02d", $_); @CNT = grep(/^$day\t/, @COUNT); $cnt = @CNT; $DAY{$_} += $cnt; !$cnt && ($cnt = ''); print "\n"; } print "\n"; print "\n"; } print ""; print "\n"; $total = 0; foreach (1 .. $days) { $total += $DAY{$_}; !$DAY{$_} && ($DAY{$_} = ''); print "\n"; } print "\n"; print "\n"; print "
ページ$year 年 $month 月合計
$_
$WEEK[$week]
$name$cnt$PAGE{$key}
合計$DAY{$_}$total
\n"; print "
\n"; print "
\n"; print "※各ページのアクセス数は直接訪問のみ、サイト内移動は含まれません。\n"; } elsif ($QUERY{'cmd'} eq 'accessview') { if (open(DB, $filename)) { undef @ACCESS; while () { ($day, $when, $host, $referrer, $page, $dummy) = split(/\t/, $_); $day = sprintf("%02d", $day); !$referrer && ($referrer = 'BookMark'); ($referrer, $dummy) = split(/\?/, $referrer); ($referrer, $dummy) = split(/\#/, $referrer); &jcode'convert(*referrer, 'euc'); $referrer = chrchange($referrer, 1); $ADDRESS{$referrer}++; $value = join("\t", $day, $when, $host, $referrer, $page, $cm); push(@ACCESS, $value); } close(DB); } undef @ADDRESS; foreach $key (keys %ADDRESS) { if ($key ne 'BookMark') { if ($QUERY{'detailed'}) { @COUNT = grep(/\t$key$/, @ACCESS); } else { @COUNT = grep(/\t$key/, @ACCESS); } $count = @COUNT; $count = sprintf("%06d", $count); $value = "$count\t$key\t\n"; push(@ADDRESS, $value); } } @ADDRESS = reverse(sort(@ADDRESS)); @COUNT = grep(/\tBookMark/, @ACCESS); $count = @COUNT; $count = sprintf("%06d", $count); $value = "$count\tBookMark\t\n"; @BOOKMARK = @COUNT; push(@ADDRESS, $value); print "\n"; print "\n"; print "\n"; print "\n"; print "
※月間アクセスの多い順に表\示しています。
\n"; print "
\n"; print "
\n"; print "\n"; print ""; print "\n"; print ""; print "\n"; print "\n"; print ""; foreach (1 .. $days) { print "\n"; } print "\n"; print ""; foreach (1 .. $days) { if ($week > 6 ) { $week = 0; } if ($week == 0) { $bgcolor = '#FF9090'; } elsif ($week == 6) { $bgcolor = '#9090FF'; } else { $bgcolor = '#C0C0F0'; } print "\n"; $week++; } print "\n"; $index = 1; foreach (@ADDRESS) { if ($pageview && $index > $pageview) { $cat = $INIT{'pageview'}; last; } ($dummy, $key) = split(/\t/, $_); $url = "http://$key"; $url = chrchange($url, 0); print ""; print "
バックリンク$year 年 $month 月合計
$_
$WEEK[$week]
"; if ($key ne 'BookMark') { if ($QUERY{'detailed'}) { @COUNT = grep(/\t$key$/, @ACCESS); $count = @COUNT; $PAGE{'Err'} = 1; if ($PAGE{'Err'}) { $name = $key; $name = chrchange($name, 0); } else { $PAGE{'Body'} =~ /(.*)<\/title>/i; $name = $1; if (!$name) { @DOMAIN = split(/\//, $key); $name = $DOMAIN[0]; } } } else { @COUNT = grep(/\t$key/, @ACCESS); $count = @COUNT; if (@DUMMY = grep(/^$key:/, @CHANGESERVER)) { ($dummy, $name) = split(/:/, $DUMMY[0]); } else { $name = $key; } } if (length($name) > 32) { $name = ksubstr($name, 0, 16); } print "<a href=\"$url\" target=new>$name</a>"; } else { @COUNT = grep(/\t$key$/, @ACCESS); $count = @COUNT; print '<nobr>ブックマークお気に入り等</nobr>'; } print "</td>\n"; foreach (1 .. $days) { $day = sprintf("%02d", $_); @CNT = grep(/^$day\t/, @COUNT); $cnt = @CNT; $DAY{$_} += $cnt; !$cnt && ($cnt = ''); print "<td bgcolor=#FFFFFF align=right>$cnt</td>\n"; } print "<td bgcolor=#FFFFFF align=right>$ADDRESS{$key}</td>\n"; print "</tr>\n"; $index++; } print "<tr>"; print "<td align=center bgcolor=#C0C0F0>合計</td>\n"; $total = 0; foreach (1 .. $days) { $total += $DAY{$_}; !$DAY{$_} && ($DAY{$_} = ''); print "<td bgcolor=#C0C0F0 align=right>$DAY{$_}</td>\n"; } print "<td bgcolor=#C0C0F0 align=right>$total</td>\n"; print "</tr>\n"; print "</table>\n"; print "</td></tr></table>\n"; print "</td></tr></table>\n"; $cat && print "※上位 $cat 件を表\示しています。合計は $cat 件の合計です。\n"; } elsif ($QUERY{'cmd'} eq 'hostview') { if (open(DB, $filename)) { undef @ACCESS; while (<DB>) { ($day, $when, $host, $referrer, $page, $dummy) = split(/\t/, $_); if ($host) { $day = sprintf("%02d", $day); $value = join("\t", $day, $when, $host, $referrer, $page); $host =~ s/\*\.//; $HOST{$host}++; push(@ACCESS, $value); } } close(DB); } undef @HOST; foreach $key (keys %HOST) { @COUNT = grep(/\t$key/, @ACCESS); $count = @COUNT; $count = sprintf("%06d", $count); $value = "$count\t$key\t\n"; push(@HOST, $value); } @HOST = reverse(sort(@HOST)); print "<table border=0><tr>\n"; print "<td><select name=date size=1>\n"; foreach (@FILES) { if ($INIT{'dbtype'}) { /^(.+)\.db$/; $date = $1; } else { /^(.+)\.tdb$/; $date = $1; } if ($QUERY{'date'} eq $date) { $selected = ' selected'; } else { $selected = ''; } print "<option$selected value=\"$date\">$date</option>\n"; } print "</select></td>\n"; print "<td><input type=button value='再表\示' onclick=\"location.href='webaccess.cgi?pw=$QUERY{'pw'}&action=view&cmd=hostview&date='+this.form.date.options[this.form.date.selectedIndex].value\"></td>\n"; print "</tr></table>\n"; print "<table border=0 cellspacing=0 cellpadding=0><tr><td id=printdoc>\n"; print "<table border=0 cellpadding=0><tr><td bgcolor=#708090>\n"; print "<table border=0 cellspacing=1 cellpadding=1>\n"; print "<tr>"; print "<td align=center bgcolor=#C0C0F0 rowspan=3><nobr>接続ホスト</nobr></td>\n"; print "<td align=center bgcolor=#C0C0F0 colspan=$days id=printtitle>$year 年 $month 月</td>"; print "<td align=center bgcolor=#C0C0F0 rowspan=3><nobr>合計</nobr></td>\n"; print "</tr>\n"; print "<tr>"; foreach (1 .. $days) { print "<td align=center bgcolor=#C0C0F0><nobr>$_</nobr></td>\n"; } print "</tr>\n"; print "<tr>"; foreach (1 .. $days) { if ($week > 6 ) { $week = 0; } if ($week == 0) { $bgcolor = '#FF9090'; } elsif ($week == 6) { $bgcolor = '#9090FF'; } else { $bgcolor = '#C0C0F0'; } print "<td align=center bgcolor=$bgcolor width=24><nobr>$WEEK[$week]</nobr></td>\n"; $week++; } print "</tr>\n"; $index = 1; foreach (@HOST) { $pageview && $index > $pageview && last; ($dummy, $key) = split(/\t/, $_); @COUNT = grep(/\t$key\t/, @ACCESS); $count = @COUNT; print "<tr>"; print "<td bgcolor=#FFFFFF>$key</td>\n"; foreach (1 .. $days) { $day = sprintf("%02d", $_); @CNT = grep(/^$day\t/, @COUNT); $cnt = @CNT; $DAY{$_} += $cnt; !$cnt && ($cnt = ''); print "<td bgcolor=#FFFFFF align=right>$cnt</td>\n"; } print "<td bgcolor=#FFFFFF align=right>$HOST{$key}</td>\n"; print "</tr>\n"; $index++; } print "<tr>"; print "<td align=center bgcolor=#C0C0F0>合計</td>\n"; $total = 0; foreach (1 .. $days) { $total += $DAY{$_}; !$DAY{$_} && ($DAY{$_} = ''); print "<td bgcolor=#C0C0F0 align=right>$DAY{$_}</td>\n"; } print "<td bgcolor=#C0C0F0 align=right>$total</td>\n"; print "</tr>\n"; print "</table>\n"; print "</td></tr></table>\n"; print "</td></tr></table>\n"; } else { if (open(DB, $filename)) { undef @ACCESS; while (<DB>) { ($day, $when, $host, $referrer, $page) = split(/\t/, $_); $day = sprintf("%02d", $day); $value = join("\t", $day, $when, $host, $referrer, $page); push(@ACCESS, $value); } close(DB); } $max = 0; $total = 0; foreach (1 .. $days) { $day = sprintf("%02d", $_); @COUNT = grep(/^$day\t/, @ACCESS); @COUNT > $max && ($max = @COUNT); if ($_ == 1) { $min = @COUNT; } @COUNT < $min && ($min = @COUNT); $gtotal += @COUNT; } print "<table border=0><tr>\n"; print "<td><select name=date size=1>\n"; foreach (@FILES) { if ($INIT{'dbtype'}) { /^(.+)\.db$/; $date = $1; } else { /^(.+)\.tdb$/; $date = $1; } if ($QUERY{'date'} eq $date) { $selected = ' selected'; } else { $selected = ''; } print "<option$selected value=\"$date\">$date</option>\n"; } print "</select></td>\n"; print "<td><input type=button value='再表\示' onclick=\"location.href='webaccess.cgi?pw=$QUERY{'pw'}&action=view&date='+this.form.date.options[this.form.date.selectedIndex].value\"></td>\n"; print "</tr></table>\n"; print "<table border=0 cellspacing=0 cellpadding=0><tr><td id=printdoc>\n"; print "<table border=0 cellpadding=0><tr><td bgcolor=#708090>\n"; print "<table border=0 cellspacing=1 cellpadding=1>\n"; print "<tr><td align=center bgcolor=#C0C0F0 colspan=", $days + 1, " id=printtitle>$year 年 $month 月</td></tr>\n"; print "<tr>"; print "<td align=center bgcolor=#C0C0F0 height=320>\n"; print "<table border=0 cellspacing=0 cellpadding=0 height=320>\n"; print "<tr><td align=right valign=top><nobr> $max -</td></tr>\n"; print "</table>\n"; print "</td>\n"; $weekday = $week; foreach (1 .. $days) { print "<td align=center bgcolor=#FFFFFF height=320 valign=bottom style='FONT-SIZE:9px'>"; $day = sprintf("%02d", $_); @COUNT = grep(/^$day\t/, @ACCESS); $count = @COUNT; if ($weekday > 6 ) { $weekday = 0; } if ($weekday == 0) { $image = 'images/redbar.gif'; } elsif ($weekday == 6) { $image = 'images/bluebar.gif'; } else { $image = 'images/greenbar.gif'; } if ($count && $max) { $height = $count / $max * 310; print "<nobr>$count</nobr><br>"; print "<img src=$image width=17 height=$height>"; } print "</td>\n"; $weekday++; } print "</tr>\n"; print "<tr>"; print "<td align=center bgcolor=#C0C0F0 rowspan=2>日付</td>\n"; foreach (1 .. $days) { print "<td align=center bgcolor=#C0C0F0><nobr>$_</nobr></td>\n"; } print "</tr>\n"; print "<tr>"; foreach (1 .. $days) { if ($week > 6 ) { $week = 0; } if ($week == 0) { $bgcolor = '#FF9090'; } elsif ($week == 6) { $bgcolor = '#9090FF'; } else { $bgcolor = '#C0C0F0'; } print "<td align=center bgcolor=$bgcolor width=24><nobr>$WEEK[$week]</nobr></td>\n"; $week++; } print "</tr>\n"; print "</table>\n"; print "</td></tr></table>\n"; print "</td></tr></table>\n"; } print " </form> </td> </table> </td></tr></table> </body></html> "; exit; } # リンク先の取得と書式の検査 # 無効な文字は取り除く $QUERY{'referrer'} =~ s/eq;/=/g; $QUERY{'referrer'} =~ s/[\t\n\0]//g; # 完全に表示する前に次のリンクをクリックされると # 正確なリンク先情報が取得できないので無効にする # 検索エンジンのキーワードも削除する $QUERY{'referrer'} =~ s/^http:\/\///; $QUERY{'referrer'} =~ /referrer/i && ($QUERY{'referrer'} = ''); ($QUERY{'referrer'}, $dummy) = split(/\?/, $QUERY{'referrer'}); ($QUERY{'referrer'}, $dummy) = split(/\#/, $QUERY{'referrer'}); if ($acquisition) { $page = $ENV{'HTTP_REFERER'}; } else { $page = $QUERY{'page'}; } $page =~ s/http:\/\///i; (!$page || $page eq $INIT{'usersite'} || $page !~ /^$INIT{'usersite'}/i || $page =~ /referrer/i) && ($page = "$INIT{'usersite'}/"); $page =~ /#/ && (($page, $dummy) = split(/#/, $page)); $page =~ s/$INIT{'defaultindex'}$//; # # アクセス統計の記録 # $host = domain(1); $host =~ s/\*\.//; if ($QUERY{'referrer'} =~ /^$usersite/) { # 自分のサイト内からのリンクは記録しない $check = 1; } else { $check = 0; } if (!$check) { # 記録しないバックリンクをチェック # 同一サイト内のリンクは解析の意味がない foreach (@NONSITE) { if ($QUERY{'referrer'} =~ /$_/i) { $check = 1; last; } } } if (!$check) { # バックリンクに問題がなければ接続ホストをチェック # 更新中など、ローカルからのアクセスは解析の意味がない foreach (@NONHOST) { if ($host =~ /$_/i) { $check = 1; last; } } } # デモ版は記録しない #$check = 1; if (!$check) { # 指定のバックリンク、ホスト以外ならアクセスを記録 $when = sprintf("%02d", $when); $QUERY{'cm'} && ($cm = "cm=$QUERY{'cm'}"); $value = join("\t", $day, $when, $host, $QUERY{'referrer'}, $page, $cm, "\n" ); if (!dblock($filename)) { # flock だけでは効果が低い為、link によるファイルロック # 10秒以内に他のプロセスが解除しなければファイルを守る為 # このアクセスを記録しない。(Windowsサーバでは効果薄) if (open(DB, ">>$filename")) { flock(DB, 2); print DB $value; flock(DB, 8); close(DB); } # ロック解除 dbunlock($filename); } } print "Content-type: image/gif\n\n"; open(IMG,"$image"); binmode(IMG); binmode(STDOUT); print $_ while (<IMG>); close(IMG); exit; sub htmlhead { print "Content-type: text/html\n\n"; print "<html> <head> <meta http-equiv=\"Content-Type\" content=\"text/html; charset=shift_jis\"> <meta http-equiv=\"Content-Language\" content=\"ja\"> <link rel=\"stylesheet\" href=\"control.css\" type=\"text/css\"> <title>Control Panel "; } sub chrchange { local($_, $flag) = @_; if ($flag) { s/\?/&que;/g; s/\+/ /g; s/\(/(/g; s/\)/)/g; } else { s/&que;/\?/g; s/ /\+/g; s/(/\(/g; s/)/\)/g; } $_; }