オルタナティブ・ブログ > プロジェクトマネジメント10.0 >

失敗しないウェブアプリケーション開発の処方箋

【Facebook】Graph API の説明

»

ブログ引っ越しました→「Looops 直人の備忘録

◆関連記事

お世話になっております。
ループス岡村直人です。

前回の記事ではFacebookのSocial Pluginに関して、 簡単な説明を書かせていただきました。

今回はその続き、Graph APIについて書いてみたいと思います。
前回同様、Facebook.com上のドキュメントがベースになりますので、 内容については未検証の部分も多々あります(未検証の部分はその旨言及するようにいたします)。翻訳をベースとしているため、断定するような表現で文章が終わっている部分が多いのですが、その内容を保証するものではありませんので予めご了承いただきたく存じます。

認識違いや不明点等、お気づきの点がありましたらご指摘いただけると幸いです。

◆Open Graph APIを5秒で説明すると
「Facebook以外の全サイトをFacebook化する仕組み」だと理解しています。

詳細については以下の項に記載します。

◆もうちょっとだけ詳しく

Facebookの中心は「ソーシャルグラフ」というものなのだそうです。

ソーシャルグラフをGoogleで検索すると、goo辞書に説明がありましたので引用します。

個人を節点(ノード),人間関係を辺(エッジ)で表現した図(グラフ)。ソーシャル-ネットワーキング上での人間の相関関係のこと。またインターネットに おいて,このグラフ情報を個々のサービスとは独立した形で保持・共有しようとする概念。goo辞書より

ノードとかエッジといわれてもよくわかりませんが、まあ、「人間関係を図にしました」というようなことじゃないかと思います。女性セブンとかによくあるアレですね。FacebookはそれらのソーシャルグラフにアクセスするためのAPI群を公開しており、Facebook Platformなどと呼ばれています。APIを利用することでソーシャルグラフの影響範囲は、Facebook.comの外の世界、つまりFacebook以外の全てのサイトやデバイスに及ぶとのことです。

先日発表になったGraph APIは、Facebookにデータを投稿したり、読み込んだりといった操作を劇的に簡単にしてくれるそうです。これらのAPIを使って、Facebook内に保持されている個人や法人、写真、イベント、更にはそれらの関係性などについてまでも整合性の取れた情報を手軽に表示できるようになります。

(Facebookの)ソーシャルグラフに属する全てのオブジェクトはユニークなIDを持っています。Open Graph APIの利用者はオブジェクトに付帯する様々なデータを得ることができます。データを取得するには "https://graph.facebook.com/ID" のようなフォーマットでFacebookにリクエストを投げます。

例:https://graph.facebook.com/121061651238421

数字で表現されるIDの代わりに username を使うこともできるようです。username については2010年4月14日に公開されたこの記事(Facebook Pages: Usernames for Facebook Pages)が参考になると思います。全てのレスポンスはJSONオブジェクトとして返却されます。

同様のフォーマットでUsers, Pages, Events, Groups, Applications, Status messages, Photos, Photo alubums, Videos, Nostesの10種類のオブジェクトにアクセスできます。それぞれのオブジェクトについてはAPIドキュメントに詳細がありますので参照いただければと思います。

◆大事な言葉、「Connections」

Facebookが日本で流行らない理由の一つに、「Wall」や「Like」のように、平易な言葉で表現されながら、特有の性質をもつ機能に適切なラベルを貼れていないことが挙げられるのではないかと思いますが、ConnectionsもFacebook特有のニュアンスを含むことばです。

Connectionsは、Facebookでは「モノとモノとのつながり」という意味合いで使われているようです(All of the objects in the Facebook social graph are connected to each other via relationships. (中略) We call those relationships connections in our API. )。

ある意味文字通りなのですが、APIのリファレンス内で見かけると相手ホストとの接続などと混同してしまいます。開発する人であれば、RDBの中間テーブルみたいなものだと思っておけばいいような気がします。

Connectionsは "https://graph.facebook.com/ID/CONNECTION_TYPE" のようなフォーマットをリクエストすることで取得できます。Connectionsがサポートするオブジェクトの詳細はAPIリファレンスに記載があります。

◆ここから下の説明

