ぱと隊長日誌

ブログ運用もエンジニアとしての生き方も模索中

コメント返信のGraph APIを使う

はじめに

Facebookのコメントに返信機能が追加され、「July 2013 Breaking Changes」を有効にするとAPIからも使えるようになります。
日本語で書かれた詳しい解説記事がありますので、ぜひご覧ください。
2013/07/10 の仕様変更 : Facebook開発者向けドキュメントの日本語訳とTips
Graph APIで新コメント欄の返信機能を扱う : Facebook開発者向けドキュメントの日本語訳とTips

ここでは上記記事で紹介されてないテクニックを紹介します。
文中、いくつかオフィシャルブログから引用しているコードがあります。そのエントリを以下に示します。
New APIs for Comment Replies- Facebook Developers

Breaking Changes前後でコメントの取得結果が変わる

Breaking Changes適用前はcommentsコネクションで親コメントと返信コメントが一度に取得できます。
ですが、Breaking Change適用後はcommentsコネクションで親コメントのみ取得できます(filterを指定しなかった場合)。

また、Breaking Changes適用前はコメントの有無によらずレスポンスにcommentsが含まれていましたが、適用後はコメントがある場合にしかcommentsを含みません。

これらの挙動は今後変更される可能性もありますが、要注意です。

親コメントと返信コメントをフラットに取得する

解説記事で親コメントと返信コメントを一度に取得する方法が説明されています。この方法ですと、親コメントの要素として返信コメントが含まれています。

ただ、Breaking Changes適用前のcommentsコネクションのように親コメントと返信コメントを同じレベルで一度に取得したい場合もあると思います。その場合、filterに"stream"を指定することで親コメントと返信コメントを同じレベルで、かつ時系列にソートされた状態で取得することができます。

オフィシャルブログでは以下のように紹介されています。

{object_id}/comments?filter=stream

ただ、これだとオブジェクト毎にコメントを取得せねばならず不便です。そこで、以下の書式を使うとfeedの取得と併せてコメントを取得でき、便利です。

{id}/feed/?fields=id,message,comments.filter(stream)

commentsのcountフィールドの代用

これまで、commentsにはcountフィールドが含まれており、コメント数を取得することができました。ただ、今回のBreaking Changesでこのcountフィールドはundocumentということで削除されることになりました。

オフィシャルブログでは代わりに以下の方法で取得できると紹介しています。

{id}/comments?summary=true

こうするとsummaryの"total_count"でコメント数を取得できます。

ただ、これも先のstreamの場合と同じようにオブジェクト毎にコメント数を取得せねばならず不便です。そこで、以下の書式を使うとfeedの取得と併せてコメント数を取得できます。ここではstreamと組み合わせています。

{id}/feed/?fields=id,message,comments.filter(stream).summary(true)

以下にレスポンスのイメージを提示します。
「本文です。」という投稿に対して「コメントです」というコメントをしています。また、このコメントに対して「返信です」と返信しています。

{
  "id": "XXXXXXXXXXXXXXX_XXXXXXXXXXXXXXX",
  "message": "本文です。",
  "created_time": "2013-05-20T02:00:00+0000",
  "comments": {
    "data": [
      {
        "id": "XXXXXXXXXXXXXXX_XXXXXXX",
        "from": {
          "id": "XXXXXXXXXXXXXXX",
          "category": "Community",
          "name": "ほげコミュニティ"
        },
        "message": "コメントです",
        "can_remove": false,
        "created_time": "2013-05-20T02:05:00+0000",
        "like_count": 0,
        "user_likes": false
      },
      {
        "id": "XXXXXXXXXXXXXXX_XXXXXXX",
        "from": {
          "id": "XXXXXXXXXXXXXXX",
          "category": "Community",
          "name": "ほげコミュニティ"
        },
        "message": "返信です",
        "can_remove": false,
        "created_time": "2013-05-20T02:10:00+0000",
        "like_count": 0,
        "user_likes": false
      }
    ],
    "paging": {
      "cursors": {
        "after": "Mg==",
        "before": "MQ=="
      }
    },
    "summary": {
      "order": "chronological",
      "total_count": 2
    }
  }
}

おまけ

オフィシャルブログのコメント欄ではAPIの使い方についての質疑も行われているようです。自分が上記で調べたようなことが既に回答されていたり…。困った時は参考にしてみるといいかもです。

更新情報

2013/06/03:
一部説明のわかりづらい箇所がありましたので、修正しました。内容に変更ありません。