#!/usr/local/bin/perl # ###################################################################### ### ### ### CGI+JS逆リンク探知 T-Revlink Ver.2.01 ### [1/2] リンク収集 (trlink.cgi) ### (c) 1996-2005 Takahiro Nishida ### http://www.mytools.net/ ### ### ###################################################################### # ### 変数設定部 (詳細は上記ページをご覧下さい) ###################### $basedir = "."; @excepts = (''); ### 変数設定部 (ここまで)########################################### # 時刻の修正(海外サーバでの利用時、単位は時間) $time_fix = 0; $lockfile="$basedir/lockdir/trl.lock"; &main; sub main{ &check_input; &add_urldata; &show_img(0); } ##### 入力のチェック sub check_input{ ($dbno, $from) = split("&", $ENV{'QUERY_STRING'}); ($dbno =~ /^[0-9]+$/) || &show_img(2); # No DBNo. Specified (-f "$basedir/link-$dbno.dbf") || &show_img(7); # Isn't registed specified DB ($from =~ /^http:\/\/[^<>]+/ ) || &show_img(3); # Can't get URL while($pop = pop(@excepts)){ ($from =~ /$pop/) && &show_img(4); # URL exception } ($url) = split("#", $from) } ##### 一時ログへの追加 sub add_urldata{ ### 現在時刻 $stime = time() + $time_fix * 60 * 60; local($sec, $min, $hour, $mday, $mon, $year) = localtime($stime); $mon++; $year += 1900; $time_now = sprintf("%04d%02d%02d%02d%02d%02d", $year, $mon, $mday, $hour, $min, $sec); ### ロック開始 &lock; ### 現在時刻のログが無ければ更新 (-f "$basedir/lockdir/tmp-$dbno-$hour") || &update_database($dbno); ### 一時ログの追加 open(FILE,">>$basedir/lockdir/tmp-$dbno-$hour") || &show_img(5); # Can't add tmpfile print FILE "$url\t$time_now\t\n"; close(FILE); ### ロック終了 &unlock; } ##### DB更新 sub update_database{ local($dbno) = @_; $h = 0; while(1){ ($h < 24) || return; open(FILE, "$basedir/lockdir/tmp-$dbno-$h") && last; $h++; } @datas=; close(FILE); # とりあえず既存データをハッシュに格納 open(FILE, "$basedir/link-$dbno.dbf") || &show_error(6); foreach(){ ($url, $hits, $time) = split("\t"); $DB{$url} = $hits; $LT{$url} = $time; } close(FILE); # 今回の分をプラス foreach (@datas){ ($newurl, $newtime) = split("\t"); $DB{$newurl}++; $LT{$newurl} = $newtime; } # 再びファイルに収める open(FILE, ">$basedir/link-$dbno.dbf") || &show_img(6); # can't open dbfile while(($name, $value) = each(%DB)){ print FILE "$name\t$value\t$LT{$name}\t\n"; } close(FILE); # 一時データファイルを消す unlink("$basedir/lockdir/tmp-$dbno-$h"); } ##### 数字画像表示 sub show_img{ local($imgno)=@_; ($imgno =~ /[56]/) && unlock; open(IMG, "$basedir/$imgno.gif") || die $!; binmode(STDOUT); print "Content-type: image/gif\n\n"; print ; close(STDOUT); exit; } ##### ファイルロック sub lock{ $try = 5; while(!(symlink("$$",$lockfile))){ if(--$try <= 0){ &show_img(1); # locking } sleep(1); } } ##### ロック解除 sub unlock{ unlink($lockfile) }