facebookのapiを調べてたら、graph apiへのアクセスを1/50に減らせる方法があることが分かったので共有しま〜す!!
api仕様
facebookのdeveloperサイトの以下のページに詳細が記載されています。
https://developers.facebook.com/docs/graph-api/making-multiple-requests/
rbファイルで書いてみる
今回はシンプルにurlのlike数を返してくれるapiを使って、
一気に50個のurlをapiに投げてみます。
引数にurlの配列urlsを渡す場合を書いてみます。
get_like_count.rb
def self.get_like_counts(urls)
batch_data = []
urls.each do |url|
batch_data << { 'method' => 'GET', 'relative_url' => "?ids=#{url}" }
end
uri = URI(#{FACEBOOK_GRAPH_API_URL})
timeout = 60
https = Net::HTTP.new(uri.hostname, uri.port)
https.use_ssl = true
res = https.start do |h|
h.open_timeout = timeout
h.read_timeout = timeout
req = Net::HTTP::Post.new(uri)
req.form_data = {
'access_token' => #{APP_ACCESS_TOKEN}, ※なくてもいい
'batch' => batch_data.to_json
}
h.request req
end
end
※このbatch_dataの配列に入れるmethodとrelative_urlの組み合わせで、どんなapiも50回までまとめて送れます。
実際に実行してみます。
urls = [
"http://job-share.net/",
"http://atrae.co.jp/"
]
GetLikeCount.get_like_counts(urls)
と実行すればOKです。
50個分のデータが配列として一回で返ってくる
ActiveSupport::JSON.decode(res.body).each_with_index do |content,index|
p content
end
===
"body" : [{
"http://job-share.net": {
"id": "http://job-share.net",
"shares": 1083
},
"http://atrae.co.jp": {
"id": "http://atrae.co.jp",
"shares": 259
},
…(50個分が配列で返ってくる)
]
}
感想
ちょ〜便利〜!!
オーバーヘッドが1/50になって早ぇ〜
APIのアクセス数が制限されて拒否られる可能性も減る〜
ということで、facebook app developerの方で知らなかった〜って方は即導入してみてください!