以下は原文通り、以下の順番に説明を記載します。

  • Selection
    Facebookに問い合わせる際、オブジェクトの戻り値が含める属性を指定することができます。
  • Introspection
    戻り値にオブジェクトのメタデータを含むことができるという話です。
  • Authorization
    認証が必要な問い合わせを行う際の作法について記述がありました。
  • Publishing to Facebook
    外部サイトからFacebookに書き込みを行う場合の説明です。
  • Deleting Objects
    外部サイトからFacebookのデータを削除する場合の説明です。
  • Pictures
    オブジェクトに関連付けられた画像を簡単に表示することができます。
  • Paging
    問い合わせ結果が複数に及ぶ場合、フィルタリングと範囲指定を行うことができます。
  • Search
    Facebook内のオブジェクトを検索することができます。
  • Real-time Updates
    更新通知に関する短い説明です。
  • Analytics
    自分が管理するアプリケーションの利用状況について詳細な情報をダウンロードできます。

ここまでの文章はある程度個人的な意見や注釈が含まれましたが、ここから下、終わりと書くまではなるべく個人的な見解を含めないようにしたいと思います。とはいえ英語のわからない人間の書いた内容なので話半分程度にご覧ください。

◆Selection

デフォルトでは、多くのオブジェクトプロパティが戻り値として返されます。全てが不要であれば、"fields"パラメータを使って返されるフィールド、もしくはConnectionsを指定することができます。例えば、以下の例では Ben についてのID, name, pictureフィールドを結果として戻します。

https://graph.facebook.com/bgolub?fields=id,name,picture

"ids" パラメータを使って1回の問い合わせで複数のオブジェクトを取得することもできます。例えば、以下のURLはArjunとVernalの両方についての結果を返します。

https://graph.facebook.com?ids=arjun,vernal

"ids" パラメータは引数にURLを取ることができます。これはOpen Graphの中からIDやURLを探す時に便利です。

https://graph.facebook.com/?ids=http://www.imdb.com/title/tt0117500/

加えて、特別な識別子 "me" があります。これは現在アクセスしているカレントユーザーを表します。

https://graph.facebook.com/me

◆Introspection

Graph APIはオブジェクトのメタデータを表示することができます。これにより、予めオブジェクトの型(Object Types)がわからない場合でもオブジェクトのConnectionsを見ることができるようになります。メタデータを取得するためには、 "metadata=1" をHTTPパラメータとして指定します。このパラメータが指定された場合、戻り値のJSONオブジェクトはサポートする全てのConnectionsをリストした metadata プロパティを含みます。

例えば、 Developer Garage event の全てのConnectionsを見るためには以下のURLにアクセスしてください。

https://graph.facebook.com/331218348435?metadata=1. That outputs:

戻り値は次のように metadata を含みます。

{
   "name": "Facebook Developer Garage Austin - SXSW Edition",
   "metadata": {
      "connections": {
         "feed": "http://graph.facebook.com/331218348435/feed",
         "picture": "https://graph.facebook.com/331218348435/picture",
         "invited": "https://graph.facebook.com/331218348435/invited",
         "attending": "https://graph.facebook.com/331218348435/attending",
         "maybe": "https://graph.facebook.com/331218348435/maybe",
         "noreply": "https://graph.facebook.com/331218348435/noreply",
         "declined": "https://graph.facebook.com/331218348435/declined"
      }
   }
}

◆Authorization

Graph API は認証にOAuth2.0を利用します。Facebookの具体的なOAuth2.0実装についてはAuthentication guideを参照してください。OAuth2.0は複雑なURLの署名やトークンの交換の代わりにSSL for API communicationを使うことによって、OAuthをよりシンプルにしたバージョンです。(岡村注記:OAuth2.0については、裏付けのため技術的な文書の調査をしていません。でもものすごく簡単にできることは確かです。アクセストークンの取得のために一切コードを書かなくてもOK。)

https://graph.facebook.com/220439?access_token=...

Facebook経由でアクセストークンを取得すれば、そのトークンを使って承認が必要なGraph API リクエストをユーザーの代わりに実行することができるようになります。アクセストークンを取得するための具体的なやり方は、GitHubのPHP版か、Python版のサンプルを参考にしてみてください。

