DataSpiderからFacebookのグラフAPIを使って情報取得をしてみた

## はじめに

こんにちは、すぎもんです:grinning:今回はFacebookのグラフAPIを使ってみます。
Facebookアプリのアカウントや、投稿に対する操作をするためのAPIです。因みに、FacebookグラフAPIは、InstagramグラフAPIのベースとなっていますので、もしInstagram APIを使ってみたい方はFaceBook グラフAPIも併せてご確認ください。

## Facebookとは
今や人々の生活の一部となっているSNS（ソーシャルネットワーキングサービス）。その中でもFacebookは、世界で最もユーザー数が多く、年齢別で利用率が異なるものの、日本国内では、30～60代の利用率が高いサービスです。基本的に実名で利用するという特徴を持っており、企業の公式アカウントも多く、販促やブランディングにも使われています。

## 今回やること
DataSpiderと連携して、Facebookの<strong> グラフAPI </strong>を使ってみます。

グラフAPIを使って「特定のオブジェクトのデータを取得」します。

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
<strong>[■グラフAPIとは](https://developers.facebook.com/docs/graph-api/overview?locale=ja_JP)</strong>
Facebookの「ソーシャルグラフ」の読み取りと書き込みを行う手段。
HTTPベースのAPIで、投稿や写真アップロードなど、Facebookアプリに対するさまざまなタスクに利用できます。

<strong>■ソーシャルグラフとは</strong>
Facebookなどのソーシャルメディアの人間関係や、集積された情報を可視化させたもの。「ノード・エッジ・フィールド」の3つで構成されています。API利用の観点だと、それぞれで取得できる情報や操作できる内容が異なる、という理解で問題ないと思います。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++


## 検証手順
＜Facebookの設定＞
　　　　①アカウントの作成
　　　　②アプリの作成
　　　　③接続情報の確認

＜DataSpiderの設定＞
　<strong>１．アクセストークンの取得をするスクリプトの作成</strong>
　　　　④プロジェクト/スクリプト/スクリプト変数の作成
　　　　⑤GET実行の設定
　<strong>２．Facebookの/meノードの情報を取得するスクリプトの作成</strong>
　　　　⑥プロジェクト/スクリプト/スクリプト変数の作成
　　　　⑦GET実行の設定

## Facebookの設定
##### ①アカウントの作成

まずは、ユーザーアカウントを発行し、開発者としての登録までを実施します。
詳細は割愛しますが、下記をご参考にしてください。
　　　　[◆グラフAPI-スタートガイド](https://developers.facebook.com/docs/graph-api/get-started)
　　　　[◆Facebook開発者としての登録について](https://developers.facebook.com/docs/development/register)

##### ②アプリの作成
開発者としての登録完了後に、下記の画面が表示されるので【アプリを作成】を押下。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/1175a58a-6fe5-9371-435b-9f80faa9134b.png)
アプリタイプは、「`なし`」を選択し、【次へ】を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/81ca86b3-25f7-f83e-8321-2b9529160a61.png)
アプリ名を入力し、【アプリを作成】を押下します。

:::note warn
赤枠のエラーは、アプリ名を「fb」で始める名前にして表示されたものです。エラーメッセージにある内容を参考に、エラーにならないアプリ名を設定しましょう。
:::
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/1bbac7bc-63fb-c77c-f618-21fcbc7abd25.png)

アプリ作成後、パスワード入力のポップアップ表示が出るので、入力し【送信】を押下します。これで、アプリの作成は完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/84d314a3-5c49-d476-1a18-9f5e026f3055.png)
画面上部に、作成したアプリ名とアプリIDが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/044a21a9-8514-c116-8055-87e844a2922e.png)

##### ③接続情報の確認
アプリ作成が完了したので、DataSpiderから接続するために必要な情報を確認します。

[開発者サイト（Meta for Developers）]( https://developers.facebook.com/?locale=ja_JP)から「マイアプリ」で下記の画面を表示します。作成したアプリのアイコン部分を押下して、ダッシュボードを表示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/7eac6f17-75b4-71ec-dc6b-6775e1d66947.png)
左側のメニューバー「設定」-「ベーシック」で表示される<strong>「アプリID」</strong>と<strong>「app secret」</strong>は、DataSpiderの設定で使用するので控えておきましょう。

<strong>「app secret」</strong>は表示を押下して、パスワード入力すると表示されます。

左側のメニューバー「Facebookログイン」-「設定」から、Oauthの設定画面を表示します。「有効なOAuthリダイレクトURL」という項目に下記のリダイレクトURLを設定します。
・リダイレクトURL　：　
　　　　`https://{DataSpiderServerのアドレス}:8443/dataspider/oauth_2_0`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/2f136397-bfb2-6e63-2251-29f9de018617.png)
Facebookの設定は、これで完了です。

