#!/usr/local/bin/perl5.8 -w
#┌─────────────────────────────────
#│ CUPID COUNTER v1.3 (2007/07/19)
#│ Copyright (c) KentWeb
#│ webmaster@kent-web.com
#│ http://www.kent-web.com/
#└─────────────────────────────────
$ver = 'CupidCounter v1.3';
#┌─────────────────────────────────
#│ [注意事項]
#│ 1. このスクリプトはフリーソフトです。このスクリプトを使用した
#│ いかなる損害に対して作者は一切の責任を負いません。
#│ 2. 設置に関する質問はサポート掲示板にお願いいたします。
#│ 直接メールによる質問は一切お受けいたしておりません。
#└─────────────────────────────────
#
# [ ディレクトリ構成例 ]
#
# public_html / index.html (ホームディレクトリ)
# |
# +-- cupid / cupid.cgi [705]
# | cupid.js [606]
# | gifcat.pl [604]
# |
# +-- gif / 0.gif, 1.gif, ..... 9.gif
# |
# +-- lock [707] /
#
# [ タグの書き方の例 ]
#
# 総カウント数
#
#
# 本日・昨日のカウント数
#
#
#
# *チェックのしかた (ブラウザから最後に ?check をつけて呼出す)
# http://〜〜/cupid.cgi?check
#-------------------------------------------------
# 設定項目
#-------------------------------------------------
# 画像連結ライブラリ取り込み
require './gifcat.pl';
# ログファイル
$logfile = './cupid.js';
# GIF画像ディレクトリ
# → 最後は / で閉じる
$gifdir = './gif/';
# GIFカウンタの桁数
$digit = 6;
# 二重カウント防止機能 (0=no 1=yes)
# → 直前のIPアドレスをチェックし同一のIPであればカウントしない
$ip_chk = 0;
#-------------------------------------------------
# 設定完了
#-------------------------------------------------
# テストモード
if ($ENV{'QUERY_STRING'} eq "check") { &CheckMode; }
# 日を取得
$ENV{'TZ'} = "JST-9";
$mday = (localtime(time))[3];
# IPアドレスを取得
$addr = $ENV{'REMOTE_ADDR'};
# データ読み取り
open(DAT,"+< $logfile") || &error;
eval "flock(DAT, 2);";
$data = ;
# データ分解
if ($data =~ /D\='(\d{0,2}):?([^\']*)';C\='(\d*)';Y\='(\d*)';T\='(\d*)';/) {
$day = $1;
$ip = $2;
$all = $3;
$yes = $4;
$tod = $5;
} else {
close(DAT);
&error;
}
# カウントアップ
unless ($ip_chk && $addr eq $ip) {
# 累計アップ
$all++;
# 日は同じ
if ($mday == $day) {
$tod++;
$data = "D='$day:$addr';C='$all';Y='$yes';T='$tod';";
# 日が違う場合
} else {
$data = "D='$mday:$addr';C='$all';Y='$tod';T='0';";
}
# 更新
seek(DAT, 0, 0);
print DAT $data;
truncate(DAT, tell(DAT));
}
close(DAT);
# 画像出力
while (length($all) < $digit) { $all = '0' . $all; }
@image = ();
foreach ( split(//, $all) ) {
push(@image,"$gifdir$_\.gif");
}
print "Content-type: image/gif\n\n";
binmode(STDOUT);
print &gifcat'gifcat(@image);
exit;
#-------------------------------------------------
# エラー処理
#-------------------------------------------------
sub error {
local($data,@err);
# エラー画像
@err = (
'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) {
$data = pack('C*',hex($_));
print $data;
}
exit;
}
#-------------------------------------------------
# チェックモード
#-------------------------------------------------
sub CheckMode {
print "Content-type: text/html\n\n";
print <
$ver
Check Mode
EOM
# ログファイルのパス確認
if (-e $logfile) { print "- ログファイルのパス : OK!\n"; }
else { print "
- ログファイルがありません\n"; }
# ログファイルのパーミッション
if (-r $logfile && -w $logfile) {
print "
- ログファイルのパーミッション : OK!\n";
} else {
print "
- ログファイルのパーミッションが不正です\n";
}
# 画像ディレクトリのパス確認
if (-d $gifdir) { print "
- gifディレクトリのパス : OK!\n"; }
else { print "
- gifディレクトリのパスが不正です → $gifdir\n"; }
# 画像チェック
$flag=0;
foreach (0 .. 9) {
if (-e "$gifdir$_\.gif") {
print "
- 画像OK → $_\.gif";
} else {
print "
- 画像NG → $_\.gif";
}
}
# 著作権表示:削除禁止
print <