Do You PHP はてブロ

Do You PHPはてなからはてブロに移動しました

PEAR::Services_FeedMeter作ってみた

指定したfeedの現ランキングを取得するためのPEARパッケージを作ってみました。つか、初めてまともにパッケージ作った。。。(^^;

実装内容ですが、フィードメーター -ブログの人気度と更新頻度を測定する無料サービスからは特に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ホントに楽だ〜。公開ありがとうございます :-)