Perlで検索エンジンからの検索文字列を取得する

自分のホームページの前にどのサイトから来たかをRefererでとることができますが、最近ではGoogleやYahooなどの検索エンジンからたどってくる人が多いと思います。どんな検索で自分のホームページに来たかを知るためにperlでがんばってみました。

use Jcode;
my ($referer) = $ENV{'HTTP_REFERER'};
my ($keyword) = '';
# 検索文字列の取得
if ($referer =~ /(?:\?p|\&p)=(.*?)(?:\&|$)/) { $keyword = "$1"; }
elsif ($referer =~ /(?:\?q|\&q)=(.*?)(?:\&|$)/) { $keyword = "$1"; }
elsif ($referer =~ /(?:\?MT|\&MT)=(.*?)(?:\&|$)/) { $keyword = "$1"; }
elsif ($referer =~ /(?:\?Text|\&Text)=(.*?)(?:\&|$)/) { $keyword = "$1"; }
if ($keyword ne '') {
$keyword =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/eg;
#文字コード変換
my ($code);
if ($referer =~ /(ei=euc-jp|IE=euc-jp|ie=euc-jp)/) { $code = 'euc'; }
elsif ($referer =~ /ei=UTF-8|IE=UTF-8|ie=UTF-8/) { $code = 'utf8'; }
Jcode::convert(\$keyword, 'sjis', $code);

こんな感じで$keywordに検索文字列が入ります。Google/MSNの場合はq=..に、Yahooの場合はp=..に検索文字列が入っているので両方探しています。厳密にやるならドメインで処理を分岐した方が良いのですが面倒なのでp=かq=かを探すようにしています。pとqのパラメータが混在する検索エンジンがでてきたら考えたいと思います。他にもMTとかTextとかで検索されていたので追加してみました。

なお検索文字列がマルチバイト文字の場合はURLデコードを行って、文字コード変換を行う必要があります。上記プログラムではshift-jisで表示するのでshift-jisに変換しています。Jcode::convertは元文字列の文字コードを自動判別して変換してくれるのですが、それでもたまに文字化けすることがありました。検索エンジンによっては文字コードを指定していることがあるようなのでeiが見つかった場合は文字コードを指定してあげるようにしました。指定がない場合も検索エンジンごとにデフォルトの文字コードがあると思うので必要があれば調べてみようと思います。