awstatsで携帯端末情報を表示させる方法


awstatsには、もともと携帯端末情報を表示する機能が備わっており、
awstats.confでLevelForBrowsersDetection=allphonesと設定することで、
"lib/browser_phone.pm"に記載されている
ユーザエージェントと端末名のマッピング情報を読み込んで、
端末情報が表示されるようになる。


しかし、デフォルトでは、国内キャリアの端末に関する情報は記載されていない。


そこで、端末のプロファイルデータが、
以下のサイト等で無料で公開されていたりするので、
これらのデータを利用することにする。


すばらしい!


インターネット総合研究所
http://imri.impressrd.jp/iil/k-taiprofile/?q=k-taiprofile/
ke-tai.org
http://ke-tai.org/index.php?%B7%C8%C2%D3%C3%BC%CB%F6%A5%B9%A5%DA%A5%C3%A5%AF%B0%EC%CD%F7


awstatsで、端末情報表示させたかったらみんな似たようなことしてるはず。。


そこで、ke-tai.orgで、提供されているcsvデータから
browser_phone.pmを自動生成するスクリプトをざっくり書いてみました。phpです。
perlで書けよ!>俺
インプレスR&Dの方も似たような感じになるかと思います。


データ自体は、上記サイトから取得してください。

<?php
$csv = fopen("20080820_ke-tai_list.csv", "r");

//through 2 lines
fgetcsv($csv, 1000, ",");
fgetcsv($csv, 1000, ",");

$idOrderArea = "@BrowsersSearchIDOrder = (
'opera',\n";
$idLibArea = "%BrowsersHashIDLib = (
# Common web browsers text
'msie','MS Internet Explorer',
'netscape','Netscape',
'firefox','Firefox',
'svn', 'Subversion client',
'opera', 'Opera',
";

$ids = array();
$pattern = array("/([^\[^\(]+).*/", "/\s$/", "/'/", "/\s/", "/-/", "/\./", "/_/");
$rep = array("$1", "", "\'", "\\s", "\-", "\.", "\_");
while ($datas = fgetcsv($csv, 1000, ",")) {
    if ($datas[2] === "" || $datas[4] === "") {
        continue;
    }
    if (isset($ids[$datas[4]])) {
        echo $datas[4]. "is duplicate.  \n";
        continue;
        }
        else {
        $ids[$datas[4]] = $datas[2];
}
    $id = preg_replace($pattern, $rep, mb_convert_encoding(strtolower($datas[4]), "UTF-8",
 "Shift_JIS"));
    $name = preg_replace($pattern, $rep, mb_convert_encoding($datas[2], "UTF-8", "Shift_JI
S")). "(".$datas[1] .")";
    $idLibArea .= "'" . $id . "', '" . $name ."',\n";
    $idOrderArea .=  "'" . $id ."',\n";
}
fclose($csv);

$idOrderArea .= ");\n\n";
$idLibArea .= ");";

$filename = "browsers_phone.pm";
if (!$handle = fopen($filename, "w")) {
    echo "Cannot open $filename";
    exit;
}
if (!fwrite($handle, $idOrderArea.$idLibArea)) {
    echo "Cannot write to file ($filename)";
    exit;
}
fclose($handle);
?>

ユーザエージェントが重複する場合は、一つ目だけを有効としています。
バグってたらご指摘をお願いします。

以下追記 8/22

表示されてる例

インプレスR&D版は、こちらを参照
http://d.hatena.ne.jp/kazukiz/20080823/1219431176