facebookのユーザーの投稿を取得する

facebookapiが変更になって、Graph APIを使ってユーザーの情報にアクセスする方法が変わった。offline_accessというパーミッションが指定できなくなり、常時ユーザー情報にアクセスすることができなくなった。これまではそのパーミッションを指定することで、一度アクセストークンを取得したらあとはいつでもユーザーにアクセスできたけど、数時間の有効期限が設定されて困った。

この有効期限ありのトークンは以下の状態で使用不可になる。

・有効期限を過ぎた
・ユーザーがアプリを削除した
・ユーザーがログアウトした
・ユーザーがパスワードを変更した

有効期限が1〜2時間て短すぎるし、ログアウトしたら使えなくなるなんてつらい。ではどうするかというとトークンの有効期限を60日に変更する。アプリの作成から有効期限を変更したトークンの取得について説明する。例として、ユーザーの投稿内容を取得してサイトに表示するというのをやってみる。

offline_accessパーミッション削除に対応する
Facebook Graph API での投稿(Post)にハマった件
Facebookアクセストークンを取得してそれを60日間使えるようにする
Authentication : Facebook開発者向けドキュメントの日本語訳とTips

facebookの開発者登録

Facebook開発者のページからアプリの作成をする。アプリ名やリダイレクト先のサイトURLなどを入力してアプリを作成。

有効期限が60日に変更されたアクセストークンを取得

続いて作成したアプリのAPP_IDとAPP_SECRETを差し替え。アクセストークンデバッガーを開いてDebugをクリック、表示されたUser TokenをコピーしてEXISTING_ACCESS_TOKENと差し替え。
以下の該当個所をそれぞれ変更する。

https://graph.facebook.com/oauth/access_token?             
    client_id=APP_ID&
    client_secret=APP_SECRET&
    grant_type=fb_exchange_token&
    fb_exchange_token=EXISTING_ACCESS_TOKEN 

あとはこのURLにリクエスト(見やすく改行と空白を入れてるのでそれは消すこと!)すると有効期限が60日のトークンが表示される。実際はもっとトークン部分が長いけどこんな感じのレスポンスが返ってくる。

access_token=AAAD***&expires=5183896

access_token=と&expires=5183896の間に挟まれた部分が60日間使用できるトークン。めでたくユーザー情報にアクセスできる期間が延長された。

ユーザーの投稿を取得

アプリがデフォルトで取得できるユーザー情報はプロフィールとか基本的なものだけなので、そのままだと投稿内容やアップロードした写真などが取得できない。なので、アプリに必要な権限を与えるためにユーザーに認証してもらう。以下のAPP_IDを先ほどのアプリのものに差し替え、YOUR_URLをアプリ作成で入力したURLに差し替える。scopeには許可して欲しい項目を列挙する。取得可能な情報とscope一覧はこちらを参照。

https://www.facebook.com/dialog/oauth?
     client_id=YOUR_APP_ID&redirect_uri=YOUR_URL&scope=read_stream

必要なところを変更して↑を開くと認証用の確認画面が表示される。ここでユーザーがアプリを認証してくれればユーザー情報にアクセスできるようになる。これで準備はできたので、有効期限の延びたトークンを使って自分のfeedを取得する(↓は架空のトークンだから動かないよ)。

https://graph.facebook.com/me/feed?access_token=AAABsckKHaY4BAA8QZDZD

今は自分のフィードを取得したけど、URLのmeのところをアプリを認証してくれたユーザーのIDに変更すればそのユーザーの情報にアクセスできる。ここまで進めて思ったんだけど、このアクセストークンはユーザーごとに作るんではなくて、アプリの管理者が取得したものだからすべてのユーザーで共通のものを使うってことになるよね。それって何かよくない気がするんだけどどうなんだろう。ちなみにユーザーの情報を取得するには上記の手順になるけど、facebookページの内容を取得する場合はアプリのトークンがあればいいので、ユーザーの時のようなアプリの認証はしなくてもいい。
また、facebookページの場合はトークンの有効期限はないので一度の取得でずっと使える。


Facebookのアクセストークンの有効期限について調べてみた
FacebookページIDの確認方法