#!/usr/bin/perl ## ↑この行には、「PerlのPATH」を指定してください。プロバイダごと ## によって設定は異なります。 ## showref.cgi ## referer表示用CGIスクリプト ## 2002-03-27 v0.5 by Maki. ## 設定 ############################################################### ## 以下の設定は環境に合わせて変更してください。 my $REFERERDIR = '../refdir/'; ## refererログ用ディレクトリ my $LOCKDIR = '../lockdir/'; ## ロック用ディレクトリ my $IGNOREPATTERN = 'rubycolor.org/maki/'; ## 無視したいURLのパターン ## 以下の設定は変更しなくて構いません。 my $LOCKFILE = "referer"; ## ロック用ファイル my $OFFSETHOUR = +9; ## 時差設定用オフセット ## 関数 ############################################################### ## 以下の2つはPerlメモ(http://www.din.or.jp/~ohzaki/perl.htm)より。 ## ロックする sub my_flock { my %lfh = (dir => './lockdir/', basename => 'lockfile', timeout => 60, trytime => 10, @_); $lfh{path} = $lfh{dir} . $lfh{basename}; for (my $i = 0; $i < $lfh{trytime}; $i++, sleep 1) { return \%lfh if (rename($lfh{path}, $lfh{current} = $lfh{path} . time)); } opendir(LOCKDIR, $lfh{dir}); my @filelist = readdir(LOCKDIR); closedir(LOCKDIR); foreach (@filelist) { if (/^$lfh{basename}(\d+)/) { return \%lfh if (time - $1 > $lfh{timeout} and rename($lfh{dir} . $_, $lfh{current} = $lfh{path} . time)); last; } } undef; } ## ロックを解除する sub my_funlock { rename($_[0]->{current}, $_[0]->{path}); } ## 現在年月日を時差つきで生成する sub nowdate2str { my $offset_hour = shift; my $offset_day = 0; my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = gmtime(time+($offset_hour*60*60)-($offset_day*60*60*24)); return sprintf("%04d%02d%02d", 1900+$year,1+$mon,$mday); } ## HTMLのエスケープを行う sub htmlesc { my $str = shift; $str =~ s/&/&/; $str =~ s//>/; $str =~ s/"/"/; #" return $str; } ## 指定されたログファイルのREFERERを読み取る sub read_referer { my $reflog = shift; my %count = (); open(F, $reflog); my @line = ; close(F); foreach (@line) { chop; next if /^\s*$/; ## 空行は無視 next if /referer/; ## 「referer」の文字列も無視 next if /$IGNOREPATTERN/; ## 指定したパターンを無視 s/\#.*$//; ## fragmentは捨てる s/\?\d+$//; ## ?(数値列) も捨てる $count{$_} += 1; } return \%count; } sub write_count { my $count = shift; print "REFERER: |"; foreach $item (sort {$$count{$b} <=> $$count{$a}} keys %$count) { print ''; print $$count{$item}; print '|'; } print "\n"; } ### main my $lfh = my_flock(basename => $LOCKFILE, dir => $LOCKDIR) || die("busy!"); my $reflog = $REFERERDIR.nowdate2str($OFFSETHOUR).".log"; my $count = read_referer($reflog); write_count($count); my_funlock($lfh);