便利なソーシャルボタンですが、標準仕様では表示が遅いのは仕方がありません。そこで、なんとか自前でソーシャルボタンを設置していこうと考えました。
まず、シェア・ツイートをするためのリンクは簡単に設置できます。次に、過去のシェア数を取得して表示する部分を作っていきます。
各種SNSのシェア数取得API
設置予定ボタンは、とりあえず今、このサイト「てく2テック」で使わせていただいているテーマのSimplicityに倣って、
- ツイート数(Twitter)
- Facebookシェア数
- Google+シェア数
- はてなブックマーク数
- GetPocket保存数
としておきます。インターネットを検索すると他にも
- Tumbler
など設置できそうなボタンはたくさん出てきます。
APIって
殆どのソーシャルネットワークサービスでは、シェア数に相当する数字を得るための機能、API(Application Programming Interface)を公開しています。
APIは、決められたURLに対してHTTPリクエスト(表示リクエスト)を行って、戻って来た反応を解析・表示できるようにしたもので、Web APIと呼ばれます。また、一度の通信で必要な情報をまとめて送ってくれる用に設計されたREST APIというモノになっています。
REST APIについては、下記ブログを参考にさせていただきました。

カウントを取得する方法を纏めてある記事
APIの呼び出し方法については、やはり検索ですよね?
あちこち調べて、記事執筆時点で役に立ちそうなサイトを列記しておきます。覚えておけば、追加が必要になった時に簡単に増やせます。

- 記事執筆時点で、Facebook、Googleプラス、はてなブックマーク、Pinterest、LinkedIn、Feedly、Bufferの7サイトに対応しています。記事のタイトルが9つなのに、8つ(Twitterが無効になったため)なのは、最後にサンプルプログラムをダウンロードする部分があって、間違えてカウントしてしまっているからです。良心的で素敵です。

- (英語)掲示板の質問なのですが、Redditの設置方法について回答がついています。

- (英語)GitHub上のページです。Facebook、Googleプラス、Pinterest、LinkedIn、StumbledUponの情報があります。ツイート数取得についても最新情報が投稿されてきています。
- (英語)Facebook、Googleプラス、Pinterest、LinkedIn、StumbledUponに加えて、Youtubeビデオの再生数を取得する方法が書かれています。レスポンスの例も載っています。

- GetPocketはAPIを公開していないので、公式のカウント数付きボタンをPHPで取得して中身を取り出します。通信量は1KBくらいなので、実はFacebookやTwitterのAPIよりも少なめです。ページに書かれている通り、予告なく仕様が変えられる可能性はありますが、少なくともここ数年は変わっていません。
PHPで作ったシェア数カウントスクリプト
ということで、自前のシェア数カウントスクリプトをPHPで組みました。
ボタンを追加したくなった時も、API仕様さえ分かればそんなに大変そうではありません。
シェア数カウントの準備
//facebook// $ch["facebook"] = curl_init("http://graph.facebook.com/?id=$URL"); curl_setopt($ch["facebook"], CURLOPT_RETURNTRANSFER, 1); //Google Plus// $ch["gplus"] = curl_init(); curl_setopt($ch["gplus"], CURLOPT_URL, "https://clients6.google.com/rpc?key=AIzaSyCKSbrvQasunBoV16zDH9R33D88CeLr9gQ"); curl_setopt($ch["gplus"], CURLOPT_RETURNTRANSFER, 1); curl_setopt( $ch["gplus"], CURLOPT_POST, 1 ); curl_setopt( $ch["gplus"], CURLOPT_HTTPHEADER, array( 'Content-type: application/json' ) ) ; curl_setopt( $ch["gplus"], CURLOPT_POSTFIELDS, '[{"method":"pos.plusones.get","id":"p","params":{"nolog":true,"id":"'. $URL. '","source":"widget","userId":"@viewer","groupId":"@self"},"jsonrpc":"2.0","key":"p","apiVersion":"v1"}]' ); //HATENA// $ch["hatena"] = curl_init("http://api.b.st-hatena.com/entry.count?url=$URL"); curl_setopt($ch["hatena"], CURLOPT_RETURNTRANSFER, 1); //Reddit// $ch["reddit"] = curl_init("http://www.reddit.com/api/info.json?url=$URL"); curl_setopt($ch["reddit"], CURLOPT_RETURNTRANSFER, 1); //Pocket// $ch["pocket"] = curl_init("https://widgets.getpocket.com/v1/button?label=pocket&count=vertical&align=left&v=1&url=$URL"); curl_setopt($ch["pocket"], CURLOPT_RETURNTRANSFER, 1);
比較的シンプルですね。
Google+はユーザーごとにAPIキーを取得しないといけない、はず、なのですがAPIキーの取得ができません。代わりに開発者用テストキー「AIzaSyCKSbrvQasunBoV16zDH9R33D88CeLr9gQ」が公開されていて、今のところこの開発者用キーで動作します。そのため、APIの呼び出し制限もありません。
いずれ変わるかもしれません。
API応答の解析
$count_facebook_json = json_decode( $ch["facebook"]の結果 ) , true ) ;
$count_facebook = (array_key_exists("shares", $count_facebook_json)) ? $count_facebook_json["shares"] : "0" ;
Google+
$count_gplus_json = json_decode( $ch["gplus"]の結果 ) , true ) ;
echo "(234)GooglgPLUS:". $count_gplus_json[0]["result"]["metadata"]["globalCounts"]["count"] ."<br/>";
はてなブックマーク
$count_hatena = $ch["hatena"]の結果 ;
if(empty($count_hatena)) $count_hatena = "0";
$count_reddit_json = json_decode( $ch["reddit"]の結果 ) , true ) ;
$count_reddit = (count($count_reddit_json["data"]["children"])==0)?0:$count_reddit_json["data"]["children"][0]["score"];
GetPocket
$count_pocket_html = $ch["pocket"]の結果 ;
preg_match('{<em id="cnt">(\d+)</em>}',$count_pocket_html,$count_pocket);
Joomla!のモジュール内でもそんなに遅くない
このルーチンをJoomla!内に設置しました。記事を表示する過程にAPI呼び出しが追加されるので、ページ表示速度が遅くなります。
ただ、試した限りでは体感速度はほとんど変わりませんでした。そんなに遅くはありません。これなら、なんとか行けそうです。(注:curl_multiで並列処理しています)
いままで、公式Facebookボタンがいつまでも表示されない状態だった時よりは快適です。
Twitterのツイート数は?
問題は、Twitterのツイート数です。2015年11月にツイート数を取得する非公式APIが廃止されてしまい、取得が難しくなりました。
一般人でも、制限はありますが出来ないことはないのでツイート数を取得するPHPコードを次に作ります。認証が必要だったり、API呼び出し制限があったりと、だいぶ面倒です。
コメント