各投稿のアクセスランキングを表示するプラグインに、NP_ViewsとNP_MostViewedがあります。NP_Viewsが各投稿が表示された回数をカウントするもので、NP_MostViewedがそのカウント数をソートして表示するプラグインです。
このNP_Viewsの最新版 V1.3fをインストールしてみましたが、バグがあり正常にカウントされませんでした。ただ、そのバグ部分は簡単に見つかりましたので、修正することにより正常にカウントするようになりました。
しかし検索robotのアクセス分もカウントされてしまうため、アクセスランキングとしてはあまり信用できない数値となってしまうことが分かりました。そのため、このrobotのアクセス分は出来るだけカウントしないように修正しました。
とりあえず、これで希望どおりの動作をしているようです。(ただしまだまだカウント数が少なすぎるのでアクセスランキングは公開はしておりません。各投稿のアクセス数がもっと増加すれば公開する予定です)
その修正した部分について、以下にメモを書いておきます。
NP_Views V1.3fですが、同じIPからの繰り返しのアクセスを無視するのオプションを選びますと、カウントが1から増加しません。
配布しているプラグインの、このカウントの増加部分のソースは次のようになっています。
if文の条件式が '&&' で結ばれているため、最初の条件式がfalse(すなわち同じIPからの繰り返しのアクセスを無視のオプションを選択)なら、次の条件式の結果に関わらず、UPDATEのqueryが実行されることはありません。したがって、カウントは1から増加することはありえず、ここは '&&' ではなく '||' にする必要があります。
またこのqueryではカウント数しか更新しないため、比較するIPはその投稿を登録したときのIPのままです。「同じIPからの繰り返しを無視する」とするならば、直前にアクセスしたIPと同じIPならカウントしない、とするのが普通かと思います。そのためには、このqueryでIPアドレスも更新してやる必要があります。
これらを考慮して、次のように修正しました。
上記の修正で一応仕様どおりの動作はするようになったのですが、ユーザのアクセスだけでなく、Robotのアクセス分もカウントされてしまいます。アクセス数が多い人気サイトならそれほど気にする必要も無いのかもしれませんが、このサイトのように普段のアクセスがかなり少ないサイトでは、このRobotのアクセスが大多数を占めることにもなりかねません。この場合、古い投稿ほどRobotの訪問回数が多くなり、結局、登録の古さが大きなウェイトをしめてしまってアクセスランキングの意味を成さなくなってしまいます。
このRobot分を除外する方法として、HTTP_USER_AGENTの除外リストを予め登録しておき、それを比較することでRobotのアクセスを判断するという方法が考えられます。しかしこの場合、除外リストを常に見直す必要があり、もう少しスマートな方法が無いか考えてみました。
PHPで取得できる環境変数で、その判断になりうるものとして、HTTP_ACCEPTに注目してみました。まずは各Robotやブラウザがはき出すHTTP_ACCEPTを調べるために、NP_Logをインストールしました。しかし、NP_LogはHTTP_ACCEPTを保存しなかったので、これを保存できるように修正しました。(修正箇所の説明は省略)
修正したNP_Logでログを数日とった結果、Robotと思われるアクセスのHTTP_USER_AGENTとHTTP_ACCEPTは次のようなものがありました。
期待に反して、ブラウザと同じようなHTTP_ACCEPTをはくRobotもあり、これだけで判定するのは無理なようです。Yahooなんて、HTTP_USER_AGENTまでブラウザのようです。ただ、HTTP_ACCEPTをはかないRobotも多数あり、まずはこれで判断してから、次にHTTP_USER_AGENTの除外リストで判断するようにします。
あまりスマートなやり方ではありませんし、やはり除外リストをメンテしなければなりませんが、それでも最初から除外リストを見るよりかはましかと思います。もっとスマートな方法があるかと思うのですが、これ以上は思い浮かびませんので、とりあえずはこの方法でいくこととします。また何かありましたら修正することとします。
この方法でのソースの修正部分ですが、まずは除外リストをオプションで登録できるように、install関数内の最後に次の行を追加します。
次に、HTTP_ACCEPTとHTTP_USER_AGENTでRobotの判定をさせる部分を、doTemplateVar関数内の最初に追加します。
これをインストール後、除外リストをHTTP_USER_AGENT名で登録します(HTTP_USER_AGENT名は一部でも可)。プラグイン管理で_Viewsの編集を選び、"HTTP_USER_AGENT to be excluded from count"に記入します。
上記のログから、ここでは次のものを登録しております。
とりあえず、これでmediapartners-googleとYahooがカウントされていないことは確認できました。また名無しの権べいもカウントされないことも確認できました。Nucleusのルートディレクトリには色々なRobotがよくアクセスに来るのですが、各個別記事まではなかなかきてくれなくて、他のRobotは確認できておりません。しかし、HTTP_USER_AGENTが無いパターンと除外リストに登録されているパターンでの確認が出来ておりますので、一応希望どおりの動作はしているようです。
このNP_Viewsの最新版 V1.3fをインストールしてみましたが、バグがあり正常にカウントされませんでした。ただ、そのバグ部分は簡単に見つかりましたので、修正することにより正常にカウントするようになりました。
しかし検索robotのアクセス分もカウントされてしまうため、アクセスランキングとしてはあまり信用できない数値となってしまうことが分かりました。そのため、このrobotのアクセス分は出来るだけカウントしないように修正しました。
とりあえず、これで希望どおりの動作をしているようです。(ただしまだまだカウント数が少なすぎるのでアクセスランキングは公開はしておりません。各投稿のアクセス数がもっと増加すれば公開する予定です)
その修正した部分について、以下にメモを書いておきます。
バグ修正
NP_Views V1.3fですが、同じIPからの繰り返しのアクセスを無視するのオプションを選びますと、カウントが1から増加しません。
配布しているプラグインの、このカウントの増加部分のソースは次のようになっています。
if ($this->getOption('IgnoreRepeat') == 'no' && $remote_ip != $row->ip) {
$views++;
$query = "UPDATE " . sql_table('plugin_views') . " SET views='$views' WHERE id=$itemid";
$res = mysql_query($query);
}
$views++;
$query = "UPDATE " . sql_table('plugin_views') . " SET views='$views' WHERE id=$itemid";
$res = mysql_query($query);
}
if文の条件式が '&&' で結ばれているため、最初の条件式がfalse(すなわち同じIPからの繰り返しのアクセスを無視のオプションを選択)なら、次の条件式の結果に関わらず、UPDATEのqueryが実行されることはありません。したがって、カウントは1から増加することはありえず、ここは '&&' ではなく '||' にする必要があります。
またこのqueryではカウント数しか更新しないため、比較するIPはその投稿を登録したときのIPのままです。「同じIPからの繰り返しを無視する」とするならば、直前にアクセスしたIPと同じIPならカウントしない、とするのが普通かと思います。そのためには、このqueryでIPアドレスも更新してやる必要があります。
これらを考慮して、次のように修正しました。
if ($this->getOption('IgnoreRepeat') == 'no' || $remote_ip != $row->ip) {
$views++;
$set = " SET views='$views', ip='$remote_ip'";
$query = "UPDATE " . sql_table('plugin_views') . $set . " WHERE id=$itemid";
$res = mysql_query($query);
}
$views++;
$set = " SET views='$views', ip='$remote_ip'";
$query = "UPDATE " . sql_table('plugin_views') . $set . " WHERE id=$itemid";
$res = mysql_query($query);
}
Robotアクセス分を除く
上記の修正で一応仕様どおりの動作はするようになったのですが、ユーザのアクセスだけでなく、Robotのアクセス分もカウントされてしまいます。アクセス数が多い人気サイトならそれほど気にする必要も無いのかもしれませんが、このサイトのように普段のアクセスがかなり少ないサイトでは、このRobotのアクセスが大多数を占めることにもなりかねません。この場合、古い投稿ほどRobotの訪問回数が多くなり、結局、登録の古さが大きなウェイトをしめてしまってアクセスランキングの意味を成さなくなってしまいます。
このRobot分を除外する方法として、HTTP_USER_AGENTの除外リストを予め登録しておき、それを比較することでRobotのアクセスを判断するという方法が考えられます。しかしこの場合、除外リストを常に見直す必要があり、もう少しスマートな方法が無いか考えてみました。
PHPで取得できる環境変数で、その判断になりうるものとして、HTTP_ACCEPTに注目してみました。まずは各Robotやブラウザがはき出すHTTP_ACCEPTを調べるために、NP_Logをインストールしました。しかし、NP_LogはHTTP_ACCEPTを保存しなかったので、これを保存できるように修正しました。(修正箇所の説明は省略)
修正したNP_Logでログを数日とった結果、Robotと思われるアクセスのHTTP_USER_AGENTとHTTP_ACCEPTは次のようなものがありました。
| HTTP_USER_AGENT | HTTP_ACCEPT |
|---|---|
| bulkfeeds/1.01 | なし |
| infoseek sidewinder | なし |
| lmspider lmspider@scansoft.com | text/*,application/rdf+xml,application/rss+xml |
| libwww-perl/5.75 | なし |
| livedoor sf - califo | なし |
| mediapartners-google/2.1 | */* |
| mozilla/5.0 (compatible; yahoo! slurp; http://help.yahoo.com/help/us/ysearch/slurp) | */* |
| msnbot/0.11 | application/* |
| nomadscafe_ra/0.1 | なし |
| technoratibot/0.6 | なし |
| wget/1.9 | */* または なし |
| なし | なし |
期待に反して、ブラウザと同じようなHTTP_ACCEPTをはくRobotもあり、これだけで判定するのは無理なようです。Yahooなんて、HTTP_USER_AGENTまでブラウザのようです。ただ、HTTP_ACCEPTをはかないRobotも多数あり、まずはこれで判断してから、次にHTTP_USER_AGENTの除外リストで判断するようにします。
あまりスマートなやり方ではありませんし、やはり除外リストをメンテしなければなりませんが、それでも最初から除外リストを見るよりかはましかと思います。もっとスマートな方法があるかと思うのですが、これ以上は思い浮かびませんので、とりあえずはこの方法でいくこととします。また何かありましたら修正することとします。
この方法でのソースの修正部分ですが、まずは除外リストをオプションで登録できるように、install関数内の最後に次の行を追加します。
$this->createOption('ExcludedAgent','HTTP_USER_AGENT to be excluded from count','textarea','');
次に、HTTP_ACCEPTとHTTP_USER_AGENTでRobotの判定をさせる部分を、doTemplateVar関数内の最初に追加します。
$http_accept = strtolower($_SERVER["HTTP_ACCEPT"]);
if ($http_accept == '') {return;}
$user_agent = strtolower($_SERVER["HTTP_USER_AGENT"]);
$excluded_agent = strtolower($this->getOption('ExcludedAgent'));
$excluded_agent = preg_split ("/[\s,]+/", $excluded_agent);
foreach ($excluded_agent as $target){
if (ereg($target, $user_agent)) {return;}
}
if ($http_accept == '') {return;}
$user_agent = strtolower($_SERVER["HTTP_USER_AGENT"]);
$excluded_agent = strtolower($this->getOption('ExcludedAgent'));
$excluded_agent = preg_split ("/[\s,]+/", $excluded_agent);
foreach ($excluded_agent as $target){
if (ereg($target, $user_agent)) {return;}
}
これをインストール後、除外リストをHTTP_USER_AGENT名で登録します(HTTP_USER_AGENT名は一部でも可)。プラグイン管理で_Viewsの編集を選び、"HTTP_USER_AGENT to be excluded from count"に記入します。
上記のログから、ここでは次のものを登録しております。
google
lmspider
msnbot
wget/
ysearch
lmspider
msnbot
wget/
ysearch
とりあえず、これでmediapartners-googleとYahooがカウントされていないことは確認できました。また名無しの権べいもカウントされないことも確認できました。Nucleusのルートディレクトリには色々なRobotがよくアクセスに来るのですが、各個別記事まではなかなかきてくれなくて、他のRobotは確認できておりません。しかし、HTTP_USER_AGENTが無いパターンと除外リストに登録されているパターンでの確認が出来ておりますので、一応希望どおりの動作はしているようです。
No comments yet
Add Comments
Trackbacks
Trackback URL
NP_Views 1.0j Nucleusの使い方 pinged on 2004-11-02
本日より試験的に「NP_Views 1.0j」を使って「アクセス月間TOP50」などの表示を始めました。
本家(NP_Views、 NP_MostViewed)との違いは以下の通りです。
+一つのプラグインで実現(※本家はプラグイン...