Graph APIやFQLでユーザの投稿一覧やフィードを取得しようとしていると、特にoffsetとlimitを使ったページングで上手く行かないことがあります。シェアボタン廃止前後のメモを探しているうちに、去年の春頃に自分でハマったときの記録が出てきたので共有します。
ただ、去年3月の公式ブログ記事の内容を基にしてるので、現状どうなってるのかは試してないです。(常に最新状態に更新されるドキュメントと違って、ブログ記事だと後からのフォローが分かりにくいですね。ドキュメントも最新じゃないこと多いですが。。)
Graph APIやFQLでlimitを使って検索した場合、Facebook側では対象期間中の全件をまず取得し、そこから閲覧権限のあるオブジェクトのみを返すという動作をします。以下の画像は公式ブログからの引用ですが、途中で閲覧権限外のオブジェクトが間引かれているのが分かります。
このため、上図のケースでoffset=3を指定しても返されませんし、limit=10でも10件は返されません。対応策として紹介されているのは、offsetの代わりにsince,untilとlimitを組み合わせて使う方法です。時系列に検索する場合は、取得したオブジェクト群の最後の1つのtimestampをsinceに指定し、逆時系列の場合はuntilを使います。
Graph API:https://graph.facebook.com/chickfila/posts?until=1298508006
FQL:SELECT message, created_time FROM stream WHERE source_id = XXXXXXXX AND created_time < 1299634732
ただし、since,untilとlimitを組み合わせた場合でも一件も返されなかい場合はあり、それが最後のページングだったのか、それとも対象全件が閲覧権限外だっただけでまだ残りがあるのか判別しなくてはならないという問題が残ります。その際には、limitの値を大きくして試すなどの方法が紹介されています。その際のヒントとして、閲覧権限をチェックして間引く前に検索できる最大件数(要するにlimitの最大値で、上図で言うと左の状態)は5000件だと書かれています。
Graph APIでこれらの対応が必要となるのは、以下のフィールドやコネクションです。
checkins, feed, home, links, notes, photos, posts, statuses, tagged, videosFQLであれば、以下のテーブルです。
checkin, status, streamこのページング問題とは別に、Graph APIの /USER_ID/home は直近1~2週間分のオブジェクトしか返さないことに気をつけてください。(この点は2012年4月30日更新のドキュメントで確認済みです。)