#!/usr/local/bin/perl
# アクセスログを読み込んでリファラに含まれる検索語句を抽出しSJISに変換する。
use Jcode;
$data = './log.csv';
$| = 1;
print qq(Content-type: text/html\n\n);
print qq(\n);
print qq(\n);
print qq(
\n);
print qq(\n);
print qq(日記ページアクセスリンク\n);
print qq(\n);
print qq(\n);
open DATA, "$data";
while () {
# 除外処理(内部移動は無視)
next unless /http/;
next if /www7.big.or.jp\/~oct\//;
next if /www7.big.or.jp\/%7Eoct\//;
next if /chat.cgi/;
($day,$hour,$url) = split /,/;
print qq($day 日
) if $day ne $day_last;
$day_last = $day;
# アンテナ経由で開かれたページからのリンクの場合
if ($url =~ /^http:\/\/.*?\?[0-9]+$/) {
print qq($url
\n);
# 検索サイトからの場合
} elsif ($url =~ /^(http:\/\/.*?)\?(.*)/) {
$url2 = $1;
$query_ori = $2;
$url2 =~ s/^(http:\/\/[^\/]*)\/.*$/$1/;
# 検索語句の抽出
$query = &search_word_detect($url2, $query_ori);
# 検索サイトを判別できなかった場合
if ($query eq '') {
# 文字コードをSJISに
$url3 = $url;
$url3 =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$code = getcode($url3);
$url3 = Jcode::convert($url3, "sjis", $code);
# 出力
$url =~ s/&/&/g;
$url3 =~ s/&/&/g;
print qq($url3
\n);
# 検索サイトを判別できた場合
} else {
# 文字コードをSJISに
$query =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$code = getcode($query);
$query = Jcode::convert($query, "sjis", $code);
$query =~ s/\+/ /g;
# 出力
$url =~ s/&/&/g;
print qq(検索キーワード:$query ($url2)
\n);
}
# 普通のリンクの場合
} else {
print qq($url
\n);
}
}
print qq(\n);
exit;
# 検索サイト別Query抽出関数
sub search_word_detect {
my $url = $_[0];
my $query = $_[1];
# fresheyeの場合
if ($url =~ /fresheye\./) {
if ($query =~ /kw=(.*?)(&|$)/) {
$query = $1;
}
# infoseekの場合
} elsif ($url =~ /infoseek\./) {
# 絞り込み検索をした場合
if ($query =~ /oq=(.*?)&.*qt=(.*?)(&|$)/) {
$query = $1 . ' ' . $2;
} elsif ($query =~ /qt=(.*?)(&|$)/) {
$query = $1;
}
# $url =~ s/Titles$//;
# exciteの場合
} elsif ($url =~ /excite\./) {
if ($query =~ /FI_1=(.*?)(&|$)/) {
$query = $1;
} elsif ($query =~ /search=(.*?)(&|$)/) {
$query = $1;
} elsif ($query =~ /s=(.*?)(&|$)/) {
$query = $1;
}
# lycosの場合
} elsif ($url =~ /lycos\./) {
if ($query =~ /query=(.*?)(&|$)/) {
$query = $1;
} elsif ($query =~ /q=(.*?)(&|$)/) {
$query = $1;
}
# yahoo内googleの場合
} elsif ($url =~ /google\.yahoo/) {
if ($query =~ /p=(.*?)(&|$)/) {
$query = $1;
}
# googleの場合
} elsif ($url =~ /google\./) {
if ($query =~ /as_q=(.*?)(&|$)/) {
$query = $1 if $1;
}
if ($query =~ /as_epq=(.*?)(&|$)/) {
$query = $1 if $1;
}
if ($query =~ /q=(.*?)(&|$)/) {
$query = $1 if $1;
}
# gooの場合
} elsif ($url =~ /goo\./) {
if ($query =~ /MT=(.*?)(&|$)/) {
$query = $1;
}
# これどこよ?
} elsif ($url =~ /para\./) {
if ($query =~ /QueryString=(.*?)(&|$)/i) {
$query = $1;
} elsif ($query =~ /OLDQUERYDISPLAY=(.*?)(&|$)/) {
$query = $1;
$query =~ s/%25/%/g;
}
# MSNの場合
} elsif ($url =~ /msn\./) {
if ($query =~ /q=(.*?)(&|$)/i) {
$query = $1;
}
# biglobeの場合
} elsif ($url =~ /biglobe\./) {
if ($query =~ /q=(.*?)(&|$)/i) {
$query = $1;
}
# NIFTYの場合
} elsif ($url =~ /nifty\./) {
if ($query =~ /TEXT=(.*?)(&|$)/i) {
$query = $1;
}
# althewebの場合
} elsif ($url =~ /alltheweb\./) {
if ($query =~ /q=(.*?)(&|$)/i) {
$query = $1;
}
# Dionの場合
} elsif ($url =~ /dion\./) {
if ($query =~ /QueryString=(.*?)(&|$)/i) {
$query = $1;
}
# altavistaの場合
} elsif ($url =~ /altavista\./) {
if ($query =~ /q=(.*?)(&|$)/i) {
$query = $1;
}
# ODNの場合
} elsif ($url =~ /odn\./) {
if ($query =~ /QueryString=(.*?)(&|$)/i) {
$query = $1;
}
# 未登録検索サイトの場合
} else {
$query = '';
}
return $query;
}