Facebook Graph API での投稿(Post)にハマった件
- Facebook Graph API を用いて,Rails なサービスから認証済みのユーザーのfeedに投稿したい
- これまで既に動いていて,今年の7-8月あたりのAPIの更新で動かなくなっていたっぽい
- 最近は,Koala(https://github.com/arsduo/koala)と呼ばれる,主にFacebook投稿用のOAuth2対応のgemがあるが,こういうのは使っていない
- oauth-ruby(https://github.com/oauth/oauth-ruby)と,rest-client(https://github.com/archiloque/rest-client)で実装してる
- OAuth2 については,このへんが良い: OAuth 2.0でWebサービスの利用方法はどう変わるか
- 今回は,Facebook Graph API で用いる access_token の期限が有限になり,
- 1) 取得してから2時間という制限を60日に伸ばす,のと
- 2) なんでかよくわからないけど投稿できなくなった,というバグに対応した
1) access_token の期限を伸ばす
- イメージ
- oauth 認証するために,app_id, app_secret, service_url(https://graph.facebook.com/) にリクエストしてコードをもらう
- もらったコードを使って,実際に利用するユーザーにFacebookにリクエストしてもらって,アプリ利用の許可を得る
- URLなどを feed に投稿するには,publish_actions の権限が必要
- 権限などはこのへんが参考になった: publish_streamとpublish_actionsパーミッションの統合
- 得られた access_token を使って,ユーザー情報の参照や,feed への投稿等を行う
- この access_token の期限が,2時間くらいになった.そのまま使うこともできるが,今回は60日(2ヶ月くらい)に伸ばす
- 期限を伸ばすリクエストをして,access_token の期限を伸ばす
- 具体的には,以下のようなリクエストを行う
params = { :client_id => service.key, :client_secret => service.secret, :grant_type => fb_exchange_token, :fb_exchange_token => EXISTING_ACCESS_TOKEN } response = RestClinet.get( 'https://graph.facebook.com/oauth/access_token', :params => params )
- access_token の期限などは下のページで確認することができる
2) なんだかよくわからない投稿のバグを潰す
- 最終的な原因は,Facebook Graph API が REST でなくなった,ということで良いのだろうか
- これまで RestClient.post していたところを,RestClient.get するようにした
- ただし,パラメータに "method=post" を付ける必要がある
- それから "me/feed" としていたところを,"#{user_id}/feed" とすることになった
- 最終的に参考になったページ
得た知識
- Facebook の開発者向けドキュメントが全然親切じゃない
- Graph API Explorer: https://developers.facebook.com/tools/explorer