#!/usr/bin/perl #======Namazu検索キーワード・ログビューワー [nlview.cgi ver.0.18a(2004年3月24日版)]========== #Copyright(C)2001 hiro All Rights Reserved. #スクリプト配布場所 #URI:http://homepage3.nifty.com/cinema1987/data/howto2.htm Namazu(Perl版)設置ノウハウ #MAIL:fwnk1502@mb.infoweb.ne.jp #必ずEUCコードで保存すること! #フリーで改造、再配布も自由ですが、著作権を放棄しているわけではありません。 $version = 'NMZ.slog Viewer 0.18a'; #------------設定項目(必須)---------------------------------------------------------- #ホームページのURI $page = 'http://foo.bar.ne.jp/~hoge/'; #ホームページのタイトル $title = 'My Homepage'; #最近の検索キーワードを表示するページのタイトル $nlview_title = '最近の検索キーワード'; #NMZ.slogファイルの場所。相対パスか絶対パスで。 $logfile = './NMZ.slog'; #デフォルトで1ページに表示するキーワードの件数。 $max = "20"; #表示件数を変更する場合、許可する最大件数。 #あまり大きくするとサーバー負荷が大きくなりますので注意。 $maxdis = "100"; #namazu.cgiのURI。相対パス指定可 $namazu = 'http://foo.bar.ne.jp/~hoge/namazu/namazu.cgi'; #インデックスフォルダの名前。複数インデックスの場合だけ、 #インデックスフォルダの名前を書いてください。キーワードからNamazuに #ジャンプする場合に必要です。 #cinemaとdiaryという名前のインデックスの場合は下のようになります。 #記述例: $index = "&idxname=cinema&idxname=diary"; $index = ""; #IPアドレスを表示するかどうか。表示する場合1、表示しない場合は0を記入。 $ipad = "1"; #検索キーワードの順位を表示するページのタイトル $logbest = "検索キーワードベスト30"; #検索キーワードを何位まで表示するか。上のタイトルと数字を合わせてください。 $maxbest = "30"; #このスクリプトの名前。 $script = 'nlview.cgi'; #------------設定終了---------------------------------------------------------- #------------処理開始------------------------------------------------------- print "Content-type: text/html\n\n"; &decode; $count = 0 ; if($FORM{'logmax'} eq ""){ $max = $max; } elsif($FORM{'logmax'} =~ /\D/ ){ &error ("半角数字を入力してください。") } else{ $max = $FORM{'logmax'}; } if($FORM{'logmax'} > $maxdis || $max > $maxdis) { &error ("表示件数が多すぎます! 設定を$maxdis件以下にしてください。"); } if($FORM{'start'}){ $start=$FORM{'start'}; }else{ $start=0; } $end=$start+($max-1); open (LOG, "$logfile") || &error ("ログファイルが開けません。パス設定を確認してください。"); @lines = ; @lines = reverse(@lines); close(LOG); if ($FORM{'logsort'} eq 'logsort'){ &logsort; } else{ &html; &log; &footer; } #------------------------------------------------------------------------------ sub decode { if ($ENV{'REQUEST_METHOD'} eq "POST"){ if ($ENV{'CONTENT_LENGTH'} > 20) { &error ("フォーム入力文字列のサイズが大きすぎます。"); } read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{QUERY_STRING}; } @pairs = split(/&/,$buffer); foreach (@pairs) { ($name, $value) = split(/=/, $_); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $value =~ s//>/g; #htmlタグを禁止する $value =~ s/\r//g; #改行コードの\rを消去 $FORM{$name} = $value; } } sub html { print <<"EOM"; $nlview_title($title)

$nlview_title($title)

現在のNamazu検索キーワードです。
キーワードをクリックすると、Namazuにジャンプして検索します。
EOM $total = $#lines+1; $hyouji = $start + $max; $hyouji2 = $start + 1; if($hyouji < $total){ print "最新$hyouji2件目から$hyouji件目までを表示しています。"; }else{ print "最新$hyouji2件目から$total件目までを表示しています。"} print <<"EOM";

EOM #IPアドレス表示・非表示の振り分け if ($ipad == 1){ print "\n"; print "\n"; } else{ print "\n"; } } #--------メイン処理----------------------------------------------------------------- sub log { for($i=$start;$i<=$end;$i++){ last if($i > $#lines); $data=$lines[$i]; chomp($data); ($key,$hit,$ip,$date) = split(/\t/,$data); #英語の長いキーワード対策 $key3 = $key; $length = length $key; if ($length > 80) { $key2 = substr ($key,0,16) . "..."; } else { $key2 = $key; } $key2 =~ s//>/g; #URLエンコーディング $key3 =~ s/(\W)/'%'.unpack("H2", $1)/ego; #奇数と偶数で色分け $count = $count + 1; $count2 = $count % 2; if($count2 == 0){ print "\n"; }else{ print "\n"; } print "\n"; print "\n"; print "\n"; if ($ipad == 1){ print "\n"; print "\n"; } else{ print "\n"; } } } #---------------------------------------------------------------------------- sub footer { print "
キーワード
ヒット数
検索日時
IPアドレス or HOST
\n"; print "$key2\n"; print "
$hit
$date
$ip
\n"; print "
\n"; if($end < $#lines){ $start=$end+1; $#lines++; print "検索キーワードは$#lines件です。\n"; $before = $start - ($max*2); $lastdis = ($#lines++) - $max; if($before >= 0){ print "[NEXT]\n"; print "[LAST]\n"; print "[BEFORE]\n"; }else{print "[NEXT]\n"; print "[LAST]\n"; } }else{ $before = $start - $max; $#lines++; print "以上$#lines件表示終了。\n"; if($#lines > $max){ print "[BEFORE]\n"; } } $maxdis = ($maxdis+1); print <<"EOL";
順位別はこちら→ [$logbest]

[NEXT]をクリックしていくのが面倒な人は下のフォームから表示件数を変更できます。
ただし、表示件数をあまり大きくすると、サーバーの負荷も大きくなりますので、$maxdis件以上は設定できません。
表示件数変更

[検索に戻る] [$nlview_titleのトップに戻る] [$titleに戻る]
$version
EOL } #--------------------------------------------------------------------------------- sub logsort { $logsize = (-s $logfile); $logsize = int ($logsize / 1024); foreach $data (@lines) { chomp($data); ($word,$hit,$ip,$date) = split(/\t/,$data); undef $ip; undef $date; undef $hit; if ($word ne '') { $word{$word}++ } } print "\n"; print "\n"; print "$title:$logbest\n"; print <<"EOF";

$title $logbest

検索回数が多いキーワードの上位 $maxbest 位を表示しています。
キーワードをクリックすると、Namazuにジャンプして検索します。


EOF $search = ''; $num = 0; foreach $word (sort { $word{$b} <=> $word{$a} } keys %word) { $num++; if ($num > $maxbest) { print ""; last; } if ($search eq '') { $number = "1"; } if ($search == $word{$word}) { $number = ""; } else { $number = $num; } $search = $word{$word}; #URLエンコーディング $word2 = $word; $word2 =~ s/(\W)/'%'.unpack("H2", $1)/ego; $word =~ s//>/g; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; } print <<"EOF";
順位検索キーワード検索回数
$number$word$search

NMZ.slogサイズは $logsize KBです。

[$nlview_titleに戻る] [検索に戻る] [$titleに戻る]
$version
EOF } #--------エラー処理---------------------------------------------------------------- sub error { print <<"EOF"; エラー

$_[0]


$titleに戻る
$version
EOF exit; }