フロントの人の雑多メモ

当ブログはAIを使用していません。血の通った記事をお楽しみください。

【2026年版】Instagram APIとPHPで投稿を埋め込む手順をスクショ付きでご紹介

【2026年版】Instagram APIとPHPで投稿を埋め込む手順をスクショ付きでご紹介

Instagram Graph APIとPHPを使ってInstagramの投稿を取得し、Webページに埋め込む方法をご紹介します。

InstagramのAPIってちょくちょく仕様が変わるイメージがあり、いつもとっつきにくいのですが、2026年時点での方法を一からまとめました。

もし今後、仕様が変わっていたらコメントで教えていただけると嬉しいです。

目次

Instagramアカウントをプロアカウントに切り替え

まずは、投稿を取得したいInstagramアカウントを「プロアカウント」に切り替えます。

プロアカウントに切り替えても、料金などが発生するわけではないのでご安心ください。
非公開アカウント(鍵垢)をプロアカウントに切り替えると公開されるのでご注意ください。

Instagramの設定の アカウントの種類とツール から「プロアカウントに切り替える

Instagram アカウントの種類とツール プロアカウントに切り替える

タイプを選択します。
どちらでも一緒だと思いますが、当てはまる方を選択します。 (後から変更可)

Instagram プロアカウント タイプ クリエイター ビジネス

カテゴリを選択します。 (後から変更可)

Instagram プロアカウント カテゴリを選択

以上で、プロアカウントへの切り替え完了です。

Facebookのページを作成し、Instagramアカウントと紐づけ

Instagram APIを使用するために、Facebookの「ページ」という、APIを叩くための窓口のようなものを作る必要があります。

Facebookから「ページ」を開きます。

Facebook ページ

ページを作成

Facebook ページを作成

公開ページ」を選択して次へ

Facebook ページを作成 公開ページ

ページ名」と「カテゴリ」を入力して「Facebookページを作成」をクリック

Facebook ページを作成

Facebookのページの作成が完了しました。
Instagramアカウントと紐づけていきます。

Facebook右上のプロフィールから、いま作成したページが選択されている状態で「設定とプライバシー > 設定」をクリック

Facebook ページ 設定とプライバシー

リンクするアカウント」から「Instagram」をクリックして、先ほどプロアカウントに切り替えたInstagramアカウントでログインし、リンクさせます。

Facebook ページ リンクするアカウント Instagram

以上で、FacebookのページとInstagramアカウントの紐づけが完了しました。

Meta for Developersでアプリを作成し、トークンを取得

Meta for Developersでアプリを作成し「InstagramアカウントID」と「アクセストークン」を取得していきます。

Meta for Developersにログインします。 (初回は登録が必要かもしれません)

マイアプリから「アプリを作成

Meta for Developers アプリを作成

アプリ名」と「メールアドレス」を入力し次へ

Meta for Developers アプリの詳細 アプリ名 アプリの連絡先メールアドレス

ユースケースを追加します。
自分のアプリにどのような役割を持たせるのか という設定のようなものです。

今回は「その他 > 他の」を選択します。

Meta for Developers ユースケース その他 他の This option is going away soon アプリは古いバージョンで作成されます。

「古いバージョン」とありますが、色々試したところ、古いバージョンの方が情報が多いので、採用しました。

アプリタイプは「ビジネス」を選択

Meta for Developers アプリタイプ ビジネス

アプリ名とメールアドレスを確認し「アプリを作成」をクリック

Meta for Developers アプリを作成

アプリが作成されました。

商品を追加」からInstagramの「設定」をクリックし、Instagram Graph APIを追加します。

Meta for Developers 商品を追加 Instagram

Instagramアカウントを、このアプリのInstagramテスターに追加します。

サイドメニューの「アプリの役割」を開き、右上の「メンバーを追加」から「Instagramテスター」を選択し、InstagramのIDを入力して追加

Meta for Developers アプリに人を追加 Instagramテスター

「承認待ち」となるので アプリとウェブサイト のリンクから、Instagramを開きます。

Meta for Developers アプリの役割 承認待ち

Instagramで「テスターへのご招待」タブから、いまリクエストしたアプリについて「承認する」をクリック

Instagram アプリとウェブサイト テスターへのご招待 承認する

続けて「InstagramアカウントID」と「アクセストークン」を取得していきます。

アクセストークンは

  1. まず有効期限1時間のものを取得
  2. 延長して3ヶ月のものを取得

という2段構成です。

