#!/usr/local/bin/perl # 定義 # データファイルへのパス(CGIからの相対パス) my $passCKN = "./"; # 戻り先制限(複数指定可) my @urlOK = ( "http://shop-h.hp.infoseek.co.jp/", "http://blog.livedoor.jp/hya701/" ); #アクセスログを記録する(する場合は1、しない場合は0) my $Analysis = 1; # ここまで定義 # キリ番設定(隠し機能) my %kiri = ( # "index" => "http://blog.livedoor.jp/hya701/ 0000", # "ura" => "http://shop-h.hp.infoseek.co.jp/ 000" ); # ID、戻り先受け取り (my $key, my $adrReturn, my $adrReferrer) = split (",", $ENV{'QUERY_STRING'}); # 戻り先確認 my $i = 0; while (1) { unless (defined ($urlOK[$i])) { if ($adrReturn ne "update") {&Error ("戻り先指定が不正です。");} last; } if (substr ($adrReturn, 0,length ($urlOK[$i])) eq $urlOK[$i]) { last; } $i++; } my $thisAccess = int((time + 32400) / 86400); my $getCount; my $error = "指定されたIDが見つかりませんでした。\n"; if ($adrReturn eq "update") {$error = "";} # 各データファイルへのパス設定(ファイル名を変更するときはここを) my $passJSData = $passCKN . "CKN2Data.js"; # JavaScriptデータファイル my $passBack = $passCKN . "CKN2Back.cgi"; # バックアップファイル my $passLog = $passCKN . "CKN2Log.cgi"; # アクセスログファイル my $passCheck = $passCKN . "tmp$key.html"; # JavaScriptデータファイル更新チェック用HTML # データファイルオープン open (F, "+<", $passJSData) or &Error ("データファイルをオープンできませんでした。"); flock (F, 2); # データ読み込み my @data = split ("\t", ); my $F = 1; my $lastAccess = $data[$F++]; my $days = $thisAccess - $lastAccess; if ($days < 0) {$days = 0;} my @id = (); my @countTotal = (); my @countDate = (); # ここからデータ処理ループ while (1) { unless (defined ($data[$F])) { $error = "データファイルに異常があります。"; last; # データの異常終了 } if ($data[$F] eq "*/") { last; # データ終了 } (my $id, my $countTotal, my $countDate) = split (" ", $data[$F++]); my @count = split ("-", $countDate); my $countP = 0; if ($id eq $key) { $countP = 1; $countTotal++; $getCount = $countTotal; $error = ""; } for (my $i = 7; $i >= 0; $i--) { if (($i - $days) >= 0){ $count[$i] = $count[$i - $days]; } else { $count[$i] = 0; } } $count[0] += $countP; $countDate = join ("-", @count); push (@id, $id); push (@countTotal, $countTotal); push (@countDate, $countDate); } # ここまでデータ読み込みループ if ($error ne "") { # 異常終了、または当該データ無し close (F) or $error .= "
データファイルをクローズできませんでした。"; &Error ($error); } # データ読み込み終了 # データ書き込み truncate (F, 0); seek (F, 0, 0); print F "/*\t"; print F "$thisAccess\t"; # ここからデータ書き込みループ for (my $i = 0; $i <= $#id; $i++) { print F "$id[$i] $countTotal[$i] $countDate[$i]\t"; } # ここまでデータ書き込みループ print F "*/\t"; # データ書き込み終了 # JSソース書き出し print F "var date = $thisAccess;\t"; print F "var idName = new Array(); var t = new Array(); var c = new Array(); "; for (my $i = 0; $i <= $#id; $i++) { print F "idName[$i] = '$id[$i]'; "; print F "t['$id[$i]'] = $countTotal[$i]; "; print F "c['$id[$i]'] = new Array(); "; my @count = split ("-", $countDate[$i]); for (my $j = 0; $j <= 7; $j++) { print F "c['$id[$i]'][$j] = $count[$j]; "; } } # JSソース書き出し終了 # データファイル更新終了 # データファイルクローズ close (F) or &Error ("データファイルをクローズできませんでした。"); # バックアップログ作成 open (F, "+<", $passBack) or &Error ("バックアップログファイルをオープンできませんでした。"); flock (F, 2); truncate (F, 0); seek (F, 0, 0); print F "/*\t"; for (my $i = 0; $i <= $#id; $i++) { print F "$id[$i] $countTotal[$i] $countDate[$i]\t"; } print F "*/\t"; close (F) or &Error ("バックアップログファイルをクローズできませんでした。"); # バックアップログ作成完了 if ($adrReturn eq "update") {&Error ("データファイルを更新しました。");} # アクセスログ記録 if ($Analysis) { $time = localtime(time); if (-e $passLog) { open (F, "+<", $passLog) or &Error ("アクセスログファイルをオープンできませんでした。"); } else { open (F, ">", $passLog) or &Error ("アクセスログファイルを作成できませんでした。"); } flock (F, 2); seek (F, 0, 2); print F "$key\t$time\t$adrReferrer\n"; close (F) or &Error ("アクセスログファイルをクローズできませんでした。"); } # アクセスログ記録完了 # キリ番処理 if (defined($kiri{$key})) { $getCount .= ""; my @kiri = split (" ", $kiri{$key}); for (my $i = 1; $i <= $#kiri; $i++) { if (substr ($getCount, -length ($kiri[$i])) eq $kiri[$i]) { print "Location: $kiri[0]\n\n"; exit; } } } # 正常終了 my $HTML = <   END_OF_DATA # JavaScript更新チェック用ファイル作成 if (-e $passCheck) { open (F, "+<", $passCheck) or &Error ("avaScript更新チェック用ファイルをオープンできませんでした。"); } else { open (F, ">", $passCheck) or &Error ("avaScript更新チェック用ファイルを作成できませんでした。"); } flock (F, 2); truncate (F, 0); seek (F, 0, 0); print F "$HTML"; close (F) or &Error ("JavaScript更新チェック用ファイルをクローズできませんでした。"); # JavaScript更新チェック用ファイル作成完了 print "Location: $passCheck\n\n"; exit; # おわり # エラー処理 sub Error { print "Content-type: text/html; charset=euc_jp\n\n"; print < カウンタっくん:エラー
*エラー*
・・・$_[0]
戻る
END_OF_DATA exit; }