FacebookのAPIでできること(Graph APIとはなにか)

Facebookは外部からデータを取得したり投稿したり更新したり・・・いろいろできるAPIを用意しています。
このAPIを『Graph API』といいます。
APIとは簡単にいうとアプリケーション同士がデータなどをやり取りするためのインターフェイスです。
今回は『Graph API』の基本的な説明と、できることの一部をご紹介します。
また、もっともよく使用されるフィードについても触れたいと思います。

今回はAPIの説明に重点を置くため、サンプルコードなどはありません。
そちらは次回以降の記事で書きたいと思います。

アクセストークン

説明に入る前に注意点があります。
APIを利用するにはアクセストークンと呼ばれる認証用コードが必要です。
何もなしでデータを取得したり投稿したり更新したりできてしまうと大変ですからね。
アクセストークンには

ユーザーアクセストークン
ユーザーが承認して取得
そのユーザーのデータのほぼすべてにアクセス可能
有効期限あり(短/長の2種類)
アプリアクセストークン
作成したFacebookアプリに紐づけて承認される
各データにアクセス可能だがユーザーデータの一部にはアクセス不可
有効期限なし
ページアクセストークン
ユーザーアクセストークンを使用して取得
Facebookページに関するデータのみにアクセス可能
取得時に使用したユーザーアクセストークンによって有効期限が異なる(短→短、長→無期限)
クライアントアクセストークン
ネイティブアプリ(モバイルアプリやデスクトップアプリ)に埋め込むためのアクセストークン
アプリ用のごく一部のAPIにしか使用できない

の4種類があります。
以降の説明には記載しませんが、APIを使用する際には必ずアクセストークンを付加する必要があります。
実際に使用する際には忘れずに!

Graph APIの入り口

Facebookではデータをそれぞれ「ノード」と呼ばれる1つの塊としてとらえています。
例えば

  • ユーザーデータの塊(ユーザーノード)
  • 投稿データの塊(投稿ノード)
  • 写真データの塊(写真ノード)
  • アルバムデータの塊(アルバムノード)
  • コメントデータの塊(コメントノード)

などなど。
ノードはそれぞれIDを持っていて(ユーザーIDや投稿IDと呼ばれます)、APIではノードにアクセスするためにIDを指定します。
https://graph.facebook.com/v2.9/[node-id]
というURLでアクセスすると、そのデータが返ってきます。
例えば「FacebookJapan」のユーザーIDは「365989369023」です。
なので、ユーザーデータにアクセスするためのAPIは
https://graph.facebook.com/v2.9/365989369023
となります。
これだけでデータが取得できるのですが、限られたごく一部のデータしか返ってきません。(執筆時点ではIDと名前のみ)
もっといろいろ取得したい時は、「フィールド」と「エッジ」というものを使用します。

フィールド

フィールドとは、ノードの情報1つ1つのことで、APIから返ってくるデータの項目です。
先ほどの例でいうと「ID」と「名前」のことで、それぞれ「id」「name」というフィールド名が付いています。
APIへリクエストする時に「これとこれとこれのフィールドを返してね☆」と送ると、そのフィールドを返してくれます。
それを指定するのが「fields=」というパラメーター(URLの後ろに?や&でつなげるデータ)です。
いくつかありますが「email(メールアドレス)」「birthday(誕生日)」「link(タイムラインのURL)」などです。
(個人情報が含まれますので、ユーザーアクセストークンでないと取得できないものもあります)
https://graph.facebook.com/v2.9/365989369023?fields=email,birthday,link
と、カンマ区切りで指定します。

フィールドを指定すると、id以外の指定していないフィールドは取得できなくなります。
上記の例ではnameが返ってきません。
nameも必要であれば
https://graph.facebook.com/v2.9/365989369023?fields=name,email,birthday,link
というように併せて指定する必要があります。

エッジ

