Google+1 と Pocket のソーシャルカウントを取得する

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

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>