スポンサーリンク

Facebook SDKの「Graph API」で,各種情報にアクセスするためのURLの例 (ソーシャルグラフの仕様を理解しよう)

Facebookアプリの主役である「Graph API」に関し,

その仕様の概略と,入門的な使い方を述べる。

  • プラットフォームは問題ではない
  • ソーシャルグラフとは何か?
  • Graph APIのURLの一覧
    • 参照系のURL
    • 更新系のURL

プラットフォームは問題ではない


Facebookアプリを開発する際,プラットフォームの違いはあまり問題にならない。


下記ページから,Facebook SDKの対応プラットフォームの一覧を確認できる。

SDKs & Tools
http://developers.facebook.com/docs/s...

  • JavaScript SDK
  • PHP SDK
  • iOS SDK
  • Android SDK

たくさんあるようだが,実はどのプラットフォームでも基礎は同じだ。


下記のように,処理の流れが共通している。

  1. アプリは,https://graph.facebook.com/ 上の特定のURLに対し,SDKを経由してHTTPリクエストを発行。(※SDKを介さないで,直接リクエストを発行してもよいのだが,その分通信の手間が増える。アクセストークンの発行・取得などが煩雑。)
  2. FacebookサーバからのHTTPレスポンスとして,JSONデータが返ってくる。
  3. アプリはJSONを解析し,Facebook上のデータの状態を認識する。

参考:

IBMのFacebook API 入門(2010/12月)
Facebook SDK for Android を使用して Android プラットフォーム用の Facebook アプリケーションを作成する
http://www.ibm.com/developerworks/jp/...

  • Graph API のオブジェクトには一意の ID が割り当てられ、また URL を使うことで Graph API のオブジェクトのアドレスを容易に指定することができます
  • Facebook SDK for Android は、Facebook の Graph API と Old REST API に対する Java プログラミング言語によるラッパー
  • アプリケーションの要件に従い、Facebook のサーバーからのレスポンス (JSON フォーマット) を適切に構文解析して処理する必要があります


要するに,Facebookアプリの構築にあたって,

デベロッパは下記の情報を知っておけばよい。

  • (1)自分がコーディングするプラットフォーム上での,Facebook SDKを介した通信方法。(プログラミング言語に依存)
  • (2)Facebook上に存在する情報のオブジェクトの種類。(プログラミング言語に依存しない)
  • (3)Facebook APIのURLのリスト。「どのURLにアクセスすれば,どういった情報が得られるのか」ということ。(プログラミング言語に依存しない)
  • (4)Facebook APIが返すJSONデータの形式。「どのJSONプロパティが,何の属性を表すのか」ということ。(プログラミング言語に依存しない)

このうち(1)だけはプラットフォームごとに異なっている。

しかし実質,関数名とかはほとんど同じ。(request()とか)

なので知識の応用が利く。



(2)は,Facebookを使っていれば普通に認識できる仕様である。

開発者でなくても理解できる。

「User」がFacebookユーザ,「Page」がFacebookページを指すことぐらいはすぐにわかる。

http://developers.facebook.com/docs/reference/api/ の下部の「Objects」に,全部列挙されている。




(3)と(4)も,単なるURLとJSONのフォーマットの問題なので,

プログラミング言語に依存しない。



つまり,プラットフォームの違いはほとんど問題にならないのである。

例えばiPhone向けのFacebookアプリの作成ノウハウを,そのまま転用して

Android用のFacebookアプリのソースコードに書き換えることも楽々。



だから,特定のプラットフォーム上での作業中に

Facebookアプリの作成方法についての情報がWeb上に少ないな,と思っても,

他のプラットフォーム向けの情報がそのまま役立つ。



そういうわけでFacebookアプリを開発する際には,言語などの基盤知識以上に,

(2)〜(4)などのFacebookサービスの仕様を理解することが重要になる。

そこで鍵になるのが「ソーシャルグラフ」というキーワード。


ソーシャルグラフとは何か?

Facebook SDKのリファレンスは,下記の公式ページに掲載されている。

Facebook Developers
http://developers.facebook.com/

トップのバナーにでかでかと「Hack the Graph」と書いてあるが,

この「Graph」とは,SNSで言う「ソーシャルグラフ」のことである。


要は,Facebookサービス上に存在するオブジェクト(個々のデータ)と,それらが織りなす関係性(結びつき)のこと。

Graph API
http://facebook-docs.oklahome.net/arc...

Facebookの中核をなすのはソーシャルグラフで、人々や人々が周りの物事に対して持つ繋がりを指します。

