a40402.pl
Webalizerの検索語の文字化けを軽減したり、サーチエンジンのキャッシュ、画像検索、翻訳機能の検索語にも対応できるようにするプログラムです。
自動判別できない文字コードをなるべく壊さないようにしているので、文字化けが残っても、手動で文字エンコーディングを選ぶ道が残されます。
- 1. 書式
- 2. オプション
- 3. 説明
- 4. 対応ログ形式
- 5. 対応検索エンジン
- 6. テスト環境
- 7. ご注意
- 8. 簡単な使い方
- 9. 詳しい説明
- 10. プログラムのカスタマイズ
- 10.1. @search_engineの書式
- 10.2. オペレータ
- 10.3. 補足
- 11. 更新履歴
1. 書式
perl a40402.pl [オプション]... < 入力ファイル > 出力ファイル
2. オプション
- -n
- 半角カタカナを全角カタカナに、全角のアルファベット、数字、記号を半角に変換します。デフォルトでこの処理は行いません。
3. 説明
これは、日本語のWebサイトのApacheのアクセスログのリファラのURLエンコードをWebalizer向けにデコードするプログラムです。標準入力にApacheのアクセスログを流し込むとWebalizer向けにデコードされた状態で標準出力から出てきます。
4. 対応ログ形式
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
※common形式の場合には何も加工が行われずそのまま標準出力にスルーされます。
5. 対応検索エンジン
- Google 検索 キャッシュ 画像 翻訳
- goo 検索
- Yahoo! 検索 キャッシュ
- livedoor 検索
- フレッシュアイ 検索
- Excite 検索 キャッシュ
- @nifty 検索
- BIGLOBE 検索
- msn 検索
- CEEK.JP 検索
- Ask.jp キャッシュ
6. テスト環境
- xampp-win32-1.6.1 xampp-win32-perl-addon-5.8.8-2.2.4
Jcode-2.06
- Debian GNU/Linux perl_5.8.8-7_i386 libjcode-pm-perl_2.06-1_i386
webalizer_2.01.10-32_i386
7. ご注意
- プログラムはUTF-8で保存して下さい。
- デコード結果の文字コードはUTF-8になります。
- 文字化けは軽減されますが、完全には解消されません。例として、ここを参考にして下さい。
- このプログラムはなるべく文字コードを壊さないようにしていますが、Webalizerの大文字を小文字に変換する機能で若干壊れてしまうのはどうしようもありません。
-
-nオプションを使うと文字コードを判別できなかった文字は完全に壊れます。おまけにデコード処理にそれなりに時間がかかるようになります。
8. 簡単な使い方
ここでは、Debian GNU/Linuxでの簡単な使い方を説明します。テスト環境の「Debian
GNU/Linux…」に続けて書いてあるパッケージかその相当品を予めインストールしておいて下さい。
- 試しに手ごろなログをa40402.plの標準入力に流し込んでみて、プログラムが動作するか確認してみます。
./a40402.pl < /var/log/apache2/access.log
エラーが出た場合は何か足りないと思われるパッケージをインストールしてみたりして対処します。
- webalizer.confに以下のような行を書き加えます。
HTMLHead <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
※Webサーバの設定で、既にこれに相当する設定がしてある場合、この設定は不要に思えますが、統計ページをダウンロードしてローカルで開く場合等を考えるとしておいた方が無難です。(UTF-8の自動判別は難しいので。)あけび猫が試したところ、統計ページにこの行が二重に出力されるみたいですが、細かいことは気にしないことにします。
さらに「SearchEngine」で始まる行を次のようなのに置き換えます。
SearchEngine google q=
SearchEngine yahoo.co.jp p=
SearchEngine yahoofs.jp p=
SearchEngine infoseek.co.jp qt=
SearchEngine livedoor.com q=
SearchEngine fresheye.com kw=
SearchEngine excite.co.jp search=
SearchEngine nifty.com Text=
SearchEngine biglobe.ne.jp q=
SearchEngine msn.co.jp q=
SearchEngine live.com q=
SearchEngine goo.ne.jp MT=
SearchEngine baidu.jp wd=
SearchEngine ask.jp q=
SearchEngine mooter.co.jp keywords=
SearchEngine ceek.jp q=
SearchEngine alexa.com q=
SearchEngine yahoo.com p=
SearchEngine altavista.com q=
SearchEngine lycos.com query=
SearchEngine hotbot.com query=
SearchEngine msn.com q=
SearchEngine bing.com q=
SearchEngine naver.jp q=
SearchEngine netscape.com query=
SearchEngine mamma.com query=
SearchEngine alltheweb.com q=
SearchEngine sensis.com.au find=
※infoseek.co.jpは対応できていないので文字化けする頻度が高めです。
- /etc/cron.daily/webalizerを以下のように修正します。
-
「A40402=/root/bin/a40402.pl」の部分は実際にa40402.plが置いてある所を示すように修正して下さい。
- 「TMPFILE=/var/tmp/webalizer-daily」は一時ファイルです。必要であれば、各自の環境に合わせて調整して下さい。
- 「${A40402} < ${LOGFILE} > ${TMPFILE}; ${WEBALIZER} -c ${i}
-Q ${TMPFILE} …」の部分がキモです。似たような箇所が2箇所あります。a40402.plでの変換結果を一時ファイルに保存してから、webalizerに読ませます。webalizerの標準入力に直接流し込むのは、あけび猫が試したところ、うまくいきません。
- これで、元のwebalizerの設定よりも検索語の文字化けが軽減され多くの検索語が収集されることが期待できます。
9. 詳しい説明
このプログラムは詳しくは以下のような事をしています。
- ログ形式がcombinedの場合にはログの各行の改行コードの直前に半角スペースを挿入します。あけび猫が試したところ、これをやらないと何故かxampp-win32のWebalizerではユーザエージェントの末尾が欠けることがありました。
- リファラとユーザエージェントのエスケープ(\x...)を解除し、その結果ダブルクォーテーションが出てきた場合にはそれをURLエンコードします。
- 画像検索等でURLエンコードが重複してかかっている場合にはそれを解除します。
- キャッシュや画像検索等のリファラを通常の検索のものっぽく見えるように加工します。
- 最終的にデコードすると「"%&=」の何れかの文字になるコードを半角スペースに置き換えます。これをやらないと、Webalizerが明後日のものを検索語として拾うかもしれません。
- URLエンコードをデコードし、UTF-8以外の日本語文字コードをUTF-8に変換します。UTF-8か否か判別が難しい場合には文字コード変換はしません。
- -nオプションが与えられていればノーマライズを行います。
10. プログラムのカスタマイズ
このプログラムは、「@search_engine」という二次元配列の定義を修正することにより、対応検索エンジンを増やしたり、検索エンジンの仕様変更に対応できることがあります。
10.1. @search_engineの書式
@search_engine = (['検索エンジン', 'パラメータ名', 'オペレータ', 'オペランド', …], …);
- 検索エンジン
- 検索エンジンのドメインとパスを示す正規表現です。リファラがこれと一致すると、オペレータによる処理が行われます。
- パラメータ名
- 検索語を示すパラメータ名です。これは、webalizer.confのSearchEngineキーワードの2番目の文字列と同じような意味です。
- オペレータ
- 色々なオペレータが指定できます。オペレータが無い場合、検索語はUTF-8への変換処理されます。
- オペランド
- オペレータの種類によりオペランドの意味や個数が異なります。オペランドが無いこともあります。
オペレータは左から右に順に評価されます。評価すべきオペレータが無くなると検索語はUTF-8への変換処理されます。オペレータにより評価が中断されるとURLエンコードをデコードする処理は行われますが、UTF-8への変換処理は行われません。
- !
-
リファラにオペランド(正規表現)で示されたCGIパラメータが存在しなければ次のオペレータを評価します。さもなければ評価を中断します。オペランドは1つです。
- =
-
リファラにオペランド(正規表現)で示されたCGIパラメータが存在すれば次のオペレータを評価します。さもなければ評価を中断します。オペランドは1つです。
- n
- !オペレータと同じ動作をします。ただし、CGIパラメータとマッチングされるリファラのURLエンコードをデコードした状態で行います。
- e
- =オペレータを同じ動作をします。ただし、CGIパラメータとマッチングされるリファラのURLエンコードをデコードした状態で行います。
- .
- 評価を中断します。オペランドはありません。
- ;
- 評価を次の配列に飛ばします。オペランドはありません。
- h
- リファラのドメインをオペランドで示されたものに置換し、次のオペレータを評価します。オペランドは1つです。
- s
-
リファラに対してPerlの文字列置換(s///)を実行し、次のオペレータを評価します。オペランドは文字列置換文の最初の「s」を除いたものです。オペランドは1つです。
- u
- リファラのURLエンコードをデコードし、次のオペレータを評価します。オペランドはありません。
- リファラが@search_engineにマッチングすることなくスルーしてしまうと、リファラの加工が十分ではなく、webaliserが明後日のものを検索語として拾う可能性があるので、@search_engineの最後の配列は「['.*',
'',
'.']」として全てのリファラをマッチングさせておいて評価を中断してください。さすれば、文字コードの変換はされませんが、その他の雑多な処理が行われます。
- 既存のオペレータで対応できない事態に陥った時には、check_encodeサブルーチンをいぢくってオペレータの種類を増やして下さい。
11. 更新履歴
- 2008-12-4
- リファラに含まれる改行コードをスペースに変換するようにした。これは、デコード後のログに、時々不正なレコードができる問題の修正です。
- 2007-9-30
- 公開