#! /bin/perl
#↑あなたのサーバの設定に合わせて書き換えて下さい。
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# 正義の手鏡 ---Web Spy Mini
#
# 綾瀬 慶助
#
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
use GD;
#↑GD.pmが使用できるサーバ以外は,改造が必要です。
#
######まずはこのCGIを設置する時にカスタマイズしてくれぇ。
$log_file = './wspy.html';#公開用。ファイル名は適当に変えておいた方がいいかも。
$jtitle = '正義の鏡';#このプログラムの和名
$title = 'Web Spy';#このプログラムの英名
#####Spyが捕まえた人の調査はここから。
$url = $ENV{'SERVER_NAME'}.$ENV{'SCRIPT_NAME'};#このプログラムが置かれてる場所。
$referer = $ENV{'HTTP_REFERER'};#Spyの派遣先。
$host = $ENV{'REMOTE_HOST'};#まずはドメイン名から。基本だね。
$ip = $ENV{'REMOTE_ADDR'};#IPアドレス取得。Nuke撃つなよ。
$agent = $ENV{'HTTP_USER_AGENT'};#ブラウザチェック。
$host = "$host <font color=teal>via proxy</font>" if $agent=~/via /;
$host = $host." <FONT COLOR=sandybrown>$ip</FONT>";
$query = $ENV{'QUERY_STRING'};
$query =~s/\t/ /g;
$query =~s/\n/ /g;
$query =~s/&/&/g;
$query =~s/</</g;
#ファイルの表示です。
if(!$query){
print "Content-type: text/html\n\n";
open(F,$log_file) || &ended;
seek(F,0,0);
@lines = <F>;
close(F);
print << " _HEAD_";
<HTML><HEAD><TITLE>$title</TITLE></HEAD><BODY BGCOLOR=#fff5ee>
<FONT SIZE=5 COLOR=red><i>$jtitle ---$title</i></FONT>
<TABLE BORDER><TD>
<FONT SIZE=2><NOBR><img src=\"http://$url?xxx\"></NOBR></TABLE>
<FONT SIZE=2><B>
上記のHTMLを,アクセス状況を取得したいチャットで書き込んで下さい。
(\"xxx\"は変えて下さい)
<FONT COLOR=TEAL>画像を出せるWebチャット専用です。
但し,エラーになるチャットもあります。</FONT></B></FONT><BR><BR>
<font color=blue size=2>$titleを表示したURL</font>
<font color=gray size=2>日付
<font color=maroon>IPアドレス
(<font color=teal>Proxy使用時の本当のIP</font>)</font></font><HR>\n
_HEAD_
print @lines;
$sign = '<H5 ALIGN=right><A HREF=\"http://www.geocities.co.jp/SiliconValley/3955/\">Web-Spy by けいすけ</A></H5>';
print << " _FOOT_";
<HR><FONT COLOR=TEAL SIZE=2><B>絶対に悪用しないで下さい。
このプログラムが,大小を問わずいかなる不都合を招こうが,私は一切の責任を負いません。</B></FONT>$sign</BODY></HTML>
_FOOT_
exit;
}
#プロキシで入ってきてる人の本当のアドレスを調べるよ。(不完全です)
$via = $ENV{'HTTP_VIA'} if $ENV{'HTTP_VIA'}=~s/.*\s(\d+)\.(\d+)\.(\d+)\.(\d+)/$1.$2.$3.$4/;
$via = $ENV{'HTTP_X_FORWARDED_FOR'} if $ENV{'HTTP_X_FORWARDED_FOR'}=~s/^(\d+)\.(\d+)\.(\d+)\.(\d+)(\D*).*/$1.$2.$3.$4/;
$via = $ENV{'HTTP_FORWARDED'} if $ENV{'HTTP_FORWARDED'}=~s/.*\s(\d+)\.(\d+)\.(\d+)\.(\d+)/$1.$2.$3.$4/;
if($via =~/([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)/){
if($via =~/([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)/){
$ipvia = "$1.$2.$3.$4";
$addr = (gethostbyaddr(pack('C4',$1,$2,$3,$4),2))[0];
if($addr ne ''){$via = $addr;}else{$via = $ipvia;}
}
}
$host = "$host ← <font color=teal>$via</font> <font color=green>$ipvia</font>" if $via;
#捕まえた日付と時間をチェック。
($month,$mday,$hour,$min)=(localtime)[4,3,2,1];
$min = "0$min" if ($min < 10);$month++;
$date = "$month/$mday $hour:$min";
#Spyがホシを捕まえたページのURLを抽出します。
$question = index($referer,'?');
$referer = substr($referer,0,$question) if $question != -1;
$html = '<i><b><font color=red>NOT CHATROOM?</font></b></i>' if ($referer =~/\/$/ | $referer =~/\.html$/);
#データをHTMLに変換!
$mem="<font size=2><a href=\"$referer\">$query</a></font><font color=red></font><font color=gray size=2> $date <font color=maroon>$host</font> $agent</font><br><br>\n";
#####画像出力です。
$| = 1;
print "Content-Type: Image/gif\nPragma: no-cache\n\n";
$rad=3.1415926*2;
$min_rad=$min/60*$rad;
$hour_rad=($hour % 12)/12 *$rad;
$hour_rad+=$min_rad/12;
$hour_x=16+sin($hour_rad)*16*0.6;
$hour_y=16-cos($hour_rad)*16*0.6;
$min_x=16+sin($min_rad)*16*0.9;
$min_y=16-cos($min_rad)*16*0.9;
$clock=new GD::Image(32,32);
$seashell=$clock->colorAllocate(245,235,228);
$white=$clock->colorAllocate(255,255,255);
$black=$clock->colorAllocate(0,0,0);
$red=$clock->colorAllocate(255,0,0);
for($i=0;$i<12;$i++){
$min_rad=$i/12*$rad;
$x1=16+sin($min_rad)*16*0.8;
$y1=16-cos($min_rad)*16*0.8;
$x2=16+sin($min_rad)*16;
$y2=16-cos($min_rad)*16;
$clock->line($x1,$y1,$x2,$y2,$red);
}
$clock->line(16,16,$hour_x,$hour_y,$black);
$clock->line(16,16,$min_x,$min_y,$black);
$clock->line(0,0,0,31,$white);
$clock->line(0,0,31,0,$white);
$clock->line(31,0,31,31,$black);
$clock->line(0,31,31,31,$black);
print $clock->gif;
#####データもそろったことですし,記録しようぜ。
open(FILE,"$log_file") || die;
seek(FILE,0,0);
@logs = <FILE>;
close(FILE);
@logs = @logs[0..39];
unshift(@logs,$mem);
open(FILE,">$log_file") || die;
eval 'flock(DB,2);';
seek(FILE,0,0);
print FILE @logs;
eval 'flock(DB,8);';
close(FILE);
exit;
|