はてなブックマーク件数取得API を使ってみたくて pear の XML_RPC2 を使ったときのこと
XML_RPC2 インストール
http://d.hatena.ne.jp/moogme/20090530
はてなブックマーク件数取得APIはこれ
http://d.hatena.ne.jp/keyword/%A4%CF%A4%C6%A4%CA%A5%D6%A5%C3%A5%AF%A5%DE%A1%BC%A5%AF%B7%EF%BF%F4%BC%E8%C6%C0API
URLを渡せば、ブックマーク数を返してくれるXML-RPC のAPI。
しかも、
件数を取得したいURLを指定(複数指定可能/50件まで)
と複数のURLを渡せるらしい。
<? equire_once( "XML/RPC2/Client.php" ); $options = array( "backend" => "php", // Backend.php の getBackend() で XML_RPC2_Exception をキャッチして php を設定しているので設定すべき "encoding" => "UTF-8", // デフォルトが iso-8859-1 なので "prefix" => "bookmark." ); $client = XML_RPC2_Client::create( "http://b.hatena.ne.jp/xmlrpc", $options ); try { $res = $client->getCount( "http://www.yahoo.co.jp/", "http://www.google.co.jp/" ); print_r( $res ); } catch (XML_RPC2_FaultException $e) { // XMLRPC サーバが XMLRPC のエラーを返しました die('Exception #' . $e->getFaultCode() . ' : ' . $e->getFaultString()); } catch (Exception $e) { // その他のエラー (HTTP あるいはネットワークの問題など...) die('Exception : ' . $e->getMessage()); } ?>
以下のような結果を取得できた。
Array ( [http://www.yahoo.co.jp/] => 5062 [http://www.google.co.jp/] => 2790 )
と複数返ってくるものの、色々試していると、50件どころか、10件を超えると失敗することがある。9件でリクエストしてもたまに失敗している様子。
結果 5件ずつ、0.4秒おきにリクエストすれば失敗しなかった。タイミングの問題もあるのかな?
あと、個人的には、この引数の渡し方はすごく使いにくいので、
$res = $client->getCount( "http://www.yahoo.co.jp/", "http://www.google.co.jp/" );
手を加えた。
$ pear config-get php_dir /usr/share/php
でインストール先のディレクトリを調べ
/usr/share/php/XML/RPC2/Backend/Php/Client.php
のファイルに
*/ public function remoteCall___($methodName, $parameters) { + $parameters = $parameters[ 0 ]; $request = new XML_RPC2_Backend_Php_Request($this->prefix . $methodName, $this->encoding); $request->setParameters($parameters); $request = $request->encode();
の1行を加えた。
これで、以下のようにパラメータを渡せるようになった。
$params = array(
"http://www.yahoo.co.jp/",
"http://www.google.co.jp/"
);
$res = $client->getCount( $params );
手も加えちゃったし、pearで入れるんじゃなくて、結局サービスのライブラリとして持つことにした。
XML_RPC2 ってクラス変数にアンスコがあったり、なかったりと、妙に気になるソースコードだった。
ほんというと、 はてなexist API が複数のURLに対応してくれれば一番いいのに。
http://d.hatena.ne.jp/keyword/%A4%CF%A4%C6%A4%CAexist%20API?kid=102640
愚痴だけど、ドキュメントには
<?xml version="1.0" ?> <existxml> <count name="diary">401</count> <count name="antenna">1</count> <count name="bookmark">172</count> </existxml>
と、はてブ数も返ってくる仕様になってるのに。
http://d.hatena.ne.jp/exist?mode=xml&url=http://www.yahoo.co.jp/
を叩いてみても
<?xml version="1.0"?> <existxml> <count name="diary">1988</count> <count name="antenna">1</count> </existxml>
と、ブックマーク数が空行になって返ってこない。
参考にさせて頂きました。
http://www.hoge256.net/2008/09/201.html