#!/usr/local/bin/perl #┌───────────────────────────────── #│ Random Image v1.4 (2002/08/02) #│ Copyright(C) Kent Web 2002 #│ webmaster@kent-web.com #│ http://www.kent-web.com/ #└───────────────────────────────── $ver= 'Random Image v1.4'; #┌───────────────────────────────── #│ [注意事項] #│ 1. このスクリプトはフリーソフトです。このスクリプトを使用した #│ いかなる損害に対して作者は一切の責任を負いません。 #│ 2. 設置に関する質問はサポート掲示板にお願いいたします。 #│ 直接メールによる質問は一切お受けいたしておりません。 #└───────────────────────────────── # # [設置例] # # public_html / index.html ... (ホームディレクトリ) # | # +-- random / random.cgi [755] # | random.dat [666] # | randmgr.cgi [755] # | # +-- img / abc.gif, def.gif, ... (画像バナー) # | # +-- lock [777] / # # # [動作簡易チェック方法] # # htp://~~/random.cgi?mode=check # # # [タグの記述方法] # # # # # 注1:実際には改行せずに1行で記述して下さい。 # 注2:同一ページに複数設置する場合には、no=1 の部分を、それぞれ # 2個所とも no=2 no=3 no=4 .... というように変更していって # 下さい。 # (2個目の記述例) # # # #============# # 設定項目 # #============# # ログファイル $logfile = './random.dat'; # 画像ディレクトリのサーバパス (フルパスだと / から記述) # → 最後は必ず / で閉じる $img_dir = "./img/"; # 画像ディレクトリをURLパス表示 (フルパスだと http:// から記述) # → 最後は必ず / で閉じる $img_url = "./img/"; # 画像ファイルとそれに対応したURLを「ペア」で指定 # 1) それぞれ "バナーファイル名", "そのURL" というパターンで記述 # 2) バナー画像は GIFファイルと JPEGファイルのみ %target = ( # "oki_b.gif", "http://www2.odn.ne.jp/~aeg12730/reliab/index.htm", # "top_kinki.gif", "http://www.atengineer.com/cc.nsf/o?open&co=8eydfc", "bnr_metek.gif", "http://www.atengineer.com/cc.nsf/o?open&co=308439", # "suntelecom_top.gif", "http://www.atengineer.com/cc.nsf/o?open&co=8k4ahj", # "suntelecom_top_02.gif", "http://www.atengineer.com/cc.nsf/o?open&co=8k4ahj", # "embannar.gif", "http://www.atengineer.com/news.nsf/topnews" ); # ファイルロック機構 # 0 : しない # 1 : する (symlink関数式) # 2 : する (mkdir関数式) $lockkey = 0; # ロックファイル $lockfile = './lock/random.lock'; #============# # 設定完了 # #============# # 連想配列のキーを取得 @keys = keys(%target); # デコード処理 $buf = $ENV{'QUERY_STRING'}; @buf = split(/&/, $buf); foreach (@buf) { local($key, $val) = split(/=/); $val =~ tr/+/ /; $val =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $val =~ s/&//g; $val =~ s/"//g; $val =~ s///g; $val =~ s/\0//g; $val =~ s/\r//g; $val =~ s/\n//g; $in{$key} = $val; } $in{'no'} =~ s/\D//g; if ($in{'mode'} eq "check") { ✓ } elsif ($in{'mode'} eq "link") { &location; } # ランダム処理 srand; $num = int(rand(@keys)); # 結果(画像)を定義 $image = $keys[$num]; # クッキーIDを定義 if ($in{'no'} eq "") { $in{'no'} = 1; } $cookie_id = "RandImage" . $in{'no'}; # クッキー情報を格納 &set_cookie; # 画像ファイル種類を識別 if ($image =~ /.+\.(\w)$/) { $tail = $1; } if ($tail =~ /^jpe?g$/i) { $tail = 'jpeg'; } elsif ($tail eq "png") { $tail = "png"; } else { $tail = 'gif'; } # 画像を表示 print "Content-type: image\/$tail\n"; #print "Cache-Control: no-cache\n"; #print "Expires: 01/01/1970 00:00:00 GMT\n"; print "\n"; open(GIF,"$img_dir$image") || &error; binmode(GIF); binmode(STDOUT); print ; close(GIF); exit; #------------------# # クッキーの発行 # #------------------# sub set_cookie { # クッキーは60日間有効 ($secg,$ming,$hourg,$mdayg,$mong,$yearg,$wdayg) = gmtime(time +60*24*60*60); @month = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'); @week = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat'); $date_gmt = sprintf("%s, %02d-%s-%04d %02d:%02d:%02d GMT", $week[$wdayg],$mdayg,$month[$mong],$yearg+1900,$hourg,$ming,$secg); $cook = "image\:$image"; print "Set-Cookie: $cookie_id=$cook; expires=$date_gmt\n"; } #------------------# # クッキーを取得 # #------------------# sub get_cookie { local($key, $val, @pairs); @pairs = split(/;/, $ENV{'HTTP_COOKIE'}); foreach (@pairs) { ($key, $val) = split(/=/); $key =~ s/\s//g; $tmp{$key} = $val; } @pairs = split(/,/, $tmp{$cookie_id}); foreach (@pairs) { ($key, $val) = split(/:/); $ck{$key} = $val; } $c_image = $ck{'image'}; } #---------------------# # 目的URLへジャンプ # #---------------------# sub location { # クッキーを取得 $cookie_id = "RandImage" . $in{'no'}; &get_cookie; if ($c_image eq "") { &banner_view; } # ロック開始 &lock if ($lockkey); # カウントファイル読み込み open(IN,"$logfile") || &error("Open Error : $logfile"); @lines = ; close(IN); # ログをマッチングしカウントアップ @new=(); $flag=0; foreach (@lines) { ($img,$count) = split(/<>/); if ($c_image eq "$img") { $flag=1; $count++; $_ = "$img<>$count<>\n"; } push(@new,$_); } if (!$flag) { push(@new,"$c_image<>1<>\n"); } # 更新 open(OUT,">$logfile") || &error("Write Error : $logfile"); print OUT @new; close(OUT); # ロック解除 &unlock if ($lockkey); # 目的のURLへジャンプ if ($ENV{'PERLXS'} eq "PerlIS") { print "HTTP/1.0 302 Temporary Redirection\r\n"; print "Content-type: text/html\n"; } print "Location: $target{$c_image}\n\n"; exit; } #--------------# # バナー表示 # #--------------# sub banner_view { &header; print <<"EOM";
Random Image

