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をキーにしてエンドポイント②に通信して
詳細なインサイトを取得します。
エンドポイント例①
解説
対象のアカウントのInstagramIDに変更
取得したい項目(カラム名)に変更
取得投稿件数の上限
対象のアカウントのアクセストークンに変更
戻り値の説明
以下のような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
}
}
}
エンドポイント例➁ フィード投稿の場合
解説
エンドポイント①で取得した投稿ユニークIDに変更
対象のアカウントのアクセストークンに変更
戻り値の説明
以下のような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": "×××××××××××",
},
}
エンドポイント例➁ リール投稿の場合
解説
エンドポイント①で取得した投稿ユニークIDに変更
対象のアカウントのアクセストークンに変更
戻り値の説明
以下のような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が異なる為、分岐
それぞれのエンドポイントを生成
インサイト項目がないときもあるので、初期値を設定しておきます。
リールとフィールで配列に代入
連想配列に整形した値を代入
2009年にIT業界に就職、開発者を志す。マッチングアプリ、ソーシャルゲーム、顧客管理システム開発を経て、ソーシャルマーケティングのマーケターを経験後、SNS管理ツール「GENba」の開発者として運用まで担っている。
2019年、株式会社toにジョイン。