Google+1 のソーシャルカウントについては SharedCount 経由で取得していたのですが、先ほど SharedCount からの反応がまったくなくなっていました。すぐに復帰したようなので一時的なものだったようですが、この際なので自力で取得する形に変更しました。ついでに、以前からの懸念点である Pocket のソーシャルカウントについてもメモ。
Google+1
Google+1 のソーシャルカウントを取得するコードは以下の通り。
require 'net/http' require 'uri' require 'json' def count_google_plusone(uri) key = 'AIzaSyCKSbrvQasunBoV16zDH9R33D88CeLr9gQ' api = URI.parse("https://clients6.google.com/rpc?key=#{key}") request = Net::HTTP::Post.new(api.request_uri, { 'Content-Type' =>'application/json' }) request.body = [{ :jsonrpc => "2.0", :method => "pos.plusones.get", :apiVersion => "v1", :key => "p", :id => "p", :params => { :id => uri, :userId => "@viewer", :groupId => "@self", :nolog => true, }, }].to_json response = Net::HTTP.start(api.host, api.port, :use_ssl => true) { |http| http.verify_mode = OpenSSL::SSL::VERIFY_NONE http.request(request) } json = JSON.parse(response.body) return json[0]['result']['metadata']['globalCounts']['count'].round end
今まで SharedCount に頼ってた最大の理由は「API キーって、一体、何を指定するの?」と言うものだったのですが、一通りググってみた所、SharedCount の実装も含めて皆、API キーには AIzaSyCKSbrvQasunBoV16zDH9R33D88CeLr9gQ と言う固定キーを使用しているようです。そのキー何よ……と言う疑念がまだ晴れないでいるのですが、現時点では他の実装に倣っておきます。
Pocket のソーシャルカウントについては、現時点でも取得方法が判明していません。一応、以下のようなコードを書けば無理やり取得する事は可能です。
require 'net/http' require 'uri' require 'cgi' require 'nokogiri' def count_pocket(uri) api = 'http://widgets.getpocket.com/v1/button' request = URI.parse("#{api}?v=1&count=horizontal&url=#{CGI.escape(uri)}") response = Net::HTTP.get(request) doc = Nokogiri::HTML(response, nil, 'utf-8') count = doc.css("#cnt").first.content return count.to_i end
ただ、対象の HTML の中身を見ても明確に「スクレイプはするな」との注意書きが書かれているので、この方法で取得する事はやめています。api@getpocket.com に連絡しろとの事なので、少なくとも現時点では、Pocket のソーシャルカウントを取得するオープンな方法は存在しないのかもしれません。
<div class="widget horizontal pocket left"> <a id="btn"> <!-- Please do not scrape this for the Pocket count. It is not relible for you to use and will likely change. Contact us at api@getpocket.com for an official API. Thanks! --> <span><em id="cnt">131996</em><i></i><u></u></span> <b></b> </a> </div>