データ分析

超簡単!【インスタグラム】Instagram graph API を用いてフィード・リールのインサイト情報を取得する

Instagramのインサイト等の情報は過去を遡ろうとすると一つ一つの投稿を開いてインサイトを確認しなければならないですよね。さすがにしんどいので「Instagram Graph API」を利用して、各情報を取得すれば、アウトプットの仕方は自由なので、とても便利になります。 今回はフィード投稿のいいね数、コメント数、といった基本的な情報をはじめ、リーチ(投稿を閲覧したユニークユーザーの合計数)やインプレッション(投稿が閲覧された合計回数)といった少し踏み込んだ情報までをAPI経由で取得してみたいと思います。 また、最近リールに対してもAPIが公開されたので、誰よりも先に取得できる内容、取得方法を公開します。

準備

以下の記事を参考にInstagram graph APIを利用できる状況を構築。
API利用する為の環境構築方法

使用する言語

今回は、PHPを基にInstagram graph APIを介してデータ取得します。

取得できる項目(フィード)

取得できるインサイトの項目一覧です。 ※対象アカウントのフォロワー数が100人未満の場合、取得ができません。

followers_count 合計フォロワー数
media_count 投稿数
caption 本文
media_url 投稿画像URL
peramalink 投稿URL
media_type IMAGE:静止画 VIDEO:リール or 動画
like_count いいね数
comments_count コメント数
timestamp 投稿日時
id ユニークID
impressions 一定期間の投稿が表示された回数(UUではない)
reach 一定期間の投稿が表示された回数(UU)
saved 保存数

取得できる項目(リール)

取得できるインサイトの項目一覧です。 ※対象アカウントのフォロワー数が100人未満の場合、取得ができません。

comments コメント数
likes いいね数
plays 再生数
reach 一定期間の投稿が表示された回数(UU)
saved 保存数
shares 共有数

実装

まず、エンドポイント例①に通信し、基本情報を取得します。
それから、投稿ユニークIDをキーにしてエンドポイント②に通信して
詳細なインサイトを取得します。

エンドポイント例①

https://graph.facebook.com/v11.0/※1123456/?fields=※2id,followers_count,media_count,ig_id,media.※3limit(100){caption,media_url,thumbnail_url,permalink,media_type,like_count,comments_count,timestamp,id}&access_token=※4abcdehghijk

解説

※1

対象のアカウントのInstagramIDに変更

※2

取得したい項目(カラム名)に変更

※3

取得投稿件数の上限

※4

対象のアカウントのアクセストークンに変更

戻り値の説明

