メッセージがダメならチャットすればいいじゃない ~サイボウズLive と Facebook API~

「サイボウズ・アドベントカレンダー」の9日目です(これまでの記事一覧)。



こんにちは。サイボウズLive チームの福嶋です。

サイボウズLive では、Facebook アカウントでのユーザー登録やログインができます。

これを実現するために、サイボウズLive サーバから、 Facebook Graph API を利用しています。

他にもいろんなところで Facebook Graph API を利用しているので、サイボウズLive が実際に使っている例を交えて、Facebook Graph API でできることを紹介していきます。

Facebook API Explorer

この記事で紹介している API の多くは、 Facebook API Explorer で試せます。

その使い方を簡単に説明します。

  1. Facebook API Explorer を開く
  2. アクセストークンを取得 ボタンを押す
  3. Get Access Token ボタンを押す
  4. Graph API Explorer の OAuth 認可画面が出るので、 Facebook でログイン ボタンを押す
  5. Facebook API Explorer のアクセストークンの欄に文字列が挿入される
  6. API の URL などを入力して 送信 ボタンを押す
  7. 実行結果が表示される
  • 2~5 は初回だけ必要な手順です。
  • 記事の後半で登場する、特別な権限(publish_stream など)が必要な場合は、3 で明示的に指定します。

OAuth 認証

多くの Facebook Graph API は、OAuth 認証しないと呼び出せません。OAuth2 なので、OAuth1 と比べて実装が簡単です。

ここを詳しく説明し始めると、他が書けなくなるので、いきなり割愛します。

サイボウズLive では

Facebook アカウントでのユーザー登録やログインで、この仕組みを使っています。

公式ドキュメント

https://developers.facebook.com/docs/reference/dialogs/oauth/

ユーザー情報と日本語表記の氏名を取得する

ID、氏名、出身地などのユーザー情報を取得します。

サイボウズLive では

Facebook アカウントでのユーザー登録で、サイボウズLive に登録するユーザー情報を取得するために使用しています。

公式ドキュメント

https://developers.facebook.com/docs/reference/api/user/

リクエスト

GET https://graph.facebook.com/me
  • me の部分を FacebookID にすると、その人のユーザー情報が取得できます。

レスポンス

{
    "id": "1234567890",  
    "name": "Noboru Sato",  
    "first_name": "Noboru",  
    "last_name": "Sato",  
    "username": "noboru.sato",  
    ...(略)...  
}

日本語表記の氏名を取得するには

ここで取得できる氏名は英語表記です。 日本語表記の(ローカライズされた)氏名を取得するには、FQL を使います。

リクエスト

GET https://graph.facebook.com/fql?q=SELECT name FROM profile WHERE id = me()

レスポンス

{
  "data": [
    {
      "name": "佐藤 昇"
    }
  ]
}

友達情報と日本語表記の氏名を取得する

自分の友達のユーザー情報を取得します。

サイボウズLive では

グループなどへの招待時に Facebook の友達を候補として表示するために使用しています。

公式ドキュメント

https://developers.facebook.com/docs/reference/api/user/#friends

リクエスト

GET https://graph.facebook.com/me/friends

日本語表記の氏名を取得するには

こちらも同様に英語表記なので、日本語表記の氏名を取得するには以下の FQL を投げます。

GET https://graph.facebook.com/fql?q=SELECT id,name FROM profile WHERE id IN (SELECT uid2 FROM friend WHERE uid1 = me())

プロフィール画像の URL を取得する

プロフィール画像のバイナリデータを取得できます。

サイボウズLive では

ユーザー登録時のプロフィール画像の取得などに使用しています。

公式ドキュメント

https://developers.facebook.com/docs/reference/api/using-pictures/

リクエスト

GET https://graph.facebook.com/[ID]/picture
  • ID 部分は、FacebookID を指定します。
  • パラメータに type を渡すと、画像サイズが指定できます。指定できる値は、square, small, normal, large です。

この API は、OAuth 認可不要なので、 img タグで指定して簡単に使えます。

<img src="https://graph.facebook.com/[ID]/picture" />

パーミッションを取得する

OAuth 認可後に、期待する権限をユーザーが与えてくれたかどうかや、呼び出す API に必要な権限が剥奪されていないかをチェックする必要がでてきます。

サイボウズLive では

ウォールの書き込み前や、チャットメッセージ送信前などの権限チェックで使用しています。

公式ドキュメント

https://developers.facebook.com/docs/reference/api/user/#permissions

リクエスト

GET https://graph.facebook.com/me/permissions

レスポンス

{
  "data": [
    {
      "publish_stream": 1,
      "status_update": 1,
      "photo_upload": 1,
      "video_upload": 1,
      "email": 1,
      ...(略)...
    }
  ]
}