## DataSpiderの設定

FacebookのグラフAPIを使うにはまず、アクセストークンの取得が必要です。
そのため、今回は下記2つのスクリプトを作成します。
　　　◇アクセストークンの取得
　　　◇Facebookの/meノードの情報を取得

Facebookのアクセストークンについて、記事最後にご参考を記載しています。
詳細については、下記をご参照ください。
　　　　[◆アクセストークンについて](https://developers.facebook.com/docs/facebook-login/guides/access-tokens)
　　　　[◆アクセストークンの取得について](https://developers.facebook.com/docs/facebook-login/guides/advanced/manual-flow)

##### ④接続先の設定
まず始めに、FacebookのグラフAPIへの接続先を設定します。
DataSpider Studioの「コントロールパネル」-「グローバルリソースの設定」-「新しいグローバルリソースの作成」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/7cbd5b4a-22cb-5b0b-8125-36ff7e60f62c.png)
「認証」タブの「OAuth 2.0」を選択し、「次へ」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/18f5107b-222e-6580-abf1-179f73c2f78f.png)
それぞれ下記の通りに設定します。
　・接続名　　　　　　　　　：　`facebook Oauth 2.0認証設定`
　・クライアントID　　　　　：　`XXX`（※FacebookアプリのアプリID）
　・クライアントシークレット：　`XXX`（※Facebookアプリのapp secret）
　・リダイレクトURI（※Facebookアプリに設定したリダイレクトURI）
　　：　`https://{DataSpiderServerのアドレス}:8443/dataspider/oauth_2_0`
　・認可エンドポイント　　
　　：　`https://www.facebook.com/v15.0/dialog/oauth`
　・トークンエンドポイント
　　：　`https://graph.facebook.com/v15.0/oauth/access_token`
　・スコープ　　　　　　　：　`public_profile`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/2a77a198-6c8d-9266-03bb-4e37c7c6e1eb.png)

:::note warn
今回は、<strong>認可コード</strong>を使うフローなので、認可コードとトークンエンドポイントの両方が必要です。[Meta for Developers（Facebookアプリの開発者向けドキュメント）](https://developers.facebook.com/docs/facebook-login/guides/advanced/manual-flow)より、下記の通り設定します。

<strong>■認可エンドポイント</strong>
　：　https://www.facebook.com/(*version)/dialog/oauth
<strong>■トークンエンドポイント</strong>
　：　https://graph.facebook.com/(*version)/oauth/access_token

<strong>スコープ</strong>は、[Meta for Developers（アクセス許可のリファレンス）](https://developers.facebook.com/docs/permissions/reference/public_profile)より、プロフィール読み取りをする `public_profile`を設定します。
:::

### ◇アクセストークンの取得をするスクリプトの作成
##### ⑤プロジェクト/スクリプト/スクリプト変数の作成
まず始めに、プロジェクトとスクリプトを任意の名前で作成します。
また、処理内で使用するスクリプト変数を下記の通り作成します。
| 名前 | 初期値 | 変数型|
|:-----------|:--------|:--------|
| client_id | ※FacebookアプリのアプリID |文字列型|
| client_secret | ※Facebookアプリのapp secret |文字列型|
| 認可コード | ※未設定 |文字列型|

:::note warn
スクリプト変数「認可コード」に後で取得するアクセストークンを設定します。
:::

##### ⑥GET実行の設定
デザイナ画面右側のツールパレットの[ネットワーク]＞[REST]＞[GET実行]アイコンを、デザイナ中央部分にドラッグ＆ドロップして設定画面を開きます。

まず、接続先の入力欄の右端▶を押下し「追加」をします。下記の通り設定します。
　　・名前　：　`REST接続設定 facebook`
　　・URL 　：　`https://graph.facebook.com/v15.0`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/704d6055-8d47-c1d7-1058-9a042d026caf.png)
「接続テスト」を押下してDataSpiderとの接続確認をして完了です。

必須設定タブは下記の通り設定します。
　　・名前　　：　`アクセストークン取得`
　　・接続先　：　`REST接続設定 facebook`
　　・パス　　：　`/oauth/access_token`
＜クエリパラメータ＞
| 名前 | 値 |
|:-----------|:--------|
| client_id | スクリプト変数「client_id」 |
| client_secret | スクリプト変数「client_secret」 |
| redirect_uri | ※FacebookアプリのOAuth設定で指定したリダイレクトURI※|
| code | スクリプト変数「認可コード」 |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/56c827db-21d5-539f-71b9-5132c3cd935e.png)

