PHP5でBloglinesの特定フォルダにあるフィードリストを取得するメモ
たとえばブログのサイドバーやガジェットなどにお気に入りのブログのリストをランダムに表示させたい場合に、Bloglinesで購読しているフィードで特定フォルダに入っているものを自動的に取得してくれば管理もしやすい。
レンタルサーバを乗り換えてPHP5系になったのでSimpleXMLが使えるじゃないかということで、Bloglinesの配信APIから取得した自分の登録フィードリストをSimpleXMLでパースして特定フォルダ内のフィードリストを取得してみた。
ポイントは、レスポンスのOPMLをmb_convert_encodingを使ってUTF-8からUTF-8へ一度変換しないとSimpleXMLでエラーになってしまうということと、SimpleXMLではXPathで簡単に特定要素を抽出できるというところです。
以下のサンプルコード内で使っている定数は別途定義してください。
<?php
/**
* Bloglinesから特定フォルダを取得
*/
require_once("HTTP/Request.php");
require_once("Cache/Lite.php");
/* Bloglines配信API */
$url = "http://rpc.bloglines.com/listsubs";
/* use Cache_Lite */
$options = array(
'cacheDir' => CACHE_DIR,
'lifeTime' => 86400,
'pearErrorMode' => CACHE_LITE_ERROR_DIE,
);
$cache = new Cache_Lite($options);
/* 古いキャッシュの削除 */
$cache->clean(false, "old");
/* キャッシュ取得 */
$body = $cache->get($url);
/* キャッシュが取得できなかったら */
if (!$body) {
/* HTTP_Request */
$req =& new HTTP_Request($url);
/* Basic認証 */
$req->setBasicAuth(YOUR_BLOGLINES_ID, YOUR_BLOGLINES_PASSWORD);
$response = $req->sendRequest();
if (PEAR::isError($response)) {
exit;
}
$status = $req->getResponseCode();
if ($status == 200) {
/* UTF-8からUTF-8へ変換しないとエラーになる */
$body = mb_convert_encoding($req->getResponseBody(), "UTF-8", "UTF-8");
/* キャッシュを保存 */
$cache->save($body, $url);
} else {
exit;
}
}
/* SimpleXMLElementクラス生成 */
$opml = new SimpleXMLElement($body);
/* SimpleXMLはXPathで要素を取得できる */
foreach ($opml->xpath("//outline") as $outline) {
if ($outline["title"] != "* favorite *") {
/* フォルダ名が"* favorite *"でなければスキップ */
continue;
}
/* 該当フォルダの子要素"outline"を取得 */
foreach ($outline->xpath("./outline") as $feed) {
/* タイトルを出力 */
echo $feed["title"] . "<br />";
}
break;
}
?>
コメントを残す