たとえば、 publish_stream の値が 1 なら、ウォール書き込み権限があるということが分かります。

友達リストを取得する

自分の友達リストを取得します。 read_friendlists 権限が必要です。

サイボウズLive では

サイボウズLive に招待する Facebook の友達を友達リストで絞り込むために使用しています。

公式ドキュメント

https://developers.facebook.com/docs/reference/api/FriendList/

リクエスト

GET https://graph.facebook.com/me/friendlists

友達リストのメンバーを取得するには

GET https://graph.facebook.com/[友達リストID]/members

Facebook グループを取得する

自分が所属する Facebook グループを取得します。 user_groups 権限が必要です。

サイボウズLive では

サイボウズLive に招待する Facebook の友達を Facebook グループで絞り込むために使用しています。

公式ドキュメント

https://developers.facebook.com/docs/reference/api/group/

リクエスト

GET https://graph.facebook.com/me/groups

Facebookグループのメンバーを取得するには

GET https://graph.facebook.com/[FacebookグループID]/members

ウォールに書き込む

自分のウォールに投稿します。 post_stream 権限が必要です。

サイボウズLive では

サイボウズLive のユーザー登録時に、任意で Facebook のウォールに書き込むために使用しています。

公式ドキュメント:

https://developers.facebook.com/docs/reference/api/user/#posts

リクエスト

POST https://graph.facebook.com/me/feed

パラメータ

  • message: メッセージ
  • link: リンクのURL
  • name: リンクの表示名
  • caption: リンクのキャプション
  • description: 説明
  • picture: アイキャッチ画像のURL

message にユーザーが入力したもの以外を指定すると、規約違反になるので注意しましょう。 message 以外は自由に指定できます。

投稿結果


他人のウォールに書き込むには

以下のように URL の meFacebookID にすると、他人のウォールに書き込めます。

POST https://graph.facebook.com/[ID]/feed

ただし、近々禁止される予定です。

チャットメッセージを送信する

指定の友達にチャットメッセージを送信します。相手がオンラインの時はチャットメッセージが送信されますが、オフラインの時はメッセージが送信されます。 xmpp_login 権限が必要です。

サイボウズLive では

サイボウズLive では、グループなどへの招待状を送信するために、メッセージを送りたいのですが、残念ながらメッセージ送信 API が提供されていません。

メッセージがダメならチャットすればいいじゃないということで、チャットメッセージで代用しています。

公式ドキュメント

https://developers.facebook.com/docs/chat/

チャットメッセージ送信は、Facebook Graph API ではなく Facebook Chat API を使用します。

Facebook Chat API は、 XMPP 仕様に則っているので、各言語の XMPP ライブラリを使用するとよいでしょう。

chat.facebook.com:5222 に接続し、[宛先FacebookID]@chat.facebook.com に対してメッセージを送信します。

詳しく知りたい方は、サンプルコードをご覧ください。

通知を送信する(β 機能)

Facebook アプリから、そのアプリユーザーに対して、通知を発行することができます。Facebook アプリを使っていない人には送信できません。

サイボウズLive では

一定間隔で新着情報をチェックして、その情報を Facebook の通知として送信しています。

公式ドキュメント

https://developers.facebook.com/docs/app-notifications/

リクエスト

POST https://graph.facebook.com/[ID]/notifications?access_token=[APP_ACCESS_TOKEN]&template=[MESSAGE]

APP_ACCESS_TOKEN は、ユーザーのアクセストークンではなく、アプリ自体のアクセストークンです。

これは、以下の API から取得できます。

GET https://graph.facebook.com/oauth/access_token?client_id=[CONSUMER_KEY]&client_secret=[CONSUMER_KEY_SECRET]&grant_type=client_credencials

以下のような結果が返ってくるので、

access_token=ABCDEFG

access_token= の部分を捨てた文字列 ABCDEFG がアプリのアクセストークンとなります。

変なパラメータ名を付けずに、直接アクセストークンを返してくれたらいいのに、イケてません。

通知結果


この通知をクリックすると、Facebook キャンバスページ に飛ぶので、Facebook キャンバスページを別途用意する必要があります。

この通知を受け取った人のうち、クリックした人の割合が 17% を切ると、通知送信を止められる可能性があります。

現在のクリック率は、アプリの Insight のお知らせで確認できるので、こまめにチェックしましょう。


ざっと、サイボウズLive が使用している Facebook API を紹介しました。使えそうな API はありましたか?

約 1 年前、サイボウズLive が Facebook と連携したことで、ユーザーがぐっと増えました。

いろんな Web サービスやアプリで Facebook との連携が進むと嬉しいです。


明日は「言語判定の仕組み」をお送りします。お楽しみに。