c608be7283339a863201e58e151148e6

最近の仕様変更で、Facebook上のコメント欄に返信機能が追加され、スレッド表示されるようになりました。現在は移行期間中のため、一部のFacebookページと10000人以上のフォロワーを持つユーザプロフィールのコメント欄のみに適用されています。移行期間ではありますが、最近の本家開発ブログで、Graph APIを利用して仕様変更後のコメント欄を扱う方法が記載されていたので紹介します。

今までの方法

curl -X GET https://graph.facebook.com/OBJECT_ID/comments?access_token=XXXXXX

親コメントを取得

スレッド表示になったコメント欄へのコメント群のうち、返信コメントを除くものを取得します。
※Graph API Explorerで見ている限り、filter=toplevel無しでも親コメントのみが返されます。
curl -X GET https://graph.facebook.com/OBJECT_ID/comments?filter=toplevel&fields=comments&access_token=XXXXXX
{
"id": "630688080279832",
"comments": {
"data": [
{
"id": "630688080279832_110802267",
"from": {
"category": "Website",
"name": "Oklahomer",
"id": "204277149587596"
},
"message": "てすと",
"can_remove": true,
"created_time": "2013-03-28T13:33:30+0000",
"like_count": 0,
"user_likes": false
},
{
"id": "630688080279832_110823290",
"from": {
"category": "Website",
"name": "Oklahomer",
"id": "204277149587596"
},
"message": "123456",
"can_remove": true,
"created_time": "2013-04-06T12:31:50+0000",
"like_count": 0,
"user_likes": false
}
],
"paging": {
"cursors": {
"after": "Mg==",
"before": "MQ=="
},
"next": "https://graph.facebook.com/630688080279832/comments?limit=25&after=Mg=="
}
}
}

返信コメントを取得

上述した方法で任意のオブジェクトに紐づくトップレベルのコメントIDを取得できたので、以下の要領で返信を取得します。
curl -X GET https://graph.facebook.com/COMMENT_ID/comments?access_token=XXXXXX
コメントに対するcommentsコネクションで、コメントに紐づくコメント群を取得するわけですね。

{
"data": [
{
"id": "630688080279832_110802269",
"from": {
"category": "Website",
"name": "Oklahomer",
"id": "204277149587596"
},
"message": "返信!",
"can_remove": true,
"created_time": "2013-03-28T13:33:52+0000",
"like_count": 0,
"user_likes": false
}
],
"paging": {
"cursors": {
"after": "MQ==",
"before": "MQ=="
},
"next": "https://graph.facebook.com/630688080279832_110802267/comments?limit=25&after=MQ=="
}
}

一度に両方取得する

開発ブログで紹介されていたのは上述の方法ですが、親コメント一覧を取得し、さらに個々の親コメントに紐づく返信コメントを取得して行くというのは非効率なので、これを1度にまとめる方法も紹介します。

ここまでで、/OBJECT_ID/comments と /COMMENT_ID/comments の2種類のエンドポイントが出てきました。やっていることは以下の通りです。
  1. 任意のオブジェクトのcommentsコネクションで、オブジェクトに紐づくコメントを得る
  2. 得たコメントオブジェクトのcommentsコネクションで、コメントオブジェクトに紐づくコメント群を得る
オブジェクトにぶら下がったコネクションと、それらコネクションにぶら下がるコネクションを取得する。こういったことはField Expansionが得意とするところです。
curl -X GET https://graph.facebook.com/OBJECT_ID?fields=comments.filter(toplevel).fields(id,message,from,can_remove,created_time,like_count,user_likes,comments)&access_token=XXXXXX
これで返されるデータは以下の通りです。
見てみると、ID: 630688080279832のオブジェクトに対して、「テスト」と「123456」というコメントが付けられ、「テスト」コメントに対しては「返信!」という返信コメントが付いていることが分かります。
{
"id": "630688080279832",
"comments": {
"data": [
{
"id": "630688080279832_110802267",
"message": "てすと",
"from": {
"category": "Website",
"name": "Oklahomer",
"id": "204277149587596"
},
"can_remove": true,
"created_time": "2013-03-28T13:33:30+0000",
"like_count": 0,
"user_likes": false,
"comments": {
"data": [
{
"id": "630688080279832_110802269",
"from": {
"category": "Website",
"name": "Oklahomer",
"id": "204277149587596"
},
"message": "返信!",
"can_remove": true,
"created_time": "2013-03-28T13:33:52+0000",
"like_count": 0,
"user_likes": false
}
],
"paging": {
"cursors": {
"after": "MQ==",
"before": "MQ=="
},
"next": "https://graph.facebook.com/630688080279832_110802267/comments?limit=25&after=MQ=="
}
}
},
{
"id": "630688080279832_110823290",
"message": "123456",
"from": {
"category": "Website",
"name": "Oklahomer",
"id": "204277149587596"
},
"can_remove": true,
"created_time": "2013-04-06T12:31:50+0000",
"like_count": 0,
"user_likes": false
}
],
"paging": {
"cursors": {
"after": "Mg==",
"before": "MQ=="
},
"next": "https://graph.facebook.com/630688080279832/comments?filter=toplevel&fields=id,message,from,can_remove,created_time,like_count,user_likes,comments&limit=25&after=Mg=="
}
}
Field Expansionの詳細についてはField Expansionの和訳や、「Graph APIを利用する」を参照してください。