アクセストークンを取得するためのステップは次のようになります。

  1. あなたのアプリケーションを登録し、"App ID (日本語表記:IDを追加)" と "App Secret (日本語表記:アプリの秘訣)"を取得します。App IDのGrap APIパラメータ名はclient_idApp Secretclient_secretです。
  2. ユーザーを "https://graph.facebook.com/oauth/authorize" へリダイレクトします。その際にパラメータとして前述の client_idredirect_uri を渡してください。redirect_uri はあなたのアプリケーションと連携をするために必要です。例えば、あなたのアプリケーションのURLが http://www.example.com であれば、あなたのリダイレクトURLはhttp://www.example.com/oauth_redirect のようにすることができます。
    https://graph.facebook.com/oauth/authorize?
        client_id=...&
        redirect_uri=http://www.example.com/oauth_redirect
  3. ユーザはFacebook側であなたのアプリケーションを認証した後に、redirect_uri で指定されたURLにリダイレクトされます。その際、URLに含まれる "code" パラメータに認証情報を付与します。取得した "code" パラメータを付与して https://graph.facebook.com/oauth/access_token へアクセスすることで、アクセストークンを取得することができます。redirect_uri は前のステップと同じです。
    https://graph.facebook.com/oauth/access_token?
        client_id=...&
        redirect_uri=http://www.example.com/oauth_redirect&
        client_secret=...&
        code=...
  4. 取得したアクセストークンを使って、認証したユーザーの代わりにリクエストを行うことができます。
    https://graph.facebook.com/me?access_token=...

◆Facebookへの投稿
適切なURLを通して行う HTTP POST リクエストにより、Facebookのソーシャルグラフへ投稿をすることができます。例えば、以下の例ではArjunのWall(ゲストブックのようなもの)に投稿することができます。

curl -F 'access_token=...' \
     -F 'body=Hello, Arjun. I like this new API.' \
     https://graph.facebook.com/arjun/feed

※crulについてはコチラを参照