:::note warn
スクリプト変数の記載方法は、<strong>${スクリプト変数名}</strong>と記載します。
入力項目欄の右端▶からも変数を選択ができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/66c726a9-ce4d-d720-a2bb-607e1243d4f7.png)
:::
必須設定タブの設定は以上です。

次に、レスポンス設定タブは下記の通り設定します。
　　・データ出力先　：　`ファイル`
　　・ファイルパス　：　`/data/facebook/access_token_response.json`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/1de972f4-c782-9434-f3e0-268d0044a374.png)
「完了」を押下して、GET実行処理の設定は以上です。アクセストークン取得のスクリプト作成は完了です。

### ◇Facebookの/meノードの情報を取得するスクリプトの作成
##### ⑦プロジェクト/スクリプト/スクリプト変数の作成
まず始めに、プロジェクトとスクリプトを任意の名前で作成します。また、処理内で使用するスクリプト変数を下記の通り作成します。全て初期値は未設定で作成します。
| 名前 | 初期値 | 変数型|
|:-----------|:--------|:--------|
| access_token | ※未設定※ |文字列型|
| id | ※未設定※ |文字列型|
| name | ※未設定※ |文字列型|

##### ⑧GET実行の設定
デザイナ画面右側のツールパレット[ネットワーク]＞[REST]>[GET実行]アイコンを、デザイナ中央部分にドラッグ＆ドロップして設定画面を開きます。

下記の通り設定します。
　　・名前　　：　`API実行`
　　・接続先　：　`REST接続設定 facebook`
　　・パス　　：　`/me`
＜クエリパラメータ＞
　　・名前　　：　`access_token`
　　・値　　　：　`${access_token}`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/ed4edb4c-7d2b-7067-9e00-4294d54793f0.png)

続いて、レスポンス設定タブです。
　　・データ出力先　　：　`データ`
　　・データ形式　　　：　`JSON`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/3edcbe4e-94eb-b52f-ddd1-dec34b203ce5.png)
青字リンクの<font color=blue>JSONファイルを指定して出力スキーマを設定</font>を押下して、JSONファイルによるスキーマ設定をします。ここでは準備したファイルを設定することができます。DataSpiderServerの/data配下のフォルダに、準備したファイルを格納して指定しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/e8125505-c643-240a-a499-3f0069191e5b.png)

:::note 
指定するJSONファイルは、各Web APIのサイトページに記載された例をコピーして作成したり、Curlコマンド等でファイルを作成してDataSpiderで読み込みます。
:::

最後に、"API実行"で取得したデータのマッピング設定をします。

デザイナ画面右側のツールパレットメニューから、[変換]＞[基本]＞[マッピング]アイコンを、「GET実行」アイコンの右側にドラッグ＆ドロップします。
「フローの作成」では、「プロセスフローとデータフローを引く」を選択してください。

マッピングアイコンをダブルクリックして、下記の通りマッピングします。

JSONファイルで定義した「name」と「id」を、スクリプト変数として定義した「name」と「id」に線をつなぎましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/7d7612c7-ef76-a168-8921-b82b1e48eb49.png)

## スクリプトのテスト実行
完成スクリプトです。今回は下記２つのスクリプトを作成しました。

<strong>①アクセストークンの取得をするスクリプト</strong>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/fa6534c2-75fc-ee82-ce5b-82da4d79e9a3.png)
<strong>②Facebookの/meノードの情報を取得をするスクリプト</strong>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/caf632dc-2ad7-9fd9-55ae-c55e563a2b80.png)


:::note info
実行順序の注意。必要情報を取得しながら、下記の通り実行します。
　　①認可コードの取得（グローバルリソースを利用）
　　②アクセストークンの取得（スクリプトの実行）
　　③APIの実行（スクリプトの実行）
:::

+++++++++++++++以下、テスト実行です++++++++++++++++++++++++++

##### テスト実行①認可コードの取得（グローバルリソースの利用）
DataSpider Studioの[コントロールパネル]＞[グローバルリソースの設定]を選択し、冒頭で作成したグローバルリソース（接続先）の設定を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/b985d54a-8aab-c601-b659-a9aa0881f326.png)
上記キャプチャ右下にある<font color=blue>青字</font>リンク「<font color=blue>トークンを発行する</font>」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/79e6e1d0-d6c4-bb0b-6ec1-57af9a9deda1.png)
認可コードの設定が表示されますので、<font color=blue>青字</font>リンク「<font color=blue>認可コード取得…</font>」を押下しましょう。

下記の通り「認可コード」が表示されるので、値をコピーして控えておいてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/1ff3778c-27e7-9322-08dc-aeb9eaf7aa11.png)

