#!/usr/bin/perl -- # ライブラリ require "gifcat.pl"; # 記録ファイル(カウント) $logfile = 'daycount_in.dat'; # 記録ファイル(REFERER) $reflogfile = 'referer_in.dat'; # 画像ファイル $imgfile = "18.gif"; # ドメイン $domain = "impact-net.jp"; # IPアドレスの二重カウントチェック # 0 : チェックしない # 1 : チェックする $ip_check = 1; # クエリストリング $query = $ENV{'QUERY_STRING'}; $addr = $ENV{'REMOTE_ADDR'}; $query =~ s/\%3A/:/g; # 日時を取得 $ENV{'TZ'} = "JST-9"; $now = time(); $past = int( ($now + 32400) / 86400 ); ($sec,$min,$hour,$mday,$mon,$year,$wday,$stime) = localtime($now); $year += 1900; $mon ++; $datestring = $year."/".sprintf("%02d",$mon)."/".sprintf("%02d",$mday)."-".sprintf("%02d",$hour).":".sprintf("%02d",$min).".".sprintf("%02d",$sec); # カウント・記録処理 $key = $yes = $today = $count = $ip = ""; # REFERERチェック if ( !($query =~ /$domain/) ) { if ( -e $logfile ) { # 記録ファイルから読み込み open DATA, "+<".$logfile || &error("LK"); flock ( DATA, 2 ); $data = ; ($key,$yes,$today,$count,$ip) = split(/<>/, $data); if ( !$ip_check || $addr ne $ip) { # 連続アクセスではなく、処理あり # カウントアップ! $count++; if ($key eq "$mday") { # 日変りではない場合 $today++; $data = "$mday<>$yes<>$today<>$count<>$addr"; seek ( DATA, 0, 0 ); print DATA $data; truncate( DATA, tell(DATA) ); close DATA; } else { # 日変りの場合 $yes = $today; $today = 1; $data = "$mday<>$yes<>$today<>$count<>$addr"; seek ( DATA, 0, 0 ); print DATA $data; truncate( DATA, tell(DATA) ); close DATA; # 月別蓄積ファイルに書き込み # 前日の日付を取得 ($year, $mon, $yesterday, $yweek) = &countDate( ($past - 1) ); # 蓄積ファイル名と蓄積データの生成 $monthfile = $year.sprintf("%02d", $mon)."_in.dat"; $data = $yesterday."<>".$yes."\n"; if ( -e $monthfile ) { # 初回・月変りではない場合 open ARCH, ">>".$monthfile; } else { # 初回・月変りの場合 open ARCH, ">".$monthfile; chmod 0666,$monthfile; } flock ( ARCH, 2 ); print ARCH $data; close ARCH; } # REFERERファイルに記録 if ( $query ne "" && $query !~ /$domain/ ) { $data = $datestring."<>".$query."\n"; if ( -e $reflogfile ) { open REF, ">>".$reflogfile; } else { open REF, ">".$reflogfile; chmod 0666,$reflogfile; } flock ( REF, 2 ); print REF $data; close REF; } } else { # 連続アクセス!処理なし close DATA; } } else { # 記録ファイルに初回書き込み $data = "$mday<>0<>1<>1<>$addr"; open DATA, ">".$logfile || &error("LK"); chmod 0666,$logfile; flock ( DATA, 2 ); print DATA $data; close DATA; # REFERERファイルに記録 if ( $query ne "" && $query !~ /$domain/ ) { $data = $datestring."<>".$query."\n"; if ( -e $reflogfile ) { open REF, ">>".$reflogfile; } else { open REF, ">".$reflogfile; chmod 0666,$reflogfile; } flock ( REF, 2 ); print REF $data; close REF; } } } # 画像表示 print "Content-type: image/gif\n\n"; binmode( STDOUT ); print &gifcat'gifcat( $imgfile ); exit; #--------------# # エラー処理 # #--------------# sub error { @err_gif = ('47','49','46','38','39','61','2d','00','0f','00','80','00','00','00','00','00','ff','ff','ff','2c', '00','00','00','00','2d','00','0f','00','00','02','49','8c','8f','a9','cb','ed','0f','a3','9c','34', '81','7b','03','ce','7a','23','7c','6c','00','c4','19','5c','76','8e','dd','ca','96','8c','9b','b6', '63','89','aa','ee','22','ca','3a','3d','db','6a','03','f3','74','40','ac','55','ee','11','dc','f9', '42','bd','22','f0','a7','34','2d','63','4e','9c','87','c7','93','fe','b2','95','ae','f7','0b','0e', '8b','c7','de','02','00','3b'); print "Content-type: image/gif\n\n"; foreach (@err_gif) { $data = pack('C*',hex($_)); print $data; } exit; } sub countDate { my @arg = @_; #年月日を取り出し my @date = localtime( ($arg[0]*86400)+43200 ); $date[5] += 1900; $date[4] ++; return ( $date[5], $date[4], $date[3], $date[6] ); }