CGIです 1対策できるツール

アクセスログ取得のCGIです。

例えば検索エンジン来訪のみのログを取りたい場合などに便利な簡易アクセスログ取得用perlスクリプトを自作してみました。そのページにクローラーからのアクセスがあって初めてログとして取得でき、そのまま出力するへなちょこスクリプトです。例えばCGIが使えないレンタルサーバーの場合、ページ内HTMLにCGIがつかえる別ドメイン宛てにインラインフレームで仕掛けておけば、ある程度クローラーの挙動を知ることができます。
(ただしフレーム内にクローラーのアクセスがあったときしかログは取得されませんので、そういう意味では不便です。)
↓こんな感じになります
材料:
1. CGI使用可能で且つホストネームが取得可能なサーバースペース。
2. ログ保存用のファイル。(ここではhostdata.txtという名前のファイルを使用しています。初期状態は保存したい行数ぶんのデーターを予め入れておきます。)
↓5個まで保存ならこんなかんじで
<li>(10/26 08:40:12)<br>まだ
<li>(10/26 08:37:17)<br>きて
<li>(10/26 08:32:34)<br>いない
<li>(10/26 08:32:31)<br>みたい
<li>(10/26 08:32:28)<br>です。
3. 実行用cgiファイル(下のソース)


perlのソース 参考文献:
環境変数 REMOTE_HOST / REMOTE_ADDR - futomi's CGI Cafe

#!/usr/bin/perl

#--↓ホスト名取得
$host_name = &GetHostName($ENV{'REMOTE_ADDR'});
sub GetHostName {
	my($ip_address) = @_;
	my(@addr) = split(/\./, $ip_address);
	my($packed_addr) = pack("C4", $addr[0], $addr[1], $addr[2], $addr[3]);
	my($name, $aliases, $addrtype, $length, @addrs);
	($name, $aliases, $addrtype, $length, @addrs) = gethostbyaddr($packed_addr, 2);
	return $name;
}


#--↓前回までのロボットホスト名のログfileを配列に代入
open(IN,"./hostdata.txt");
@hostdattmp = <IN>;
close (IN);

#-- ↓現在時刻取得
($sec,$min,$hour,$mday,$mon,$year,$wno) = localtime(time);
$adtime = sprintf("(%01d/%01d %02d:%02d:%02d)",$mon+1,$mday,$hour,$min,$sec);

#--↓来訪者が検索エンジンならば以下実行
if (($host_name =~ /google/i)||($host_name =~ /MSN/i)){
	$host_name = "<li>$adtime<br>$host_name\n";
	pop(@hostdattmp);
	unshift(@hostdattmp,$host_name);
	#----そのホスト名と時間をロボットホスト名fileに保存
	open (OUT,"> ./hostdata.txt");
	print OUT @hostdattmp;
	close (OUT);
}
#--↑

#--↓出力
print "Content-type:text/html\n\n";

print <<"HTML";
<html><head>
<title>ろぼアクセスログ</title>
<style type="text/css">
<!--
li{color:#F5FFFA;background:#000000;list-style-type:none;margin:2px;
font-size:8pt;width:200px;padding:1px;}
a{font-size:10px;color:#B0C4DE}
-->
</style>
</head>
<body style="margin:0px;padding:0px">
<div style="margin:0px;padding:0px;">
  ロボ来訪履歴(googleとMSNのみ)

HTML

foreach (@hostdattmp){
	$_ =~ s/\n/\n<br>/;
	print $_;
}
print "$adtime\n";
print "</div></body><html>\n";
exit;

流れ
1.$ENV{’REMOTE_ADDR’}からホストネームを取得。
2.既存のホストデータファイルを読み込み配列に代入。
3.ifを使い1のほすとが検索エンジンならば配列にpopとunshift関数を用いて入れ替えを行う。
4.その配列を元のファイルに保存
5.現在時刻出力→終わり

[PR][ブログ宣伝掲示板][無料ブログ比較]
Powererd by cgi-desu.nobaby.nobody.jp
レンタルCGI
nobaby.nobody Presents.