はてなブックマーク件数取得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-RPCAPI
しかも、

 件数を取得したい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