#!/usr/local/bin/perl
# 再訪問チェック付き画像合成型アクセスカウンタ vers. 1.01
# (c)rescue.ne.jp
#
# Last Update at 20/Jul/1999
# 設置手順
# 1. 画像合成インターフェース fly を別途用意する
# 2. 0から9までの数字画像とエラー画像を用意する
# 3. 配置通り設定後、各ファイルを設置する
# 画像(エラー画像も含む)は直接表示されないので、WWWから見えない場所やCGIしか認識しない場所に置いてもOK.
#
# |
# |-- index.html(カウンタを表示する任意のHTMLファイル)
# | この構成の場合は
と書く.
# |
# |--/counter
# |
# |--/data (777)
# | |
# | |-- count.dat (666)
# |
# |-- 0.gif
# |-- 0s.gif
# |-- 1.gif
# |-- 1s.gif
# |-- 略
# |-- error.gif
# |-- none.gif
# |-- imgcke.cgi (755) ( )はパーミッション値
# |-- fly (755)
#
# 4. パーミッションを設定する(このCGIとデータディレクトリ)
#-- 設定(共通) --#
#このカウンタを付けるページの場所(URL)
$reload = 'http://www.xxx.jp/~user/';
#画像合成インターフェースの場所(パス) 例/このCGIと同じ場所の場合:'./fly'
$flyprog = './fly';
#累計用記録ファイル名
$cfile = 'count.dat';
#データディレクトリ 例/このCGIのある場所の下のディレクトリの場合:'./data'
$tmp = './data';
#合成元数字画像の場所(パス) 例/このCGIと同じ場所の場合:'.'
$digit_dir = '.';
#同日再訪問者のカウント (0:する 1:しない)
$cookie = 1;
#知らないところから起動されるのを防止 (0:しない 1:する)
$ref_check = 1;
#-- 設定(累計用) --#
#合成元画像1つのサイズ(x:幅 y:高さ) 単位:ピクセル
$width = 15; $height = 20;
#表示桁数(カウント数1234の場合に6桁に設定すると001234となる)
$wd = 1;
#表示画像を透過GIFにする (0:しない 1:する)
$transparent = 0;
#透過GIFにする場合に透過させる色(R,G,B)
$transparent_color = '0,0,0';
#表示画像をインターレス表示にする (0:しない 1:する)
$interlace = 1;
#-- 設定(本日/昨日用) --#
#本日/昨日用画像に付ける識別文字 例/ 0.gif <-> 0s.gif
$small = 's';
#合成元画像1つのサイズ(x:幅 y:高さ) 単位:ピクセル
$width2 = 10; $height2 = 16;
#表示桁数(カウント数1234の場合に6桁に設定すると001234となる)
$wd2 = 1;
#表示画像を透過GIFにする (0:しない 1:する)
$transparent2 = 0;
#透過GIFにする場合に透過させる色(R,G,B)
$transparent_color2 = '0,0,0';
#表示画像をインターレス表示にする (0:しない 1:する)
$interlace2 = 1;
#-----------------------------------------------------------------------------------------------
#処理
if ($ref_check) {
$ref = $ENV{'HTTP_REFERER'};
$ref =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
if (!($ref =~ /$reload/i)) { &error; }
}
#ログ(一昨日分)を削除
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time - 48*60*60);
$log = sprintf("%02d%02d",$mon +1,$mday);
$log = $tmp . "/$log" . '.dat';
unlink("$log");
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$log = sprintf("%02d%02d",$mon +1,$mday);
$log = $tmp . "/$log" . '.dat';
$CMD = $ENV{'QUERY_STRING'};
if ($CMD eq 'yesterday') {
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time - 24*60*60);
$log = sprintf("%02d%02d",$mon +1,$mday);
$log = $tmp . "/$log" . '.dat';
&log;
}
elsif ($CMD eq 'today') {
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$log = sprintf("%02d%02d",$mon +1,$mday);
$log = $tmp . "/$log" . '.dat';
&log;
}
else { &write_log; $small = ''; ℑ }
exit;
sub log { #-------------------------------------------------------------------------------
if (!-e $log) { &error(none); }
$count = -s $log;
$width = $width2;
$height = $height2;
$wd = $wd2;
$transparent = $transparent2;
$transparent_color = $transparent_color2;
$interlace = $interlace2;
ℑ
}
sub write_log { #-------------------------------------------------------------------------------
$cfile = $tmp . "/$cfile";
if ($cookie) { &cookie; }
if ($CC eq '' || $CC != $mday) {
if (!open(OUT,">>$cfile")) { &error; }
print OUT "\n";
close(OUT);
if (!open(OUT,">>$log")) { &error; }
print OUT "\n";
close(OUT);
chmod(0666,$log);
if ($cookie) { print "Set-Cookie: $reload=$mday; expires=$date_gmt\n"; }
}
$count = -s $cfile;
}
sub image { #-----------------------------------------------------------------------------------
$cl = length($count);
if ($cl < $wd) { $zero = '0' x ($wd - $cl); $xxx = $count = "$zero$count"; }
$num = $length = length($count);
while ($num > 0) { $CHAR{$num} = chop($count); $num--; }
$img_width = ($width * $length);
$img_height = $height;
$infile = $tmp . "/fly.$$";
open(FLY,"> $infile");
print FLY "new\n";
print FLY "size $img_width,$img_height\n";
$insert_frame = $insert_width = $insert_height = 0;
while ($insert_frame < 0) {
$current_width = ($img_width - $insert_frame);
$current_height = ($img_height - $insert_frame);
print FLY "line 0,$insert_frame,$img_width,$insert_frame\n";
print FLY "line $insert_frame,0,$insert_frame,$img_height\n";
print FLY "line $current_width,0,$current_width,$img_height\n";
print FLY "line $current_height,0,$current_height,$img_width\n";
$insert_frame++;
}
$j = 1;
while ($j <= $length) {
# Reference = http://worldwidemart.com/scripts/
print FLY "copy $insert_width,$insert_height,-1,-1,-1,-1,$digit_dir/$CHAR{$j}$small\.gif\n";
$insert_width = ($insert_width + $width);
$j++;
}
if ($transparent) { print FLY "transparent $transparent_color\n"; }
if ($interlace) { print FLY "interlace\n"; }
close(FLY);
print "Content-type: image/gif\n\n";
open(FOO,"$flyprog -q -i $infile |");
while() { print; }
close(FOO);
unlink($infile);
}
sub cookie {
($secg,$ming,$hourg,$mdayg,$mong,$yearg,$wdayg,$ydayg,$isdstg) = gmtime(time + 24*60*60);
$y0="Sunday"; $y1="Monday"; $y2="Tuesday"; $y3="Wednesday"; $y4="Thursday"; $y5="Friday"; $y6="Saturday";
$m0="Jan"; $m1="Feb"; $m2="Mar"; $m3="Apr"; $m4="May"; $m5="Jun"; $m6="Jul"; $m7="Aug"; $m8="Sep"; $m9="Oct"; $m10="Nov"; $m11="Dec";
@youbi = ($y0,$y1,$y2,$y3,$y4,$y5,$y6);
@monthg = ($m0,$m1,$m2,$m3,$m4,$m5,$m6,$m7,$m8,$m9,$m10,$m11);
$date_gmt = sprintf("%s\, %02d\-%s\-%04d %02d:%02d:%02d GMT",$youbi[$wdayg],$mdayg,$monthg[$mong],$yearg +1900,$hourg,$ming,$secg);
@pairs = split(/;/,$ENV{'HTTP_COOKIE'});
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$name =~ s/ //g;
$COOKIE{$name} = $value;
}
$CC = $COOKIE{$reload};
}
sub error { #-----------------------------------------------------------------------------------
if ($_[0] eq 'none') { $errimg = 'none.gif'; }
else { $errimg = 'error.gif'; }
$file = $digit_dir . "/$errimg";
print "Content-type: image/gif\n\n";
open(FOO,$file);
while() { print; }
close(FOO);
exit;
}