RailsとFacebook API / 地元出身の友達を探してみる

Shunsuke Sawada

この間から外部APIとの連携をやってみてるけど、いろいろ楽しいね。巨人の肩に乗ると、いきなりサイトがパワーアップした感じがでるので嬉しいこともある。
今回はFacebookのAPIをRails4で使ってみた。便利なGemがあるのでFacebook Developerのドキュメントあまり読まずにいけてしまった。

Gemはこの2つ。
omniauth-facebookは前から入っていたので、そのまま使う事にした。
omniauth-facebook
koala

Gemfile

1
2
3
4
# Auth
gem 'omniauth-facebook'
# Facebook API
gem 'koala'

とりあえずインストール。

1
bundle install

omniauth-facebook

omniauth-facebook使うと /auth/facebook にアクセスすればfacebookの認証画面を出してくれて、許可した後はcallback用のURLに飛ばしてくれる。

そこで受け取るアクションでは env['omniauth.auth'] が使えるので、

1
token = env['omniauth.auth']["credentials"]["token"]

とかでアクセストークンが取得できる。
このトークンを使って koala でいろいろすると。

omniauthの説明はRailscastが分かりやすい。
Facebook Authentication

omniauthを使う際に、config/initializer/omniauth.rbを作ると思うけど、その中でscopeのオプションを設定してあげないと、koalaでやり取りする時にデータがうまく取れない。権限のエラーを出してくれれば分かりやすいけど、たまにからの配列が返ってきたりするからとまどった。

たとえばこんな感じ。

1
2
3
Rails.application.config.middleware.use OmniAuth::Builder do
  provider :facebook, ENV['FACEBOOK_KEY'], ENV['FACEBOOK_SECRET'], scope: 'basic_info, email, friends_hometown, public_profile, user_friends, user_hometown'
end

scopeをどこで確認するかは、facebook developerのGraph API Explorerがもの凄い便利。すごいねフェイスブック。

Get Access Token を押すといろいろティックボタンが出てくるので実験できる。トークン取得した後にトークンの横にある「Debug」ボタンを押すと画面の一番したにscopeが表示されるので、それをコピペするだけ。

koala

koalaもRailscastで説明されてた。Railscastすげーな。
Facebook Graph API

さっき取得したtokenを使ってkoalaがFacebookとやり取りしてくれる。

1
2
3
facebook = Koala::Facebook::API.new(token)
facebook.get_object('me')
=> {"id"=>"100000134621172", "name"=>"Shunsuke Sawada", "first_name"=>"Shunsuke", "last_name"=>"Sawada", "link"=>"https://www.facebook.com/shunwitter", ......

FQL

いろいろ試してみたいけど、時間がかかるので、一番柔軟そうなFQLを試した。FQLはSQLみたいな文法でFacebookのデータベースからデータを取り出す言語です。

FQLを使って、「Facebookの自分の友達の中で「出身地が自分と同じ人たちだけを20件取り出す」ということをやってみた。

1
2
3
4
5
6
7
8
facebook = Koala::Facebook::API.new(token)

my_id = facebook['id']
hometown = facebook['hometown']['name']

q = "SELECT uid, first_name, last_name FROM user WHERE hometown_location.name = \'#{hometown}\' AND uid IN ( SELECT uid2 FROM friend WHERE uid1 = #{my_id} ) LIMIT 20"

facebook.fql_query(q)

これで該当する友達がずらーーーーっと取得できる。
楽しいなこれ。

26
Shunsuke Sawada

おすすめの記事

acts-as-taggable-on タグを表示させる順番を決めたい
Railsを4.2にバージョンアップしたら、Vagrantのローカル開発環境にアクセスできなくなった問題
Railsのバリデーションエラー後にレイアウトが崩れるとき