ppBlog Warning: LINE 1117 of utils.php: preg_match(): The /e modifier is no longer supported, use preg_replace_callback instead

ソーシャルブックマークでの被リンク数を取得する最新APIまとめ

ソーシャルブックマークでの被リンク数を取得する最新APIまとめ

category-icon

 こんばんは。ppBlogでは、代表的なソーシャルブックマーク(SBM)の被リンク数を記事ごとに表示できる機能が付いていますが、いくつか古いAPIを用いていて、きちんとブックマーク数が取得出来ていないものもありました。なので最新のものを調べたのでメモがてら。

 ppBlogで初めから用意しているSBMは、はてなブックマークdel.icio.uslivedoorクリップBuzzurl(バザール)、Yahoo!ブックマークの5つです。グーグルも付けてはいますが(登録用のアイコン表示のみ)、グーグルには被リンク数を表示するAPIがないみたいなので、今回はスルーします。

 以前は、被リンク数を取得するAPIとして、画像での提供のみのところもあったと思いますが、今では、この5つのどれもがJSON形式GあるいはXML形式での情報取得に対応しているので、幾分扱いやすくなっています。個別に見ていきましょう。各々、JSON(XML)へのリンクおよびカウンター値の形式を挙げています。カウンターの値は、正規表現などを用いて簡単に取り出せます。

はてなブックマークLink
http://b.hatena.ne.jp/entry/json/?url=(エンコードしたURL)
JSONでのカウンター取得値:"count":"(¥d+)"
del.icio.usLink
http://badges.del.icio.us/feeds/json/url/blogbadge?hash=(md5ハッシュ化したURL)
JSONでのカウンター取得値:"total_posts":"(¥d+)"
livedoorクリップLink
http://api.clip.livedoor.com/json/comments?link=(エンコードしたURL)
JSONでのカウンター取得値:"total_clip_count":(¥d+),
Buzzurl(バザール)Link
http://api.buzzurl.jp/api/counter/v1/json?url=(エンコードしたURL)
JSONでのカウンター取得値:"users":(¥d+),
Yahoo!ブックマークLink
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ブックマークLink では、自分の知る限り、画像でのみ被リンク数の取得が可能です。この場合は、どうしたら数字を文字列として取り出せるでしょうか?

 画像で提供しているところでは、たいてい数字を出力する画像ファイルにリダイレクトさせるという手段を講じているので、このリダイレクト先のURLを知ることが出来れば、文字列として取得可能です。PHPを使いたい場合、どうやるか? FC2を具体例に挙げると、画像カウンター取得URLは以下で与えられます。

http://bookmark.fc2.com/image/users/(取得したいURL)

まず、最初に考えるのは、とりあえず、PHP組み込み関数のfile_get_contents()関数Link を用いて、出力してみること。

<?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()Link 関数を使いましょう。この関数を使うことで、まずサーバーが返す情報配列を得ることができて、それを解析すれば、リダイレクト先の情報もゲットできます。この場合は、以下のような配列を返します(一部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()関数の中身が変わっています。

添付ファイル: utils.phpattachedIcon 

— posted by martin at 09:59 am   commentComment [0]  pingTrackBack [1]

この記事に対するコメント・トラックバック [1件]

scrollUp1. 閃光的網站・弛緩複合体 -Review Division- Website — 2008/08/07@22:48:10

今回は慣れない JavaScript の話。
続き »

この記事に対する TrackBack URL:

設定によりTB元のページに、こちらの記事への言及(この記事へのリンク)がなければ、TB受付不可となりますのであらかじめご了承下さい。

コメントをどうぞ。 名前(ペンネーム)と画像認証のひらがな4文字は必須で、ウェブサイトURLはオプションです。

ウェブサイト (U):

タグは使えません。http://・・・ は自動的にリンク表示となります

:) :D 8-) ;-) :P :E :o :( (TT) ):T (--) (++!) ?;w) (-o-) (**!) ;v) f(--; :B l_P~

     
T: Y: ALL: Online:
Created in 0.0044 sec.
prev
2024.3
next
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31