最長でも3ヶ月のものしか取れないようなので、最終的にはPHPなどで3ヶ月毎にアクセストークンを更新する処理も入れていきます。

メニューの「ツール > グラフAPIエクスプローラー」を開きます。

Meta for Developers グラフAPIエクスプローラー

Metaアプリ」がいま編集中のアプリになっているか確認し
アクセス許可」は、自分の投稿を取得するだけなら「instagram_basic」を追加
後述しますが、他人の投稿も取得するなら「instagram_basic」と「instagram_manage_insights」も追加
Generate Access Token」をクリックし、その上部に表示されたアクセストークンをコピーします。

Meta for Developers グラフAPIエクスプローラー Generate Access Token

ここで取得できたアクセストークンが、有効期限1時間のものになります。
この有効期限を延長していきます。

メニューの「ツール > アクセストークンデバッガー」を開きます。

Meta for Developers アクセストークンデバッガー

一番上に、先ほどコピーしたアクセストークンを貼り付け「デバッグ」をクリック
有効期限が「約1時間以内」なのを確認し
「instagram_basic」の数字の羅列が「InstagramアカウントID」なので控えます
アクセストークンを延長」をクリック。 出力されたアクセストークン (有効期限3ヶ月) をコピーします。

Meta for Developers アクセストークンデバッガー アクセストークンを延長

以上で、「InstagramアカウントID」と「アクセストークン (有効期限3ヶ月)」が取得できました。

最後に「アプリの設定 > ベーシック」から、アプリの基本的な設定を入れておきましょう。

「表示名」「アプリドメイン」「アプリアイコン」「連絡先メールアドレス」あたりが最低限入っていれば大丈夫だと思います。

Meta for Developers アプリの設定 ベーシック

PHPで投稿を取得するコードのサンプル

取得した「InstagramアカウントID」と「アクセストークン」を使ってAPIを叩くPHPコードのサンプルをご紹介します。

次の3段構成 +α でコードをご紹介していきます。

一番基本的なコード

まずは、一番基本的なコードです。 ただし、このコードにはいくつか問題があるので次で解説します。
「アクセストークン」と「InstagramアカウントID」はご自身のものに置き換えてください。

// =============================================
// 設定
// =============================================
$access_token      = 'ここにアクセストークンを入力'; //置き換え
$instagram_user_id = 'ここにInstagramアカウントIDを入力'; //置き換え

// 取得するフィールド
$fields = 'id,caption,media_type,timestamp,permalink,thumbnail_url,media_url';

// =============================================
// APIリクエスト
// =============================================
$url = "https://graph.facebook.com/v19.0/{$instagram_user_id}/media?fields={$fields}&access_token={$access_token}";

$response = file_get_contents($url);

if ($response === false) {
	die('APIリクエストに失敗しました。');
}

$data = json_decode($response, true);

// エラーチェック
if (isset($data['error'])) {
	die('APIエラー: ' . $data['error']['message']);
}

// =============================================
// 結果の表示
// =============================================
$posts = $data['data'];

echo "投稿数: " . count($posts) . "件\n";

foreach ($posts as $post) {
	echo "ID        : " . ($post['id']           ?? '') . "\n";
	echo "種類      : " . ($post['media_type']   ?? '') . "\n";
	echo "日時      : " . ($post['timestamp']    ?? '') . "\n";
	echo "キャプション: " . ($post['caption']    ?? '(なし)') . "\n";
	echo "URL       : " . ($post['permalink']    ?? '') . "\n";
	echo "画像URL   : " . ($post['media_url']    ?? '') . "\n";
}

上記のコードだと、ページを開く度にAPIを叩くので、すぐにレート制限に達してしまいます。
なので1日に一回JSONファイルなどにキャッシュし、その日はキャッシュから投稿を読み込むようにする などの工夫が必要です。

1日に一回、データをキャッシュするコード

ページを開く度にAPIを叩くと、すぐにレート制限に達してしまうので、1日に一回などの頻度で、取得した投稿をキャッシュとして保存し、その日はキャッシュから読み込むようにするような工夫が必要です。

以下が、1日に一回投稿のデータをキャッシュするサンプルです。
このPHPファイルを置いたディレクトリに「instagram.json」というファイルが生成され、キャッシュが記録されます。
「instagram.json」のタイムスタンプを確認し、24時間以上経過していれば、新しくAPIを叩いて、再度キャッシュを行います。

// =============================================
// 設定
// =============================================
$access_token      = 'ここにアクセストークンを入力'; //置き換え
$instagram_user_id = 'ここにInstagramアカウントIDを入力'; //置き換え

