ソーシャルボタンのシェア数カウンターを作る—Javascriptフリーで軽く!(3)

サイト運営

便利なソーシャルボタンですが、標準仕様では表示が遅いのは仕方がありません。そこで、なんとか自前でソーシャルボタンを設置していこうと考えました。

まず、シェア・ツイートをするためのリンクは簡単に設置できます。次に、過去のシェア数を取得して表示する部分を作っていきます。

各種SNSのシェア数取得API

設置予定ボタンは、とりあえず今、このサイト「てく2テック」で使わせていただいているテーマのSimplicityに倣って、

  • ツイート数(Twitter)
  • Facebookシェア数
  • Google+シェア数
  • はてなブックマーク数
  • GetPocket保存数

としておきます。インターネットを検索すると他にも

  • LinkedIn
  • Tumbler
  • Pinterest
  • Reddit

など設置できそうなボタンはたくさん出てきます。

APIって

殆どのソーシャルネットワークサービスでは、シェア数に相当する数字を得るための機能、API(Application Programming Interface)を公開しています。

APIは、決められたURLに対してHTTPリクエスト(表示リクエスト)を行って、戻って来た反応を解析・表示できるようにしたもので、Web APIと呼ばれます。また、一度の通信で必要な情報をまとめて送ってくれる用に設計されたREST APIというモノになっています。

REST APIについては、下記ブログを参考にさせていただきました。

REST APIとは? – API設計のポイント!
最近は様々なサービスでWebAPIが提供されています。普段の開発をする中でもシステム連携などでAPIを作る機会が出てくるのではないでしょうか。WebAPIの中でもREST APIなんてものもよく聞くのかなぁと思います。

カウントを取得する方法を纏めてある記事

APIの呼び出し方法については、やはり検索ですよね?

あちこち調べて、記事執筆時点で役に立ちそうなサイトを列記しておきます。覚えておけば、追加が必要になった時に簡単に増やせます。

ソーシャルカウントの取得方法まとめ(全9サイト)
Twitter、Facebook、Google+など各SNSのカウント数を取得する方法をPHP、Javascriptを例に解説します。
  • 記事執筆時点で、Facebook、Googleプラス、はてなブックマーク、Pinterest、LinkedIn、Feedly、Bufferの7サイトに対応しています。記事のタイトルが9つなのに、8つ(Twitterが無効になったため)なのは、最後にサンプルプログラムをダウンロードする部分があって、間違えてカウントしてしまっているからです。良心的で素敵です。
Get score for an url on Reddit, using jQuery getJSON
I am trying to get the score for a certain URL from reddit. To add a "share with reddit (count)" link: function redditCounter(url) { // Get number of counts ...
  • (英語)掲示板の質問なのですが、Redditの設置方法について回答がついています。
Get the share counts from various APIs
Get the share counts from various APIs. GitHub Gist: instantly share code, notes, and snippets.
  • (英語)GitHub上のページです。Facebook、Googleプラス、Pinterest、LinkedIn、StumbledUponの情報があります。ツイート数取得についても最新情報が投稿されてきています。
Tips to Choose the Best Template For Your Website
Choosing a template for your website is an important task that is commonly ignored for all the wrong set of reasons.
  • (英語)Facebook、Googleプラス、Pinterest、LinkedIn、StumbledUponに加えて、Youtubeビデオの再生数を取得する方法が書かれています。レスポンスの例も載っています。
[試] Pocketブックマーク数(ある意味シェア数)の取得方法 | Pocket公式APIないけどどうする?
現時点でPocketブックマーク数単体取得に利用可能な公式APIは提供されていません。その中でありそうでなかったPocketブックマーク数を取得する方法を紹介します。SNSのシェアボタンをオリジナルで作成されている方に贈ります。色々と応用してみて下さい。
  • 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応答の解析

Facebook

$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";

Reddit

$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呼び出しが追加されるので、ページ表示速度が遅くなります。

social-share-buttons-with-count

ただ、試した限りでは体感速度はほとんど変わりませんでした。そんなに遅くはありません。これなら、なんとか行けそうです。(注:curl_multiで並列処理しています)

いままで、公式Facebookボタンがいつまでも表示されない状態だった時よりは快適です。

Twitterのツイート数は?

問題は、Twitterのツイート数です。2015年11月にツイート数を取得する非公式APIが廃止されてしまい、取得が難しくなりました。

一般人でも、制限はありますが出来ないことはないのでツイート数を取得するPHPコードを次に作ります。認証が必要だったり、API呼び出し制限があったりと、だいぶ面倒です。

コメント

タイトルとURLをコピーしました