2010年08月



あとで読む系のサービスといえば「Instapaper」と「Read it Later」が有名ですが、私は後者のヘビーユーザーです。iPhoneのBylineというGoogleリーダーを読むことのできるアプリで、通勤の時間とかに溜まったフィードを読んで、しっかり読みたい場合はRead it Laterに飛ばして家のPCでじっくり読むという使い方をしています。

Read it LaterにもAPIがあることを知ったのでちと試してみました。といっても未読リストをとってきてリンクリストを表示するだけの簡単なものです。GETリクエストを送ってXMLかJSONの形式で結果を返してくれます。もうこの手のAPIでは常套手段ですね。始め、XMLで結果を取得しようとしたのですが、整形式のXMLを返してくれません。XMLではルート要素は必ず一つという約束があるのですが、このXMLだとルート要素が4つ(status,list,since,complete)あります。これだとsimplexml_load_stringとかでパースしてもエラーとなってしまうのでJSON形式でデータを取得することにしました。

[xml light="ture"]

1


43458935
Twitterでフォローするだけで1000万円が当たるチャンス!プレツイドリームチャンス / プレツイ
http://pretwi.jp/
1282962096

1280718024
0


37665062
Doctrine - MongoDB Object Document Mapper
http://www.doctrine-project.org/projects/mongodb_odm

1282906537
1282906537
0


1282967427

1
[/xml]コードはこんな感じです。必須とかいてあるものはリクエストする際に必ず必要なものです。json_decodeの戻り値はオブジェクトなので要素のアクセスがラクチンです。

[php]
$url = "https://readitlaterlist.com/v2/get?";
$url .= "apikey=APIキー&"; //必須
$url .= "username=ユーザーID&"; //必須
$url .= "password=パスワード&"; //必須
$url .= "format=json&"; //出力形式はxmlかjsonを選べる
$url .= "state=unread"; //未読のもの

$contents = file_get_contents($url);
$jobj = json_decode($contents);

foreach($jobj->list as $item) {
echo '';
echo $item->title . "

";
}
?>
[/php]返ってくるJSONはこんな感じになります(2アイテムのみ表示)。

[javascript]
{
"status": 1,
"list": {
"37665062": {
"item_id": "37665062",
"title": "Doctrine - MongoDB Object Document Mapper",
"url": "http:\/\/www.doctrine-project.org\/projects\/mongodb_odm",
"time_updated": "1282906537",
"time_added": "1282906537",
"state": "0"
},
"45417238": {
"item_id": "45417238",
"title": "50 Stunning Examples of Photo Manipulation Art",
"url": "http:\/\/www.noupe.com\/inspiration\/50-stunning-examples-of-photo-manipulation-art.html",
"time_updated": "1282906499",
"time_added": "1282906499",
"state": "0"
}
},
"since": 1282969845,
"complete": 1
}
[/javascript]ブラウザで実行するとこんな感じで表示されます。リンクを表示させただけなのですごく味気ないですね(;^ω^)あまりに味気ないのでサムネイルを表示するAPIとはてなブックマークのAPIを組み合わせてみたのがコチラになります。



上記で使用したリクエストパラメータ以外にもいくつか条件を指定することができます。表にまとめておきます。
[table id=4 /]

このエントリーをはてなブックマークに追加

RSSやATOMのフィードをパースしてくれるライブラリSimplePieを試してたところ次のようなエラーメッセージが出た。


Warning: ./cache/aaa is not writeable. Make sure you've set the correct relative or absolute path, and that the location is server-writable. in /home/futaweb/www/sakura_app/lib/SimplePie/simplepie.inc on line 1780


コードは以下のようにチュートリアル通りに書いてたんですが、どうやらキャッシュフォルダを指定してあげないといけない様子。

[php]
require_once('../lib/SimplePie/simplepie.inc');

$feed = new SimplePie();
$feed->set_feed_url('http://fujitaiju.com/blog/feed/');
$feed->init();
$feed->handle_content_type();
?>
[/php]次のように直して、cacheフォルダを作ったらエラーは出なくなりました。うーん、キャッシュフォルダの指定はチュートリアルには書いてなかったけど、これって環境の問題なのかな?
[php]
require_once('../lib/SimplePie/simplepie.inc');

$feed = new SimplePie();
$feed->set_feed_url('http://fujitaiju.com/blog/feed/');
$feed->set_cache_location('./cache'); //キャッシュディレクトリを指定した。
$feed->set_cache_duration(600);
$feed->init();
$feed->handle_content_type();
?>
[/php]ちなみに、フィードURL、キャッシュディレクトリ、キャッシュの時間はSimplePieのコンストラクタとして指定してもいいみたいです。つまり、上のコードと次のコードは同じになります。ただ、この指定の仕方はSimplePieのバージョン1.3未満のやり方で、1.3以降はset_*関数を使って指定するのが正攻法のようです。
[php]
require_once('../lib/SimplePie/simplepie.inc');

$feed = new SimplePie('http://fujitaiju.com/blog/feed/', './cache', 600);
$feed->init();
$feed->handle_content_type();
?>
[/php]
このエントリーをはてなブックマークに追加



楽天BooksAPIをいじってたらISBN10では本の検索ができないことがわかり、ISBN10⇔13の変換プログラムを作りました。ポイントはISBNの末尾に付加されるチェックディジットだけでしょうか。ISBN10とISBN13ではチェックディジットの算出方法が違うので注意が必要です。算出方法については検索すればいっぱいでてくるのでそちらをどうぞ。

ISBNTranという関数に引数にISBNコードを入れれば変換後のISBNを返してくれます。ISBN10か13かは関数の中で判断して分岐させてるので、とりあえずISBN渡せばどちらにも変換します。
[php]
//ISBN13⇒10の変換
echo ISBNTran(9784534047120) . "
";
//ISBN10⇒13の変換
echo ISBNTran("477414259X");
function ISBNTran ($ISBN) {
if (strlen($ISBN) == 10) {
//ISBN10からISBN13への変換
$ISBNtmp = "978" . $ISBN;
$sum = 0;
for ($i = 0; $i < 12; $i++) {
$weight = ($i % 2 == 0 ? 1 : 3);
$sum += (int)substr($ISBNtmp, $i, 1) * (int)$weight;
}
//チェックディジットの計算
$checkDgt = (10 - $sum % 10) == 10 ? 0 : (10 - $sum % 10);
return "978" . substr($ISBN, 0, 9) . $checkDgt;
} elseif (strlen($ISBN) == 13) {
//ISBN13からISBN10への変換
$ISBNtmp = substr($ISBN, 3, 9);
$weight = 10;
$sum = 0;
for ($i = 0; $i < 9; $i++) {
$sum += (int)substr($ISBNtmp, $i, 1) * $weight;
$weight--;
}
//チェックディジットの計算
if ((11 - $sum % 11) == 11) {
$checkDgt = 0;
} elseif ((11 - $sum % 11) == 10) {
$checkDgt = "X";
} else {
$checkDgt = (11 - $sum % 11);
}
return substr($ISBN, 3, 9) . $checkDgt;
}
}
?>
[/php]ちなみにISBN13は頭3桁が978にしか対応してません。まぁ、今はほとんどが978なので問題ないでしょうけど。念のため。

このエントリーをはてなブックマークに追加

↑このページのトップヘ