Instagram graph API v6で投稿した画像を取得する
Instagramの投稿をホームページに取り込みたいという案件があったので、Instagram graph APIを試してみました。
使用したのは v6.0 のAPIです。バージョンによっては挙動が違うかもしれません。
前提条件
- Instagramをプロアカウントに設定してあること
- Facebookページを作成してあること
- FacebookページとInstagramのアカウントを連携してあること
全体の流れ
Instagramアカウントの投稿を取得するためには、以下のような道のりを辿る必要があります。
- Facebookアカウントのアクセストークンを取得する
- アカウントに紐付けられている、Facebookページのアクセストークンを取得する
- Facebookページに紐付けられている、Instagramのアカウントを見つける
- Instagramのアカウントに紐付けられている投稿を取得する
1. Facebookアプリを作る
Facebook for developersで開発者として登録し、facebookアプリを作成します。 作成時に確認できる アプリID と app secret を控えておいてください。
2. アクセストークンを発行する
FacebookのAPIで用いるアクセストークンには、いくつかの種類があるようです。 今回は、ユーザーアクセストークンと、ページアクセストークンの2種類を使用します。
ユーザーアクセストークンには有効期限の違う短期トークンと長期トークンというものがあるので、この記事では全部で3種類のトークンが登場します。
2-1. 短期トークンを作る
まず最初に、グラフAPIエクスプローラを用いて、寿命が1時間程度の ユーザーアクセストークン というものを取得します。 「Get Access Token」 とか 「トークンを取得」 といった名前のボタンがあるはずです。
このとき、欲しいアクセス許可(パーミッション)を選ぶことが出来ます。 この記事で使用するのは、以下の3つです。
public_profile
: 必ず付与されますpages_show_list
: ページの一覧を取得するのに必要ですinstagram_basic
: Instagramの情報にアクセスするのに必要です
作成したトークンの寿命や与えられているパーミッションについては、アクセストークンデバッガーを用いることで確認できます。
2-2. 長期トークンを作る
次に、以下のAPIを使用して60日間程度の有効期限がある長期トークンを発行します。
$ curl "https://graph.facebook.com/v6.0/oauth/access_token?grant_type=fb_exchange_token&client_id=$APPLICATION_ID&client_secret=$APP_SECRET&fb_exchange_token=$SHORT_TOKEN"
{
"access_token": "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdfeghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",
"token_type": "bearer",
"expires_in": 1234567
}
$SHORT_TOKEN
が先程取得した短期トークンです。
$APPLICATION_ID
と $APP_SECRET
については、Facebookアプリを作成した際に控えた値を入れてください。
2-3. ページアクセストークンを作る
最後に、以下のAPIで寿命のない ページアクセストークン というものを取得します。
投稿を取得する際に使用するアクセストークンは、このページアクセストークンになります。
$ curl "https://graph.facebook.com/v6.0/me/accounts?fields=access_token,name&access_token=$LONG_TOKEN"
{
"data": [
{
"access_token": "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdfeghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEF",
"name": "Facebookページの名前",
"id": "012345678901234"
}
],
"paging": {
"cursors": {
"before": "ABCDEFGHIJKLMNOPQRST",
"after": "ABCDEFGHIJKLMNOPQRST"
}
}
}
$LONG_TOKEN
は2-2で作成した長期トークンが入ります。
いくつかFacebookページを持っている場合は、そのページの分だけ結果が返ってくるようです。
その場合は、Instagramアカウントを紐付けてあるFacebookページのaccess_token
を使用してください。
3. IG User IDを取得する
Instagramから情報を取得するためには、そのアカウントを特定するための IG UserのID が必要です。 IG User IDは、以下のAPIで取得できます。
$ curl "https://graph.facebook.com/v6.0/me?fields=instagram_business_account&access_token=$PAGE_TOKEN"
{
"instagram_business_account": {
"id": "01234567890123456"
},
"id": "012345678901234"
}
$PAGE_TOKEN
には2-3で作成したページアクセストークンを入れてください。
instagram_business_account
の中にある id
が、 IG User ID です。
4. Instagramの投稿を取得する
最後に、ここまでで取得した情報を用いてInstagramに行った投稿を取得します。
ユーザのプロフィールはIG User APIで、今までの投稿などはIG Media APIでそれぞれ取得することが出来ます。
試しに、今までに行った投稿のキャプションと画像へのURLを取得してみます。
$ curl "https://graph.facebook.com/v6.0/$IG_USER_ID/media?fields=caption,media_url&access_token=$PAGE_TOKEN"
{
"data": [
{
"media_url": "画像へのURL",
"caption": "投稿に付けられたキャプション",
"id": "01234567890123456"
},
{
"media_url": "画像へのURL",
"caption": "投稿に付けられたキャプション",
"id": "01234567890123456"
},
{
"media_url": "画像へのURL",
"caption": "投稿に付けられたキャプション",
"id": "01234567890123456"
},
...
],
"paging": {
"cursors": {
"before": "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz012345678",
"after": "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789ABCDEFG"
},
"next": "続きを取得するためのAPIエンドポイントのURL"
}
}
$IG_USER_ID
は、先程取得した IG User ID が入ります。
これで念願の投稿画像が手に入りました!
件数に制限を付けたい場合は、 limit
というクエリを追加して、以下のようにします。
$ LIMIT=2
$ curl "https://graph.facebook.com/v6.0/$IG_USER_ID/media?fields=caption,media_url&limit=$LIMIT&access_token=$PAGE_TOKEN"
{
"data": [
{
"media_url": "画像へのURL",
"caption": "投稿に付けられたキャプション",
"id": "01234567890123456"
},
{
"media_url": "画像へのURL",
"caption": "投稿に付けられたキャプション",
"id": "01234567890123456"
}
],
"paging": {
"cursors": {
"before": "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz012345678",
"after": "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789ABCDEFG"
},
"next": "続きを取得するためのAPIエンドポイントのURL"
}
}