以下のようなJSON形式の配列が戻ってきます。 利用用途に併せて整形してみてください。

  {
    "data": [
"123456789" //対象のInstagramID "follower_count": 123, //フォロワー数 "media_count": 33, //投稿件数 "ig_id": 456789,  "media": { "data": [ { "caption": "〇〇〇〇〇〇", //投稿本文 "media_url": "https://×××××××××××", //投稿画像URL "permalink": "https://×××××××××××", //投稿URL "media_type": "CAROUSEL_ALBUM or IMAGE", //画像タイプ "like_count": "24",  //いいね数 "comments_count": "1", //コメント数 "timestamp": "2022-06-01T03:00:00+0000", //投稿日 "id": "147258369", //投稿ユニークID } } }

エンドポイント例➁ フィード投稿の場合

解説

※1

エンドポイント①で取得した投稿ユニークIDに変更

※2

対象のアカウントのアクセストークンに変更

戻り値の説明

以下のようなJSON形式の配列が戻ってきます。 利用用途に併せて整形してみてください。

  {
    "data": [
{     "name": "impressions",    "period": lifetime,    "values": [     {    "value": 111111 //インプレッション数    },    ],    "title": "×××××××××××", //投稿タイトル    "description": "×××××××××××", //impressionsの説明    "id": "×××××××××××",    }, {     "name": "engagement",    "period": lifetime,    "values": [     {    "value": 111111   //エンゲージメント数    },    ],    "title": "×××××××××××", //投稿タイトル    "description": "×××××××××××", //engagementの説明    "id": "×××××××××××",    }, {     "name": "reach",     //リーチ数    "period": lifetime,    "values": [     {    "value": 111111    },    ],    "title": "×××××××××××", //投稿タイトル    "description": "×××××××××××", //reachの説明    "id": "×××××××××××",    }, {     "name": "saved",    "period": lifetime,    "values": [     {    "value": 111111   //保存数    },    ],    "title": "×××××××××××", //投稿タイトル    "description": "×××××××××××", //savedの説明    "id": "×××××××××××",    }, }

エンドポイント例➁ リール投稿の場合

解説

※1

エンドポイント①で取得した投稿ユニークIDに変更

※2

対象のアカウントのアクセストークンに変更

戻り値の説明

以下のようなJSON形式の配列が戻ってきます。 利用用途に併せて整形してみてください。

  {
    "data": [
{     "name": "comments",    "period": lifetime,    "values": [     {    "value": 111111 //コメント数    },    ],    "title": "×××××××××××", //投稿タイトル    "description": "×××××××××××", //commentsの説明    "id": "×××××××××××",    }, {     "name": "likes",    "period": lifetime,    "values": [     {    "value": 111111   //いいね数    },    ],    "title": "×××××××××××", //投稿タイトル    "description": "×××××××××××", //likesの説明    "id": "×××××××××××",    }, {     "name": "plays",     //再生数    "period": lifetime,    "values": [     {    "value": 111111    },    ],    "title": "×××××××××××", //投稿タイトル    "description": "×××××××××××", //playsの説明    "id": "×××××××××××",    }, {     "name": "reach",    "period": lifetime,    "values": [     {    "value": 111111   //リーチ数    },    ],    "title": "×××××××××××", //投稿タイトル    "description": "×××××××××××", //reachの説明    "id": "×××××××××××",    }, {     "name": "saved",    "period": lifetime,    "values": [     {    "value": 111111   //保存数    },    ],    "title": "×××××××××××", //投稿タイトル    "description": "×××××××××××", //savedの説明    "id": "×××××××××××",    },
{     "name": "shares",    "period": lifetime,    "values": [     {    "value": 111111   //シェア数    },    ],    "title": "×××××××××××", //投稿タイトル    "description": "×××××××××××", //sharesの説明    "id": "×××××××××××",    },
}

プログラミング例

以下、実際のプログラムコードです。

 //①アカウント情報
$instagram_business_id = "×××××××××";
$access_token = "〇〇〇〇〇〇〇〇〇";
$target_user = $insta_name;

//③取得したい項目を指定(エンドポイント①)
$query = 'id,followers_count,media_count,ig_id,media.limit(100){caption,media_url,thumbnail_url,permalink,media_type,like_count,comments_count,timestamp,id}';

//④エンドポイントURL生成(投稿基本インサイト取得)
$instagram_api_url = 'https://graph.facebook.com/v11.0/';
$target_url = $instagram_api_url.$instagram_business_id."?fields=".$query."&access_token=".$access_token;

//④JSON形式から変換
$get_data_ar = json_decode(@file_get_contents($target_url), true);

//⑤リールとフィードで取得できる項目が異なる為、条件分岐
foreach($get_data_ar["media"]["data"] as $key => $val){
  //リールの場合
  if($val["media_type"] == "VIDEO" && strpos($val["permalink"],'reel') != false){
    //⑥取得したい項目を指定(エンドポイント➁)
  $target_insight_url = $instagram_api_url.$val["id"]."/insights?metric=comments,likes,plays,reach,saved,shares,total_interactions&access_token=".$access_token;
   //フィードの場合
  }else{
  //⑥取得したい項目を指定(エンドポイント①)
    $target_insight_url = $instagram_api_url.$val["id"]."/insights?metric=impressions,engagement,reach,saved,reach&access_token=".$access_token;
  }
 //⑦取得データを配列に追加
 $insight_ar[$val["id"]] = json_decode(@file_get_contents($target_insight_url), true);
 $target_date = date("Y-n-j",strtotime($val["timestamp"]));
 $target_date_ar = explode("-",$target_date);

  //⑧初期値を設定
  $val["comments_count"] = 0;
  $val["like_count"] = 0;
  $val["plays"] = 0;
  $val["reach"] = 0;
  $val["saved"] = 0;
  $val["shares"] = 0;
  $val["impression"] = 0;
  $val["reach"] = 0;
  $val["saved"] = 0;

 //⑨リールとフィードで取得する項目を分ける
 if($val["media_type"] == "VIDEO" && strpos($val["permalink"],'reel') != false){
    $val["comments_count"] = $insight[$val["id"]]["data"][0]["values"][0]["value"];
    $val["like_count"] = $insight[$val["id"]]["data"]["values"][0]["value"];
    $val["plays"] = $insight[$val["id"]]["data"]["values"][0]["value"];
    $val["reach"] = $insight[$val["id"]]["data"]["values"][0]["value"];
    $val["saved"] = $insight[$val["id"]]["data"]["values"][0]["value"];
    $val["shares"] = $insight[$val["id"]]["data"][5]["values"][0]["value"];
  }else{
    $val["impression"] = $insight[$val["id"]]["data"][0]["values"][0]["value"];
    $val["reach"] = $insight[$val["id"]]["data"]["values"][0]["value"];
    $val["saved"] = $insight[$val["id"]]["data"]["values"][0]["value"];
  }

 //⑩連想配列に整形
 $content_data_ar[$target_date_ar[0]][$target_date_ar][$target_date_ar][] = $val;
}

解説

対象のアカウントの情報に変更

100件分の投稿情報を取得

エンドポイントのURLを定義する為に 取得したい項目をカンマ区切りで定義していきます。

JSON形式のデータが返却される為、 デコードします。

リールとフィードでエンドポイントURLが異なる為、分岐

それぞれのエンドポイントを生成

インサイト項目がないときもあるので、初期値を設定しておきます。

リールとフィールで配列に代入

連想配列に整形した値を代入

今回はフィード投稿のインサイトが取得できたので、 次回はストーリーズのインサイトを取得してみたいと思います。