Instagram graph API v6で投稿した画像を取得する

Instagramの投稿をホームページに取り込みたいという案件があったので、Instagram graph APIを試してみました。

使用したのは v6.0 のAPIです。バージョンによっては挙動が違うかもしれません。

前提条件

全体の流れ

Instagramアカウントの投稿を取得するためには、以下のような道のりを辿る必要があります。

  1. Facebookアカウントのアクセストークンを取得する
  2. アカウントに紐付けられている、Facebookページのアクセストークンを取得する
  3. Facebookページに紐付けられている、Instagramのアカウントを見つける
  4. 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"
  }
}