##### テスト実行②アクセストークンの取得（スクリプトの実行）
「アクセストークンの取得」をするスクリプトを開きます。
スクリプト変数「認可コード」の「初期値」に取得した「認可コード」を設定します。
>（該当記事部分の一部抜粋）
・・・処理内で使用するスクリプト変数を下記の通り作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/cabe1bd2-04ff-a59c-307b-e8e8977e3010.png)

認可コードの設定が完了したら、保存をして、スクリプトのテスト実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/3e3f7e6d-9aa2-f8be-99dd-fbb5d3d2a8f2.png)
DataSpiderのエクスプローラ「data/facebook」を開き、「access_token_response.json」があるかを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/fa5b9627-9021-1d03-d2db-1ca4c450e927.png)
指定したファイルの中身が、下記のようになっていれば成功です。
（※見やすいよう「,」を「,改行」で置換）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/77a931a3-1e23-8d58-0e42-1aa96ca03fdb.png)
「"access_token:"」の後の「”」で括られた文字列がアクセストークンです。コピーして控えておきましょう。

:::note warn 
認可コードの有効期限は短いので、認可コードがブラウザに表示されてから、アクセストークンの取得スクリプトを実行するまでの操作は素早く実施しましょう。
:::

認可コードを設定するスクリプトと、スクリプト変数は開いておくといいですね。

##### テスト実行③APIの実行
本題です。Facebookの/meノードの情報を取得する（API実行の）スクリプトを実行します。
スクリプト変数「access_token」に取得したアクセストークンを設定します。
スクリプトを保存してテスト実行しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/d5f712e2-bd50-428e-fd34-47c938bce996.png)
実行ログを確認してみましょう。（ログレベル：INFO）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/becdd4e9-48ca-d5bd-a054-43665b322864.png)
実行ログ内に「id」と「name」が出力されていたら成功です。

:::note warn
<strong>■結果確認について</strong>
レスポンスで得られるJSONファイルの出力結果は、「name」のマルチバイト文字がUnicodeエスケープシーケンスに変換された状態のままで確認しづらいので、変数格納して実行ログにて確認しました。
:::

+++++++++++++++ここまでが、テスト実行です++++++++++++++++++++++++++

### （ご参考）Facebook 開発者サイトから実行結果の確認について

Facebookの開発者サイトにログインし、[グラフAPIエクスプローラー](https://developers.facebook.com/tools/explorer?locale=ja_JP)から、APIの確認ができます。その結果と、スクリプト実行の結果を照合してみてもOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/e55621f1-4e38-5fe9-74b5-bcbcc974e743.png)
[スタートガイド](https://developers.facebook.com/docs/graph-api/get-started)にある「最初のリクエスト」の「ステップ1～3」の内、ステップ2の「アクセストークン作成」の操作をスクリプト実行で取得したアクセストークンを設定する手順に置き換えます。

### （ご参考）アクセストークンの取得について
OAuth2.0による認可コードを使ったフローでアクセストークンを取得した場合、有効期限は60日間です。有効期間内であれば、「認可コード」と「アクセストークン」の再取得不要です。スコープを変更したい場合や、取得後60日間を経過した場合は、再取得しましょう。

尚、アクセストークンは、「[アクセストークンデバッカー](https://developers.facebook.com/tools/debug/accesstoken/)」というFacebookの開発者サイト内の機能を使うと状態の確認ができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/11363efe-4718-c32e-d6fd-2d5aabc2842a.png)
右上の「APIバージョン」を、利用しているバージョンに合わせ、発行したアクセストークンを貼り付けます。「デバック」を押下すると、下記のように、有効期限などの「アクセストークン情報」が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/600e72e2-65d9-552e-058a-a3c9ed85f3e3.png)
表示された一覧の中の対象項目にマウスオーバーすると、下記のように、具体的な日時が分かりやすく表示されます。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/43e9337f-3723-3a09-09c1-1c5589ef62e9.png)

## 最後に
いかがでしたでしょうか。今回はDataSpiderからFacebookのGraph APIを使ってみました。
API操作自体は、情報取得という基本的な操作でしたが、アクセストークン取得を含めたスクリプト作成の方法や、テスト実行の方法などを、ご確認いただけたかと思います。

また今回は、テスト実行時の確認方法として、DataSpiderの「実行ログ」を使ってみました。WebAPIでのレスポンスはJSON形式なことが多いものの、そのままでは解読が難しい場合もあります。読みづらいJSON形式のファイルを操作するのではなく、検証用に必要値を実行ログに出力するスクリプトを作成し、継続的な活用を見越して汎用化するのも良いですね。

ここまで読んでいただきありがとうございました。それでは、また！