// 取得するフィールド
$fields = 'id,caption,media_type,timestamp,permalink,thumbnail_url,media_url';

// =============================================
// キャッシュ処理
// =============================================
$cache_file = __DIR__ . '/instagram.json';

// キャッシュが有効か確認 (24時間以内)
if (file_exists($cache_file) && time() - filemtime($cache_file) < 86400) {
	$posts = json_decode(file_get_contents($cache_file), true);
} else {
	// APIリクエスト
	$url = "https://graph.facebook.com/v19.0/{$instagram_user_id}/media?fields={$fields}&access_token={$access_token}";

	$response = file_get_contents($url);

	if ($response === false) {
		die('APIリクエストに失敗しました。');
	}

	$data = json_decode($response, true);

	// エラーチェック
	if (isset($data['error'])) {
		die('APIエラー: ' . $data['error']['message']);
	}

	$posts = $data['data'];

	// キャッシュ保存
	if (!is_dir(dirname($cache_file))) {
		mkdir(dirname($cache_file), 0755, true);
	}
	file_put_contents($cache_file, json_encode($posts));
}

// =============================================
// 結果の表示
// =============================================

echo "投稿数: " . count($posts) . "件\n\n";

foreach ($posts as $post) {
	echo "ID        : " . ($post['id']           ?? '') . "\n";
	echo "種類      : " . ($post['media_type']   ?? '') . "\n";
	echo "日時      : " . ($post['timestamp']    ?? '') . "\n";
	echo "キャプション: " . ($post['caption']    ?? '(なし)') . "\n";
	echo "URL       : " . ($post['permalink']    ?? '') . "\n";
	echo "画像URL   : " . ($post['media_url']    ?? '') . "\n";
}

キャッシュを行いつつ、アクセストークンを自動更新するコード

Instagram Graph APIのアクセストークンは、最長で3ヶ月のものしか取れないので、定期的にアクセストークンを手動で更新するか、自動で更新するための工夫が必要です。

アクセストークンを自動で更新するためには「アプリID」と「app secret」が必要で、「アプリの設定 > ベーシック」から控えましょう。

Meta for Developers アプリID app secret

以下が、アクセストークンを自動で更新し、1日に一回投稿のキャッシュも行うサンプルです。
このPHPファイルを置いたディレクトリに「instagram.json」と「token.json」が生成され、それぞれ1日に一回投稿のキャッシュと、30日に一回トークンの自動更新を行います。

// =============================================
// 設定
// =============================================
$access_token      = '初回のみ、ここにアクセストークンを入力'; //置き換え
$instagram_user_id = 'ここにInstagramアカウントIDを入力'; //置き換え
$app_id            = 'ここにアプリIDを入力';
$app_secret        = 'ここにapp secretを入力';

// 取得するフィールド
$fields = 'id,caption,media_type,timestamp,permalink,thumbnail_url,media_url';

// キャッシュファイルのパス
$cache_file = __DIR__ . '/instagram.json';
$token_file = __DIR__ . '/token.json';

// =============================================
// トークン自動更新処理
// =============================================

// トークンファイルが存在する場合は読み込む
if (file_exists($token_file)) {
	$token_data     = json_decode(file_get_contents($token_file), true);
	$access_token   = $token_data['access_token'];
	$token_saved_at = $token_data['saved_at'];
} else {
	$token_saved_at = 0;
}

// 30日以上経過していたらトークンを更新する
if (time() - $token_saved_at > 86400 * 30) {
	$refresh_url = "https://graph.facebook.com/v19.0/oauth/access_token?grant_type=fb_exchange_token&client_id={$app_id}&client_secret={$app_secret}&fb_exchange_token={$access_token}";

	$refresh_response = file_get_contents($refresh_url);

	if ($refresh_response !== false) {
		$refresh_data = json_decode($refresh_response, true);

		if (isset($refresh_data['access_token'])) {
			$access_token = $refresh_data['access_token'];

			// 新しいトークンを保存
			file_put_contents($token_file, json_encode([
				'access_token' => $access_token,
				'saved_at'     => time(),
			]));

			// トークンが更新されたので投稿キャッシュも再取得させる
			if (file_exists($cache_file)) {
				unlink($cache_file);
			}
		}
	}
}

// =============================================
// キャッシュ処理
// =============================================

