#!/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/>//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";
クッキー情報の取得ができなかったため、以下の画像から再度クリックして下さい。
EOM
foreach (@keys) {
print "
\n";
}
print "
\n