PEAR::Services_FeedMeter作ってみた
指定したfeedの現ランキングを取得するためのPEARパッケージを作ってみました。つか、初めてまともにパッケージ作った。。。(^^;
- Services_FeedMeter-0.1.0.tgz(alpha版:PHP5専用です)
実装内容ですが、フィードメーター -ブログの人気度と更新頻度を測定する無料サービスからは特にAPIが提供されていないので、フィードメーター -ブログの人気度と更新頻度を測定する無料サービスの詳細ページ(たとえば、このはてダの場合、http://feedmeter.net/detail.php?r=http%3A%2F%2Fd.hatena.ne.jp%2Fshimooka%2Frss)をスクレイピングして、順位の部分を正規表現で抜き出してるだけです。また、ランキングの取得しか機能がありません。この詳細ページはHTML4.01ですが、ホントはTidyとかでXHTMLに変換し、SimpleXMLか何かで採り回したかったんですが、今回はベタに実装しています。
# pear install -a http://www.doyouphp.jp/pear/Services_FeedMeter-0.1.0.tgz
な感じで。HTTP_Request1.4.1以上が必要になります。
使い方ですが、以下の通り、コンストラクタにfeedのURLを指定してgetRank()を呼び出すだけです。
<?php require_once "Services/FeedMeter.php"; $meter = new Services_FeedMeter('http://www3.asahi.com/rss/index.rdf'); var_dump($meter->getRequestUrl()); var_dump($meter->getRank());
で、このパッケージをを使ってSparklineを使ってミニグラフを作る - Do You PHP はてなのようなミニグラフを作ってみました。Do You PHP?に確認環境を用意しましたので、気になる方はどうぞ。今のところ、毎日午前0時にデータを更新するバッチを動作させるようにしています。
<?php ini_set('mbstring.internal_encoding', 'utf-8'); ini_set('mbstring.script_encoding', 'utf-8'); error_reporting(E_ALL); require_once 'Services/FeedMeter.php'; define('TARGET_URL', 'http://d.hatena.ne.jp/shimooka/rss'); /** * エラーなどの場合、いろいろと面倒なので301位(ランク外)扱いにする */ $rank = 301; try { $feedmeter = new Services_FeedMeter(TARGET_URL); $rank = $feedmeter->getRank(); } catch (Exception $e) { echo $e->getMessages(); } $dsn = 'sqlite:/path/to/sqlitedb'; try { $db = new PDO($dsn); $db->setAttribute(PDO::ATTR_CASE, PDO::CASE_LOWER); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch (PDOException $e) { die('Connection failed: ' . $e->getMessage()); } $stmt = $db->prepare('INSERT INTO feedmeter_ranking (dt, rank) VALUES (?, ?) '); $dt = date('YmdHis'); $stmt->bindParam(1, $dt); $stmt->bindParam(2, $rank); try { $db->beginTransaction(); $stmt->execute(); $db->commit(); } catch (PDOException $e) { $db->rollback(); die('transaction failed: ' . $e->getMessage()); }
また、パッケージの作成には、PEAR_PackageProjector 0.1.3を使わせていただきました。で、二点ほど。
- 「derictory」って「directory」のtypoですかね?
- Derictory.phpのgetRealpathメソッドで、$_ENV['PWD']が取得できません。というか、$_ENVが空の配列になります(PHP5.2.3 on CentOS4.5)。とりあえず、getcwd()を使ってしのぎました。
上記でちょっとハマりましたが、それ以降は
$ pearproj --create -p Services_FeedMeter $ cd Services_FeedMeter $ ./build
とし、build.confを編集してbuildコマンドを実行し、様子を見つつbuild.confを編集(略)。。。といった流れでパッケージを作成できました。
いずれにしても、PEAR_PackageProjectorホントに楽だ〜。公開ありがとうございます :-)