こんばんは。ppBlogでは、代表的なソーシャルブックマーク(SBM)の被リンク数を記事ごとに表示できる機能が付いていますが、いくつか古いAPIを用いていて、きちんとブックマーク数が取得出来ていないものもありました。なので最新のものを調べたのでメモがてら。
ppBlogで初めから用意しているSBMは、はてなブックマーク、del.icio.us、livedoorクリップ、Buzzurl(バザール)、Yahoo!ブックマークの5つです。グーグルも付けてはいますが(登録用のアイコン表示のみ)、グーグルには被リンク数を表示するAPIがないみたいなので、今回はスルーします。
以前は、被リンク数を取得するAPIとして、画像での提供のみのところもあったと思いますが、今では、この5つのどれもがJSON形式GあるいはXML形式での情報取得に対応しているので、幾分扱いやすくなっています。個別に見ていきましょう。各々、JSON(XML)へのリンクおよびカウンター値の形式を挙げています。カウンターの値は、正規表現などを用いて簡単に取り出せます。
- ♥はてなブックマーク
- http://b.hatena.ne.jp/entry/json/?url=(エンコードしたURL)
- JSONでのカウンター取得値:"count":"(¥d+)"
- ♥del.icio.us
- http://badges.del.icio.us/feeds/json/url/blogbadge?hash=(md5ハッシュ化したURL)
- JSONでのカウンター取得値:"total_posts":"(¥d+)"
- ♥livedoorクリップ
- http://api.clip.livedoor.com/json/comments?link=(エンコードしたURL)
- JSONでのカウンター取得値:"total_clip_count":(¥d+),
- ♥Buzzurl(バザール)
- http://api.buzzurl.jp/api/counter/v1/json?url=(エンコードしたURL)
- JSONでのカウンター取得値:"users":(¥d+),
- ♥Yahoo!ブックマーク
- http://num.bookmarks.yahoo.co.jp/yjnostb.php?urls=(エンコードしたURL)
- XMLでのカウンター取得値:ct="(¥d+)"
補足しておくと、最後のYahooでの指定ではJSONではなく、以下のようなXMLを返します。直接、カウント数を取得することが出来ます。
<?xml version="1.0" encoding="utf-8" ?> <results> <SAVE_COUNT u="http%3A%2F%2Fp2b.jp%2Findex.php%3FUID%3D1188848148" ct="6" /> </results>
先ほど述べたように、カウント数は、JSON形式や、XML形式で取得できるので、さらにそれをパースして・・・とやっても良いでしょうが、ここはPHPの正規表現のみで簡単に取り出せるので、それで十分でしょう。
さて、上記で挙げたSBMサービスでは、このようにJSONといった文字列でカウンターを取得できますが、他のSBMサービスによっては、画像カウンターでしか取得できないところもあります。例えば、FC2ブックマーク では、自分の知る限り、画像でのみ被リンク数の取得が可能です。この場合は、どうしたら数字を文字列として取り出せるでしょうか?
画像で提供しているところでは、たいてい数字を出力する画像ファイルにリダイレクトさせるという手段を講じているので、このリダイレクト先のURLを知ることが出来れば、文字列として取得可能です。PHPを使いたい場合、どうやるか? FC2を具体例に挙げると、画像カウンター取得URLは以下で与えられます。
http://bookmark.fc2.com/image/users/(取得したいURL)
まず、最初に考えるのは、とりあえず、PHP組み込み関数のfile_get_contents()関数 を用いて、出力してみること。
<?php $url = 'http://bookmark.fc2.com/image/users/http://p2b.jp/index.php?UID=1188848148'; echo file_get_contents($url); // とにかく書き出してみる ?>
結果は、まぁ当たり前ですが、リダイレクトされた後のPNG画像(ヘッダーを正しく出力していないので文字化けするけど)が出力されます。リダイレクト後のURLは、この場合、被リンク数がゼロなので、
http://bookmark.fc2.com/icons/00000.png
となっています。この00000.pngの部分を取り出すことが出来ればよいわけです。PHPには、最初から色々便利な関数が準備されているので、それを利用します。ここでは、stream_get_meta_data() 関数を使いましょう。この関数を使うことで、まずサーバーが返す情報配列を得ることができて、それを解析すれば、リダイレクト先の情報もゲットできます。この場合は、以下のような配列を返します(一部Xの文字で情報を隠しています)。
Array ( [wrapper_data] => Array ( [0] => HTTP/1.1 302 Found /* 多くのクライアントは、このステータスコードをリダイレクトと解釈する */ [1] => Date: Sun, 03 Aug 2008 00:19:03 GMT [2] => Server: XXXXXXXXXXXXXXXXXXXXXXXXXX [3] => X-Powered-By: XXXXXXXXXXXXX [4] => Set-Cookie: CAKEPHP=XXXXXXXXXXXXXXXXXXXXX; path=/ [5] => P3P: CP="XXXXXXXXXXXXXX" [6] => Location: http://bookmark.fc2.com/icons/00000.png /* リダイレクト先 */ [7] => Content-Length: 0 [8] => Connection: close [9] => Content-Type: text/html [10] => Content-Language: en [11] => HTTP/1.1 200 OK [12] => Date: Sun, 03 Aug 2008 00:19:03 GMT [13] => Server: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX [14] => Last-Modified: Fri, 25 Aug 2006 09:03:28 GMT [15] => ETag: "XXXXXXXXXXXXXX" [16] => Accept-Ranges: bytes [17] => Content-Length: 90 [18] => Connection: close [19] => Content-Type: image/png [20] => Content-Language: en ) [wrapper_type] => http [stream_type] => tcp_socket [mode] => r+ [unread_bytes] => 90 [seekable] => [uri] => http://bookmark.fc2.com/image/users/http://p2b.jp/index.php?UID=1188848148 [timed_out] => [blocked] => 1 [eof] => )
wrapper_dataというキーの値が更に配列になっていて、その中のLocation:という文字列がある行を探し出せばOKです。具体的には以下のような記述になるでしょう。
$url = 'http://bookmark.fc2.com/image/users/http://p2b.jp/index.php?UID=1188848148'; if($fp = @fopen($url, 'r')){ $meta = stream_get_meta_data($fp); foreach($meta['wrapper_data'] as $r) { if(substr(strtolower($r), 0, 9) == 'location:') { $count = preg_replace('{^.+/(¥d+)¥.(?:png|gif)$}', '¥¥1', $r); /* 画像カウンタはほぼPNGかGIFファイル */ break; } } $count = sprintf('%d', "$count"); } else $count = 0;
最新版のutils.phpでは、この画像カウントのものは採用していませんが、この記述を組み込めば、画像カウンターからの取得も可能ですね。
一応、これを反映させた最新版のutils.phpを添付しておきます。1895行目からのsocialBookmark()関数の中身が変わっています。

続き »