ウェブサービスを作っています。

Zend_Service_Technorati を使ったら結構はまったのでメモ

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 で使っています。