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アプリを作成します。 作成時に確認できる アプリIDapp 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"
  }
}