エッジとは、ノードに関連するデータを更に取得したりするためのものです。
例えばあるユーザーの最近の投稿(フィード)を取得したり、ある投稿のコメント一覧を取得したりです。
https://graph.facebook.com/v2.9/365989369023/feed
というように、ユーザーノードを取得するAPIの後ろに「/feed」を付けると、そのユーザーのフィードを取得するという意味になります。
同じように「/photos」を付けると、そのユーザーがアップロードした写真一覧を取得できますし、投稿のAPIに「/comments」を付けると、その投稿に付いたコメント一覧が取得できます。
このように、そのノードそのものではなく、それに関連したデータを取得する際に使用するのがエッジです。

少し複雑な使用方法

例えば「あるユーザーの最近の投稿をコメント付きで取得したい」となった場合はどのようにすれば良いでしょうか。
既にお気づきの人もいるかと思いますが、まず

  • ユーザーノードのAPIにfeedエッジを付けて最近の投稿を取得

取得した投稿データに含まれる投稿IDで

  • 投稿ノードのAPIにcommentsエッジを付けてコメントを取得
  • 取得したコメントを投稿データにくっつける

これを投稿データ分繰り返す、という流れになります。

あんなフィードやこんなフィードが取得したい

さて、ここまででAPIの基本と使い方をご説明しました。
ここからはよく使われるフィードについてご紹介します。

フィードの取得方法は先に書いたとおり
https://graph.facebook.com/v2.9/365989369023/feed
の形で取得できます。
ですが、これで取得できるフィールドは「id」「message」「created_time」のみです。
「投稿ID」「本文」「投稿日時」ですね。
デザインによってはこれだけでもいいかもしれませんが、何か寂しいです。
あと何がほしいでしょうか。
「投稿へのリンクURL」「画像」辺りでしょうか。
フィールド名では「permalink_url」「picture」になります。
https://graph.facebook.com/v2.9/365989369023/feed?fields=message,created_time,permalink_url,picture

これで取得してみると・・・画像がなぜか小さいです。
また、画像が複数あるはずの投稿でも1つしか入っていません。
フィードは本来、新たに投稿されたお知らせとして使用するため、一覧ページのように小さな画像を1つだけ取得します。
大きな画像を取得するフィールド名は「full_picture」となります。
https://graph.facebook.com/v2.9/365989369023/feed?fields=message,created_time,permalink_url,full_picture
画像を複数取得するにはどうすればよいのでしょうか。
実はfeedエッジではできません。
これは先ほど書いたとおりフィードだからです。

「少し複雑な使用方法」で書いた方法を使用してみましょう。
feedエッジで取得した投稿から、更に投稿に付いている画像一覧を取得します。
https://graph.facebook.com/v2.9/365989369023/feed?fields=message,created_time,permalink_url
(ここで取得できる画像は不要なためfull_pictureフィールドを削除しています)
https://graph.facebook.com/v2.9/365989369023_10154917104469024/attachments
365989369023_10154917104469024は上のfeedエッジで取得した投稿IDで、この投稿IDを変えながら繰り返し取得します。
attachmentsエッジは投稿などに添付されているデータを取得するためのエッジです。
複数画像が添付している場合は含まれる複数取得できます。
投稿の画像を取得して投稿データに付加、次の投稿の画像を取得して・・・と、投稿データ分繰り返すと「複数画像に対応した最近の投稿」が完成です。

まとめ

ここでご紹介した以外にもGraph APIはいろんなことができます。
1つ1つは単純にわかりやすくなっていますが、少し複雑なことを使用とすると、前述のように、取得したデータを使って更に取得という感じになります。
また、同じデータを取得するにもいくつかルート(どのデータを使ってどのデータを取得するか)がありえます。
何のデータが欲しくて、どのルートで取得するのが効率がよいのかを考えてから使用した方が良いかもしれません。

最後になりましたが、公式ドキュメントへのリンクを貼っておきます。
Graph API
リファレンス

Comments are closed.