「Graph APIでプロフィール画像のURLを取得する方法」が色々変わっていたのでまとめてみる

1年半前あたりのエントリで、「Facebook Graph APIでユーザーのプロフィール画像(のURL)を取得する方法について紹介しました。
Facebook Graph APIでプロフィール画像のURLを取得する方法 - でぶぬる日記
ところが最新の事情は色々と変わってきているようなので、少しまとめてみたいと思います。

"redirect=false"パラメータを付ければ、pictureエントリポイントでも画像URLを取れる

以前は
https://graph.facebook.com/216311481960/picture
のようなURL呼び出しをすると、レスポンスにプロフィール画像のデータ自体が返ってきてしまっていた(正確にはステータスコード302で画像のURLにリダイレクトされていた)のですが、
https://graph.facebook.com/216311481960/picture?redirect=false
のように、"redirect=false"のパラメータを付けると、画像のURLが取得出来るように変更されていました。
その場合、以下のようなJSON形式でレスポンスが取得出来ます。

{
   "data": {
      "url": "https://fbcdn-profile-a.akamaihd.net/hprofile-ak-ash4/373042_216311481960_1625208104_q.jpg",
      "is_silhouette": false
   }
}

callbackパラメータを付けるとJSONPな感じになる。

redirectパラメータだけではなく、callbackパラメータでJSONPなレスポンスを返すのにも対応しているようです。
callbackパラメータに関数名を渡すと、"redirect=false"の指定がなくても画像URLを返す動作になるっぽい。
https://graph.facebook.com/216311481960/picture?callback=hoge

/**/ hoge({
   "data": {
      "url": "https://fbcdn-profile-a.akamaihd.net/hprofile-ak-ash4/373042_216311481960_1625208104_q.jpg",
      "is_silhouette": false
   }
});

※追記: callbackパラメータ自体はGraph API全般で動作するようです…ドキュメントのどこに書いてあるのだろう…。

fieldsパラメータを指定する方式でもURLは取得出来る。但しデータ形式がちょっと違う

Facebook Graph APIでプロフィール画像のURLを取得する方法 - でぶぬる日記
のエントリで紹介しているように、「ユーザ情報を取得するAPIに対してfieldsパラメータを指定する方法」でも、引き続きURLを取得することは出来るようです。
https://graph.facebook.com/216311481960?fields=picture,name
但し、以前とはJSONデータの形式がちょっぴり変わっている。

{
   "name": "Bill Gates",
   "id": "216311481960",
   "picture": {
      "data": {
         "url": "http://profile.ak.fbcdn.net/hprofile-ak-ash4/373042_216311481960_1625208104_q.jpg",
         "is_silhouette": false
      }
   }
}

"picture"の直下にJSONデータ(以前はURL文字列)が来るようになっているので注意が必要。

Facebookアプリのトークンを使っている場合は、古い動作に戻すことも可能(但し2013/2/6まで限定)

Facebookアプリのアクセストークンを使ってAPIを呼び出している場合は、これらの動作を以前のものに戻すことが出来るとのこと。
Facebook Developersのアプリ管理画面から[Apps]→[アプリ名]→[Advanced]を開き、[Migrations]の[Picture As Dictionary]を"Disabled"に変更する。

但しこの設定も移行期間用の対処ということで、2013/2/6までには使用できなくなるとのことで、根本的にFacebookアプリ側での修正が必要になるようです。
アクセストークンを使っていない場合は…既に新しい動作になってしまっているようなので諦めて大至急プログラムを直しましょう…。