ソーシャルグラフ上の全てのオブジェクトには固有IDが与えられていて、https://graph.facebook.com/IDにリクエストする事でオブジェクトの持つ要素へアクセスできます。

全てのレスポンスはJSONオブジェクトで返されます。

関連性を、私たちのAPIではconnectionと呼びます。https://graph.facebook.com /ID/CONNECTION_TYPEというURL構成を使うことで、オブジェクト間のconnectionを確かめる事ができます。



Facebook開発者向けドキュメントの日本語訳とTips
http://facebook-docs.oklahome.net/arc...

Graph APIこそがFacebookプラットフォームの中核をなすもので、Facebook上のデータの読み書きを可能にします。また、一貫性のあるソーシャルグラフのビューを提供します。

ソーシャルグラフ上のオブジェクトにアクセスするためには,前述の通り

そのオブジェクトのURLを叩いて,返ってくるJSONの内容を見ればよい。

これが,Facebook Graph APIの最も一般的な使い方である。



あるいは,SQLに近いクエリ言語「FQL」を使って,

情報を検索条件でフィルタリングし一括取得することもできる。

Facebook Query Language (FQL)
http://developers.facebook.com/docs/r...

You can execute FQL queries by fetching https://api.facebook.com/method/fql.query?query=QUERY.

return the logged-in user. For example:

SELECT name FROM user WHERE uid = me()


以下では,FQLは脇に置いといて,Graph APIの主な使用方法のサンプルを掲載する。


Graph APIのURLの一覧

https://graph.facebook.com

の後ろにつけるリクエストURI。


参照系のURL

自分(ログイン中のカレントユーザ)の情報

返り値:

{
  "id" : 〜,
  "name" : 〜,
  "first_name" : 〜,
  "last_name" : 〜,
  "link" : 〜,
  "birthday" : 〜,
  "gender" : 〜,
  "email" : 〜,
  "locale" : 〜,
  "updated_time" : 〜
}

自分の本名,生年月日,性別,メールアドレスが取得できる。


自分の全友達のリスト

Pythonのサンプルコード:

facebook/python-sdkを使って友達を取得してみる!
http://makeitsmartjp.com/2011/07/face...
user = graph.get_object('me')
friends = graph.get_connections(user['id'], 'friends')


誰も友達がいない場合の返り値:

{
  "data" : []
}


友達がいる場合:

{
  "data" : [
    {
      "name" : 〜,
      "id" : 〜
    },
    〜
  ]
}

usernameなどの各種項目は,その友達の個別情報のAPIに行かないと取得できないので注意。


自分の特定の友達の情報

  • /友達のFacebook id/

返り値:

{
  "id" : 〜,
  "name" : 〜,
  "first_name" : 〜,
  "last_name" : 〜,
  "link" : 〜,
  "birthday" : 〜,
  "gender" : 〜,
  "locale" : 〜,
  "updated_time" : 〜
}

/me/の場合と異なり,他のユーザのemailが表示されない。

アプリのユーザ(=グラフAPI利用者)自身のメアドは取得できるが,

ユーザの友達のメールアドレスは,APIから取得できない。

それは無理。デベロッパ公式サイトにもそう書いてある。

User and friends Permissions
http://developers.facebook.com/docs/r...
The set of permissions below basically explain what types of permissions you can ask a user in the scope parameter of your auth dialog to get the permissions you need for your app.

  • User permission Friends permission Description
  • email N/A Provides access to the user's primary email address in the email property. Do not spam users. Your use of email must comply both with Facebook policies and with the CAN-SPAM Act.


Facebook Graph API, how to get users email?
http://stackoverflow.com/questions/36...

  • The only way to get the users e-mail address is to request extended permissions on the email field. The user must allow you to see this and you cannot get the e-mail addresses of the users friends.
  • http://developers.facebook.com/docs/authentication/permissions
  • You can do this if you are using Facebook connect by passing req_perms=email in the get string of your connect URL.

自分が作ったFacebookアプリとFacebookファンページの一覧

  • /me/accounts

AKB48で学ぶFacebookアプリとファンページの連携方法
http://d.hatena.ne.jp/hebita164/20101...
$pagesData = $facebook->api('/me/accounts');
$pagesDataには自分が管理しているファンページの情報が入ってきます。

返却値の例(自作のファンページと自作アプリの情報が列挙される):

{
  "data" : [
    {
      "id"       : "〜〜",
      "category" : "Internet/software",
      "name"     : "〜〜"
    },
    {
      "id"       : "〜〜",
      "category" : "Application",
      "name"     : "〜〜"
    },
    {
      "id"       : "〜〜",
      "category" : "Application",
      "name"     : "〜〜"
    }
  ]
}

