Facebook APIを使ったお手軽データ取得方法

Facebook API、アクセストークンの種類がいっぱいあって難しい、特にユーザアクセストークンとか発行面倒。
今回私はただデータを一括で取得したいという目的だったので、APIをがっつりとは触りたくないと感じました。
気軽に呼び出せる方法がありましたので紹介します。

グラフAPIエクスプローラ

グラフAPIエクスプローラ - 開発者向けFacebook

これがすべてです。

これ自体が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

できた!なんて簡単なんでしょう!