PHP やってます。
ところで、テクノラティの API をきれいに扱える Zend_Service_Technorati というライブラリがあります。
使ってみたら確かにきれいに書けたのですが、結構変なことが起こったのでメモ。
基本的には、
<?php $tech = new Zend_Service_Technorati('API_KEY'); $resultSet = $tech->search('はてな', array('language' => 'ja', 'limit' => 30)); foreach ($resultSet as $v) { $title = $v->getTitle(); $excerpt = $v->getExcerpt(); $permalink = (string) $v->getPermalink(); $created = $v->getCreated(); $created->add('9', Zend_Date::HOUR); // GMT で返ってくるので日本時間にする $created = $created->toString('yyyy-MM-dd HH:mm:ss'); }
のような感じで使います。
取得失敗時には、例外が発生します。
Zend_Service_Technorati_SearchResult#getPermalink() の戻り値は、文字列じゃなくて Zend_Uri_Http オブジェクトなので、文字列にする場合はタイプキャストします。
日付のあたりがトリッキーですが、Zend の脅威はこんなもんでは終わりません。
問題1. サーバからアクセスすると、投稿日がおかしくなる
サーバから上のスクリプトを実行すると、投稿日が未来の日付で返ってきたりします。
Zend Framework はいろんな Zend_* クラスが絡み合っていて、そこまで深追いしませんでしたが Zend_Locale が影響している模様。
<?php Zend_Locale::setDefault('ja_JP');
を最初の方に入れたら解決。
問題2. データが最新ではない
普通にテクノラティで検索した場合と、API の取得結果が若干異なります (普通に検索した方が、最新のものを含んでいる)。
まあこれは API 利用時によくあることなのでいいんですが、Zend_Service_Technorati を使わず API ガイドの通り叩いた場合と Zend_Service_Technorati を使った場合の結果が異なっていたので、これは何かがおかしい。
結論としては、API ガイド (日本語) に書かれている API のドメインは、
api.technorati.jp
なのですが、Zend_Service_Technorati が叩いている API のドメインは、
api.technorati.com
で、api.technorati.com と api.technorati.jp では結果が異なるんですね。
api.technorati.com っていうのは、Zend_Service_Technorati::API_URI_BASE に書かれています。
解決策としては Zend_Service_Technorati::API_URI_BASE を書き換えればいいと思いますが、そこまでする必要も感じなかったので理解して終了。
というわけで、Zend Framework は美しいです。
ちなみに CakePHP で使っています。