誰か他のユーザの情報

例えば,有名どころとして「無印良品」のFacebookページは下記にある。

http://www.facebook.com/muji.jp

このURLから,無印良品を識別するためのオブジェクトIDは「muji.jp」であることが分かる。

なので,下記のURLで無印良品の情報を取得できる。

  • /muji.jp/

返ってくるJSON:

{
  "picture"  : "〜〜",
  "founded"  : "1980年2月",
  "category" : "Household supplies",
  "name"     : "無印良品",
  ・・・
  
}


ファンページは,実在している人間ではないものを対象としたページなので,

交友関係を持つことができない。したがって,友達はいない。

  • /muji.jp/friends

結果:

{
  "data" : []
}

参考:

Facebookでは「キャラクターアカウント」「偽名アカウント」は削除される / 企業利用においては注意が必要
http://gendai.ismedia.jp/articles/-/1...

  • Facebookでは実在する人物以外をアカウント登録することはできません
  • 実世界で「ガチャピン」や「せんとくん」と交際関係を構築できないように、Facebookではキャラクターと友達になることは許されていません


オブジェクトIDがわかれば,そのオブジェクトの画像を取得できる。

画像取得だけはSDKを通す必要がない。

Android SDKを用いてFacebookの友達をListViewに表示するコード
http://d.hatena.ne.jp/ke-16/20110706

  • ぶっちゃけ画像を取ってくるところとか自信ありません。。。急にコレだけ単なるhttp(s)アクセスになっていて、SDK関係ないし

なお,自作アプリからSSL経由で画像を取得しようとして,下記のようなエラーに遭遇する場合がある。

java.io.IOException: Hostname <fbcdn-profile-a.akamaihd.net> was not verified

この場合は,httpsではなくhttp経由でのダウンロードに切り替えればOK。

Get user image from Facebook Graph-API
http://stackoverflow.com/questions/58...

  • I want to show the users profile picture in a list view. When I try to call the graph-api from android to retrieve the image, I always get the following error.


このファンページのウォールに投稿されたコメントの一覧:

  • /muji.jp/feed

Core Concepts : Graph API : Post
http://developers.facebook.com/docs/r...
The User, Page, Application and Group objects have feed connections containing post objects that represent their walls.

特定のアプリの情報

  • /(アプリのAPP ID)/

戻り値:

{
   "id": "〜〜",
   "name": "〜〜",
   "link": "http://www.facebook.com/apps/application.php?id=〜〜",
   "icon_url": "http://static.ak.fbcdn.net/rsrc.php/〜〜.gif",
   "logo_url": "http://static.ak.fbcdn.net/rsrc.php/〜〜.gif",
   "weekly_active_users": "〜〜",
   "monthly_active_users": "〜〜"
}

アプリのテストユーザの情報

  • /(アプリのAPP ID)/accounts/test-users

返却されるエラーメッセージ:

  • "An access token is required to request this resource."
  • "This method must be called with an app access token"


これはブラウザ上から確認した方が手早い。

テストユーザが一覧表示で確認でき,新しいものが上に来る。件数が多いとページングする。


更新系のURL

ウォールに投稿したい場合

前述のURLでコメントの一覧を表示したのと同じURLに対し,POSTリクエストを投げる。

  • /オブジェクトID/feed

PHPのサンプルコード:

【Facebookアプリを作って見る-APIを叩いてウォールに投稿-】
http://tatsushim.blogspot.com/2011/02...
$status = '投稿するメッセージ';
$attachment = array(
'message'=>$status,
'name'=>'投稿者の名前',
'access_token'=>$oshimaPages_token,
);

$statusUpdate = $facebook->api("/$pagesId/feed", 'post', $attachment);

補足

これ以上の情報は,下記のGraph API公式マニュアルを熟読のこと。

Core Concepts : Graph API
http://developers.facebook.com/docs/r...

参考:

Androidアプリで,Facebook APIを利用するための手順 (Facebook SDK for Androidの使い方)
http://language-and-engineering.hatenablog.jp/entry/20110830/p1


Facebookアプリで「Hello, World」の作り方と,リリースまでの開発手順
http://language-and-engineering.hatenablog.jp/entry/20110821/p1

関連する記事:

ソーシャル系ボタンの設置用サンプルコード (はてブ・Twitter・Facebook・Googleプラスワン等のプラグインをサイト上に表示する方法)
http://language-and-engineering.hatenablog.jp/entry/20110929/p1


Facebookページ上で,匿名性を確保しつつ,ブログのRSSをウォールに表示する方法
http://language-and-engineering.hatenablog.jp/entry/20110922/p1