ラベル Ruby の投稿を表示しています。 すべての投稿を表示
ラベル Ruby の投稿を表示しています。 すべての投稿を表示

2012年10月19日金曜日

koalaを使ってRuby on RailsでFacebookアプリ開発 ②

koalaを使ってRuby on RailsでFacebookアプリ開発 ①で紹介したものにいくつか補足をしていきたいと思います。(特につまずいたところを中心に!)

モバイル版Facebook
モバイル版のFacebookサイトを作る場合は、ログインや承認画面もモバイル用にするべきだと思いますが、その場合は、パート①で紹介したURL「https://graph.facebook.com/oauth/authorize」にdisplay=touchというパラメータを追加することで可能です。

koalaでウォールに書き込む
ウィールに書き込むには、put_wall_postメソッドを使います。これを使えば簡単に投稿出来てしまいます。以下はサンプルです。

graph = Koala::Facebook::API.new(<アクセストークン>)
graph.put_wall_post(
  "本文(HTMLで。)",
  {
    :name => "リンクのタイトル",
    :link => "リンクのURL",
    :picture => "写真のパス"
  }
)

ちなみに、本当に投稿されてしまうので、実施するときはFacebookのテストユーザでやりましょう!テストユーザは、developers.facebook.comから"Apps"を選択し、"Edit Rolls"の中で作れます。

アクセストークンを取得するときに使ったHTTP API
rubyのいろいろなAPIを試してみたのですが、いろいろトラブって、最終的にはhttpclientを使いました。

Gemfileに以下の行を足し、
gem 'httpclient'

bundle installを実行!その後以下のコードで取得dけいました。
access_token = client.get(
    "https://graph.facebook.com/oauth/access_token", 
    :query => {
      :client_id => <App ID>, 
      :redirect_uri => <最終的なリダイレクト先>,
      :client_secret => <アプリのシークレットキー>, 
      :code => <バリデーションコード>
    }).body

さらに問題になったのは戻ってきたアクセストークンですが、いつの日から&expires=XXX(XXXは秒数)というようなものもくっついてきたので、これを切り取る必要があると思います。(これをもとにアクセストークンをキャッシュしておけば、毎回Facebookからアクセストークンを取得する処理を実行する必要はなくなります。特にこの処理はあまり速くないと思いますので、キャッシュしておいた方がいいと思います。)

InvalidAuthenticityTokenエラーが発生する
Web API風にJSONでJavaScriptとデータをやり取りする場合にInvalidAuthenticityTokenエラーが発生しまいました。これはCSRF対策としてRails2.0から導入された機能で、アプリが返した画面からしかリクエストを受けないようにする機能みたいです。これを回避するために以下のようにしてverify_authenticity_tokenをスキップしました。

skip_before_filter :verify_authenticity_token

AndroidやiOSなどでインストールするアプリ(.apkや.ipa)の場合には、Viewを利用せず、Web API風にする必要があるため、この対応が必要になってくる


とりあえず、結構つまずいたところはこんな感じですね。また、つまずいたら追記します!


2012年10月16日火曜日

koalaを使ってRuby on RailsでFacebookアプリ開発 ①

Ruby on RailsでFacebookアプリを開発しようといろいろを情報を探していて、最終的にはKoalaというライブラリがFacebook Graph APIを扱うのに一番使いやすそうなので、試してみました。

まずは、インストールですが、Gemfileに以下の行を追加。

 gem 'koala'

そして、bundle installを実行して完了。

次に利用方法です。以下のようにKoala:Facebook::API.newにアクセストークンを渡すことでOKです。戻り値のgraphに対してget_objectなどのメソッドをコールして、Facebookのデータにアクセスします。以下の例は自分の情報を取得しています。

 # koalaでFacebook Graph APIにアクセス
 graph = Koala::Facebook::API.new(アクセストークン)
 me = graph.get_object("me")

こんな簡単に利用可能です。ただし、一番ひっかかったのはこのアクセストークンをどうやって取得するかに悩まされましたので、メモっておきます。(結構面倒くさい・・・)

まずは、developers.facebook.comで新規アプリを作成して、アクセストークンを取得するためのURLを登録します。(テスト時はlocalhostでもOKです。)

次に以下のクライアントから以下のようにブラウザでアクセスしますと、Facebookのログインやアプリ承認画面が表示され、承諾すると登録したURLにリダイレクトされます。
https://graph.facebook.com/oauth/authorize?client_id=<ここにFacebookのapp ID>&redirect_uri=<上記登録したURL>&scope=<アプリがアクセスできる範囲>
このとき、リダイレクトされたサイトに"code=XXXX"というパラメータ("XXXX"はバリデーションコード)が渡ってきますので、このコントローラ内でバリデーションコードを取得し、さらに以下のURLにコントローラ内からアクセスするとアクセストークンがテキストで取得できます。(access_token=ZZZZという形式。)
https://graph.facebook.com/oauth/access_token?client_id=<Facebookのapp ID>&redirect_uri=<自分のFacebookアプリのトップヘージ>&client_secret=<アプリのシークレットキー>&code=<バリデーションコード>
これでやっとアクセストークンが取得できますので、一番最初のkoalaのAPIに渡すことでFacebook Graph APIにアクセスできるようになります。

なんとか、私はこれで成功することができました。あとは、友達情報取るのも、ウォールに書き込むのも簡単です。

# 友達の情報を取得
friends = graph.get_connections("me", "friends")

ふぅ〜。。