クッキー情報の取得ができなかったため、以下の画像から再度クリックして下さい。 EOM foreach (@keys) { print "

\n"; } print "

\n\n"; exit; } #--------------# # エラー処理 # #--------------# sub error { &unlock if ($lockflag); if ($_[0]) { &header if (!$headflag); print "

ERROR !

\n"; print "$_[0]\n"; print "
\n\n"; } else { @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 lock { local($retry)=5; # 1分以上古いロックは削除する if (-e $lockfile) { local($mtime) = (stat($lockfile))[9]; if ($mtime && $mtime < time - 60) { &unlock; } } # symlink関数式ロック if ($lockkey == 1) { while (!symlink(".", $lockfile)) { if (--$retry <= 0) { &error; } sleep(1); } # mkdir関数式ロック } elsif ($lockkey == 2) { while (!mkdir($lockfile, 0755)) { if (--$retry <= 0) { &error; } sleep(1); } } $lockflag=1; } #--------------# # ロック解除 # #--------------# sub unlock { if ($lockkey == 1) { unlink($lockfile); } elsif ($lockkey == 2) { rmdir($lockfile); } $lockflag=0; } #--------------# # HTMLヘッダ # #--------------# sub header { $headflag=1; print "Content-type: text/html\n\n"; print <<"EOM"; Random Image EOM } #------------------# # チェックモード # #------------------# sub check { &header; print "

Check Mode

\n\n

\n"; print "Copyright(C) Kent Web 2002\n"; print "\n\n"; exit; }