#!/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; }