Facebook APIを使ったお手軽データ取得方法
Facebook API、アクセストークンの種類がいっぱいあって難しい、特にユーザアクセストークンとか発行面倒。
今回私はただデータを一括で取得したいという目的だったので、APIをがっつりとは触りたくないと感じました。
気軽に呼び出せる方法がありましたので紹介します。
グラフAPIエクスプローラ
これがすべてです。
これ自体がFacebookアプリになっており、自分のアカウントでトークンを取得、好きなAPIを呼び出せるというものになっています。もちろん全データ取得となるとデータサイズが大きくなるので、少しプログラム書いたほうが良いですね。
もう少し解説します。
今回やってみること
今回やりたかったのは、私の所属するFacebookグループの過去のイベントをすべて取得すること。
イベントが100回を超えており、手作業で取得なんて怠け者な僕は絶対したくありませんでした。
それを簡単にやってみます。
アクセストークンの取得
右上の「トークンを取得」ボタンをクリックし、ドロップダウンしたメニューから、「ユーザアクセストークンを取得」を選択。
ここで、アプリ(グラフAPIエクスプローラ)にどういった権限を付与するかどうかを選択できます。
今回はグループイベントが取得したかったので、user_events/user_managed_groupsの2つを選択し、アクセストークンを取得をクリックしました。詳細はGraph APIドキュメントを見たら良いです。
これでアクセストークンが取得できました。
グラフAPIエクスプローラ上でのAPI実行
Graph APIドキュメントのグループイベントを軽く見て、以下のパスで実行できそうでした。
GET /v2.10/{group-id}/events HTTP/1.1
group-idは、取得対象のFacebookのグループページのURLから確認しました。
パスをグラフAPIエクスプローラ上で入力し、実行をクリック。
ビンゴ!取得できました。
これ、レスポンスのjsonを見るとわかりますが、全件は取得できません。 このあたりを確認すると、クエリパラメータlimitを指定するとたくさん取れそうです。ただ、ちゃんと全件ならページネーションしましょう。
GASを用いてSpreadSheetに読み込み
ここまでやったことを、Google App Scriptでさくっと実行して、Spread Sheetに読み込んでみます。
Spread Sheetを開いて、Tools > Script editorをクリック。
開いたエディターに、以下を入力し、実行。
function getAllEvents(accessToken, handler){ var handleRequest = function(url){ resp = UrlFetchApp.fetch(url); if (resp.getResponseCode() != 200){ throw "failed to query events." } result = JSON.parse(resp.getContentText()) for each(var event in result.data) { handler(event) } return result.paging.next } nextUrl = "https://graph.facebook.com/v2.10/YYYYYYYYYY/events?pretty=0&limit=100&access_token=" + accessToken do{ nextUrl = handleRequest(nextUrl) }while(nextUrl != null); } function myFunction(){ var sheet = SpreadsheetApp.getActive().getSheetByName("Activity_work"); var row = 2 v = function(value){ if(typeof value == "undefined"){ return "" } return value } getAllEvents("XXXXXXXXXXXXXXXXXXXXXXXXX",function(e){ range = sheet.getRange(row++, 1, 1, 6) place = e["place"] != null ? e["place"].name:"" startTime = new Date(Date.parse(e.start_time)); date = startTime.getFullYear()+"/"+(startTime.getMonth()+1)+"/"+startTime.getDate(); range.setValues([[date, e.name, v(e.description), v(e.start_time),v(e.end_time), place]]) }); }
XXXXXX: 先程グラフAPIエクスプローラで取得したアクセストークン
YYYYYY: group-id
できた!なんて簡単なんでしょう!