FacebookのグラフAPIを使って簡単に自分の友達情報を取得する方法まとめ [python]
はじめに
こんにちは、irucaです。
TwitterのAPIは多くの人が使ってますが、FacebookのAPIはそれに比べてとっつきにくいイメージがあります。
自分もなんだかんだ今まで使ったことがありませんでした。
しかしFacebookで友達関係を分析したりタイムラインへの投稿の自動化といったことができるようになると、とっても夢が広がります。
ということで今回は、つまづきがちなFacebookのAPI使用方法を取り扱います。
FacebookのAPIを使って簡単に自分の友達情報をプログラムから取得してみるまでの方法をまとめました。
開発者登録とアプリ登録
APIを使う前に、まずは通常のFacebookアカウントを開発者アカウントにアップグレードする必要があります。
Facebookにログインします。
www.facebook.com
下記のページに従い、 2.開発者アカウント から 6.「クイックスタート」のステップを実行する までの作業を行います。
アプリIDの作成 - アプリ開発 - ドキュメンテーション - 開発者向けFacebook
アプリIDをなんでもよいので新規に登録するとアプリのダッシュボード画面になります。
「設定」タブを選び、以下の項目を編集します。
- アプリドメインを、なんでもよいので存在するドメイン名にします。私の場合は自分の持つドメインの「app.iruca21.com」を設定しました。
- カテゴリを「ゲーム」にします。サブカテゴリは何でもよいです。後で利用するAPIの都合上、大事なことなので必ずゲームに設定いてください。
- 「プラットフォームを追加」→「Facebookゲーム」を選択し、「FacebookウェブゲームのURL(https)」の欄には先ほど入力したアプリドメインでも書いておきましょう。私の場合は「https://app.iruca21.com/」と入力しました。
最後に忘れずに画面右下の「変更を保存」ボタンを押してください。
アクセストークンと自分のユーザIDを取得する
下記のページを参考に、APIを使用するためのアクセストークンを取得しましょう。
Facebook APIのアクセストークンを取得する方法を毎回忘れるためメモしておく。
アプリの設定画面から、「アプリID」「app secret」「アプリドメイン」の値をコピーしてメモを取っておいてください。
CODEを取得
アクセストークン取得の前段階として、まずはAuthorization Codeを取得します。
フレンド情報を取得するにはアクセストークンに「user_friends」というスコープ(権限)を紐づける必要があります。
下記URLのアプリID、redirect_uriを自分のものに書き換えて、ブラウザに張り付けてアクセスしてください。
アプリドメインの最後にスラッシュ(/)を加えないとエラーが出ることがあります。
https://www.facebook.com/dialog/oauth?client_id=【アプリID】&redirect_uri=https://【アプリドメイン】&scope=user_friends
成功すると、ダイアログでログインやアプリ承認を求められ、承認すると下記のようなURLに飛ばされるかと思います。
http://app.iruca21.com/?code=AQCXLTMom99boNLUv6_ODjkAanoeean@oiekmafgnoiaeegAhUe1T2bthramjO9ara3fV5dkln2fx0xFYoITjKHboSgreaaqAHbyxhQDwM1E9cyhXHdb36rScpifXaeiVPf33gOR5EAAtz7g2gSzKkHND9h7_JRafsTyuLjY8K1eag7BqnvT2yLWTvxecScDqpixaiWeGmXEFwMpJyREwfJR6FzaerXExVgDFOYM4dRRdYDD6aagrWSlGUbXjI8VFCW02kGt7-tn7-igm23iDSgrea7zk8hfDfv22j#_=_
ここで得られたCODEの値をコピーしておいてください。
アクセストークンを取得
下記URLのアプリID、アプリドメイン、app secret、CODEの値を書き換えてブラウザでアクセスしてください。
https://graph.facebook.com/oauth/access_token?client_id=【アプリID】&redirect_uri=https://【アプリドメイン】&client_secret=【app secret】&code=【上記で取得したCODE】
上記でアクセストークンを取得するときのみ、redirect_uriの最後にスラッシュ(/)をつける必要がある場合があるので注意してください。(なんでここだけスラッシュが必要なのかは知らない…)
成功すると下記のようなレスポンスが得られて、無事アクセストークンを得ることができます。
このアクセストークンの値も、誰にも公開しないように大事にメモっておきましょう。
{"access_token":"EAASBFGVb9U0BAMUMvCZB2IMJLUN6rw48OhogefugapiyopiyorKdcMGqOVUnN4fvCBn4JPWjyRRuVohyeary9opoOsuoByrwCnQKeyIqWfYAlpyKWUeRhtQMTqjZCO0YYWc214GWyA0YgmHkhIQOpawooov3vJLTxNOeVwZDZD","token_type":"bearer","expires_in":5183917}
自分のフレンド情報を取得する
さて、いよいよ自分のフレンド情報を取得してみます。
FacebookのAPIを使用するときにもっともハマりがちなポイントとして、権限の問題があります。
現在のバージョンのFacebook Graph APIでは、フレンド情報を取得する/me/friends APIではフレンド全員の情報が取れるわけではないのです。
そのあたりの事情は下記ページにまとめられています。
snowadays.jp
全員のフレンド情報を特にFacebook運営側のチェック無しに取得するために、ここでは「GET invitable_friends」APIを使います。本来はFacebookのゲームに招待できるフレンドを取得するために使うAPIですね。
Graph API Reference: User invitable_friends - Documentation - Facebook for Developers
"Authorization: OAuth [アクセストーク文字列]" のHTTPヘッダを使用してAPI pathに対してHTTP GETメソッドでコールするだけでよいです。
pythonのコードを用意しました。
実行にはpythonモジュールrequestsが必要になるので、インストールしておいてください。
そしてAPI実行結果のJSONをプリティーに表示するためにjqコマンドを使っているのでそれもインストールが必要です。
準備用スクリプト(sh)
yum install python-setuptools easy_install pip pip install requests yum install jq
フレンド取得スクリプト(python)
#!/usr/bin/python #-*- coding:utf-8 -*- import requests #-------------- # 取得したアクセストークンを下に入力してください access_token = "見せられないよ!" #-------------- target_url = "https://graph.facebook.com/v2.10/me/invitable_friends" response = requests.get(target_url, headers={"Authorization" : "Bearer %s" % access_token} ) print response.content
さて、実行してみます。
[root@hoge facebook-graphapi]# python get_invitable_friends.py { "data": [ { "id": "見せられないよ!", "name": "見せられないよ!", "picture": { "data": { "is_silhouette": false, "url": "見せられないよ!" } } }, { "id": "見せられないよ!", "name": "見せられないよ!", "picture": { "data": { "is_silhouette": false, "url": "見せられないよ!" } } }, ... ],
ほとんど隠してしまいましたが(笑)、自分のFacebookフレンドのフルネームやプロフィール画像の一覧が取得できました。
レスポンスには全フレンドは入っていませんが、それもページング情報を使って順次アクセスしていけば取得できそうです。
まとめ
FacebookのグラフAPIを使って、自分の友達一覧を表示してみました。
これ以上詳しくFacebookの情報を取得したければ、FacebookのGraph APIに関する公式ドキュメントを参考にしてみてください!
Graph API - ドキュメンテーション - 開発者向けFacebook
使い方をまとめてほしいAPIなどあればリクエストいただければまとめてみます。
ではでは。