// キャッシュが有効か確認 (24時間以内)
if (file_exists($cache_file) && time() - filemtime($cache_file) < 86400) {
	$posts = json_decode(file_get_contents($cache_file), true);
} else {
	// APIリクエスト
	$url = "https://graph.facebook.com/v19.0/{$instagram_user_id}/media?fields={$fields}&access_token={$access_token}";

	$response = file_get_contents($url);

	if ($response === false) {
		die('APIリクエストに失敗しました。');
	}

	$data = json_decode($response, true);

	// エラーチェック
	if (isset($data['error'])) {
		die('APIエラー: ' . $data['error']['message']);
	}

	$posts = $data['data'];

	// キャッシュ保存
	file_put_contents($cache_file, json_encode($posts));
}

// =============================================
// 結果の表示
// =============================================

echo "投稿数: " . count($posts) . "件\n\n";

foreach ($posts as $post) {
	echo "ID        : " . ($post['id']           ?? '') . "\n";
	echo "種類      : " . ($post['media_type']   ?? '') . "\n";
	echo "日時      : " . ($post['timestamp']    ?? '') . "\n";
	echo "キャプション: " . ($post['caption']    ?? '(なし)') . "\n";
	echo "URL       : " . ($post['permalink']    ?? '') . "\n";
	echo "画像URL   : " . ($post['media_url']    ?? '') . "\n";
}

クライアント(他人)の投稿を取得するコード

自分のInstagramアカウントとMetaアプリを受け皿にして、他人(クライアントなど)のInstagramの投稿を埋め込むことができます。

アクセストークンの許可は「instagram_basic」だけでなく「instagram_manage_insights」も必要になります。(先述)

また、他人の投稿を埋め込む際は、本人の了承を得るなど節度をもって行いましょう。

サンプルコードはこちら

// =============================================
// 設定
// =============================================
$access_token      = 'ここにアクセストークンを入力'; //置き換え
$instagram_user_id = 'ここにInstagramアカウントIDを入力'; //置き換え
$target_user       = 'ここに埋め込みたいアカウントのIDを入力'; //置き換え

// 取得するフィールド
$fields = 'business_discovery.username(' . $target_user . '){username,followers_count,media_count,media{id,caption,media_type,timestamp,permalink,thumbnail_url,media_url}}';

// =============================================
// APIリクエスト
// =============================================
$url = "https://graph.facebook.com/v19.0/{$instagram_user_id}?fields={$fields}&access_token={$access_token}";

$response = file_get_contents($url);

if ($response === false) {
	die('APIリクエストに失敗しました。');
}

$data = json_decode($response, true);

// エラーチェック
if (isset($data['error'])) {
	die('APIエラー: ' . $data['error']['message']);
}

// =============================================
// 結果の表示
// =============================================
$discovery = $data['business_discovery'];
$posts     = $discovery['media']['data'];

echo "アカウント名: " . ($discovery['username']        ?? '') . "\n";
echo "フォロワー数: " . ($discovery['followers_count'] ?? '') . "\n";
echo "投稿数      : " . ($discovery['media_count']     ?? '') . "件\n\n";

foreach ($posts as $post) {
	echo "ID          : " . ($post['id']          ?? '') . "\n";
	echo "種類        : " . ($post['media_type']  ?? '') . "\n";
	echo "日時        : " . ($post['timestamp']   ?? '') . "\n";
	echo "キャプション: " . ($post['caption']     ?? '(なし)') . "\n";
	echo "URL         : " . ($post['permalink']   ?? '') . "\n";
	echo "画像URL     : " . ($post['media_url']   ?? '') . "\n";
}

このコードは、キャッシュの仕組みやトークンを自動更新する仕組みは省略しているので、組み合わせてお使いください。

以上、2026年版 Instagram Graph APIとPHPで投稿を埋め込む手順とサンプルコードでした。

コメント

内容を確認の上、個人情報などは省いて掲載させていただきます。

お名前・メールアドレスも入力する

メールで返信がほしい場合に入力してください。

頂いた個人情報は開示しません。返信のためだけに利用いたします。

直接送信されます。確認の上、「送信」してください。

お役に立てましたら応援をお待ちしております!
頂いた応援は子育てに活用させていただきます。

筆者のマイベビーリスト (Amazon)

OFUSEで応援を送る

または以下のボタンからなにか買って応援
(リンク先の商品を買わなくても大丈夫です。)

Amazonでなにか買う

楽天市場でなにか買う

Yahoo!ショッピングでなにか買う

PR

Amazonのアソシエイトとして「けん」は適格販売により収入を得ています。

シェア

Twitterでシェア Facebookでシェア LINEでシェア はてなブックマークでシェア

筆者のマイベビーリスト (Amazon)