他にも、コメントしたり(https://graph.facebook.com/POST_ID/comments)、Like(https://graph.facebook.com/POST_ID/likes)したりすることができます。

curl -F 'access_token=...' \
     https://graph.facebook.com/313449204401/likes

ほとんどの書き込み操作は権限の拡張(Extended permissions)を必要とします。認証のステップでユーザーに拡張した権限の移譲を行わせる方法についてはAuthentication guideを参照してください。

現在サポートされている書きこみは、Wallへの書き込み、コメント、Like(支援関係ON/OFF)、プロフィールに対するノート・リンク・イベント・アルバムの作成、イベントへの出欠表明、アルバムに対する画像のアップロードがあります。

投稿時に、認証されたユーザーを表す定数 "me" を使うことができます。

curl -F 'access_token=...' \
     -F 'message=I am posting to my own feed. I am awesome.' \
     https://graph.facebook.com/me/feed

◆Deleting Objects
HTTP DELETEメソッドを使ってオブジェクトを削除することができます。

DELETE https://graph.facebook.com/ID?access_token=... HTTP/1.1

"method=delete" パラメータを追加すれば、JavaScriptクライアントのような、全てのHTTPメソッドをサポートしないクライアントでも、POSTメソッドで削除を要求することができるようになっています。例えば、コメントを削除する場合は次のようになります。

https://graph.facebook.com/COMMENT_ID?method=delete

LikeはIDを持たないので、次のように削除します。

https://graph.facebook.com/POST_ID/likes

◆Pictures
どんなオブジェクトでも、接尾辞 "/picture" を付けることで画像を表示することができます。次の例では私のパブリックプロフィール画像を表示します。

<img src="https://graph.facebook.com/naoto.okamura/picture"/>

同様の方法でユーザー以外にもイベント、グループ、ページ、アプリ、アルバムの画像を表示することができます。画像サイズは "type" 引数で指定することができます。 "type" にはsquare(50px*50px), small(縦横比固定/幅50px), large(縦横比固定/幅約200px) の値を取ることができます。

http://graph.facebook.com/naoto.okamura/picture?type=large

◆Paging
複数の戻り値を返すような問い合わせを利用する際に、結果をフィルタリングしたり、ページングしたりできる便利なパラメータがあります。

◆Search
ソーシャルグラフ内に公開されている全てのオブジェクトを検索することができます。

https://graph.facebook.com/search?q=QUERY&type=OBJECT_TYPE

検索は以下のオブジェクトについてサポートしています。

  • All public posts: https://graph.facebook.com/search?q=watermelon&type=post
  • People: https://graph.facebook.com/search?q=mark&type=user
  • Pages: https://graph.facebook.com/search?q=platform&type=page
  • Events: https://graph.facebook.com/search?q=conference&type=event
  • Groups: https://graph.facebook.com/search?q=programming&type=group

"home" 引数を加えることで友人に制限されたニュースフィードを検索することができます。

  • News Feed: https://graph.facebook.com/me/home?q=facebook

◆Real-time Updates
Real-time Updatesによって、アプリケーションの全利用者から、データの変更に関する通知を取得することができます。これらのデータから、Facebookのサーバなしで、アプリケーションの信頼性や、利用者の反応の増加を検証することができます。(Real-time updates provide you the ability to receive updates about all of your application's users, as their data changes. With such subscriptions, you can be confident that your cached data is correct without polling Facebook's servers, increasing the reliability of your application, and the responsiveness of your user experience.)

※【注意】Real-time Updatesについてはまだ調査・検証を行っていません。

◆Analytics
アプリケーションを登録すると、Facebook Insightsを使って、その利用状況や流入経路について詳細な分析を得ることができるようになります。Graph APIはそれら全データへのアクセスを提供するので、必要に応じてカスタマイズされた独自のアクセス解析システムを構築・統合することが可能です。

Facebook Insightsのデータをダウンロードするためには、最初にOAuthアクセストークンを取得する必要があります。アクセストークンはクライアントの認証と同じフローで取得することができます。

curl -F type=client_cred \
     -F client_id=your_app_id \
     -F client_secret=your_app_secret \
     https://graph.facebook.com/oauth/access_token

以下のURLは、APIを通じて全ユーザー数、アクティブユーザー数、あなたのサイトからの流入経路などを含む全てのデータを出力します。

https://graph.facebook.com/app_id/insights/share_views/day?access_token=...

前述の until, since パラメータで期間を特定することができます。どちらの引数もほとんどの日付フォーマットを受け入れます。

https://graph.facebook.com/app_id/insights?access_token=...&since=yesterday

詳細についてはFacebook Insightsの詳細ページを参照してください。

※Analyticsに関しては調査に使ったアプリケーションのアクセスがほとんどないこともあり、動作については全く未検証の状態です。

◆終わりです

以上です。

何度も申し上げますが、英語の読解力には全く自信がありません。
怪しい点はご指摘いただけると嬉しいです。

◆本エントリを書こうと思ったきっかけ
前回のSocial Plugin調査以来、Facebookに対する興味が湧いてきました。
以下のような記述(このページ下部)があったためです。

Building standards
Facebook Platform uses the Open Graph protocol to enable integrations of your web pages into the social graph. While a new technology, we've tried to build off of existing open standards to create a more semantically aware web.

英語だし、ぶっちゃけなんのことかよくわかりませんが、セマンティックウェブを実現するために既存のスタンダードを作り直す、ような雰囲気を見てとりました。

「既存⇒破壊(書いてないけど)」、ときたら血の気の多い若手としては反応せざるをえません。

◆Facebookの野望

CGM(最近ではソーシャルメディア)がすごいなー、と思うのは、セマンティックウェブのような標準化団体が長い時間をかけてもなかなか実行的な落とし所を見つけれられないむつかしい事柄でもユーザーの支持をもとに一定の形を与えてしまうところです。

まあ、ひとくくりにできないいろんな分野があるでしょうし、私自身難しいことは全然わからないのでめったなことは書けませんが、肝心のデータを独り占めという、特定企業にだけものすごくオイシイ仕様は組織間の交渉ではなかなか採決しずらいだろうナァ、なんて思いました。

Facebookのスキームでは、ネットワーク外部性がグローバルな範囲に効いてくるという、なんだかよくわからないことが起こりそうな気もします。自分の周りはというと、このままガラパゴスになればすごく楽しい(亀もトカゲも大好きです)のですが、日本固有種は色も薄いし味も淡白なので中途半端なことにならないかどうかはちょっと気になるところです。



参考:セマンティックWeb事例紹介 Tony Lee (株式会社ソルトルックス SaltLux Inc.)






 
Comment(0)