【PHP/Laravel】インスタの投稿一覧をユーザー名から取得する

えび

Laravelでユーザー名を指定してインスタグラムの投稿を表示した時のメモ
素のPHPでも使用できる(config関連は飛ばしてそのままInstagramControllerのソースを実装すればOK)

前提条件

下記を取得済みであること

  • ビジネスアカウントID
  • アクセストークン

configにビジネスアカウントIDとアクセストークンを設定

  • .env
INSTAGRAM_BUSINESS_ID={ビジネスアカウントID}
INSTAGRAM_ACCESS_TOKEN={アクセストークン}
  • config/services.php
// 配列の最後に追加 
'instagram' => [
  'business_id' => env('INSTAGRAM_BUSINESS_ID'),
  'access_token' => env('INSTAGRAM_ACCESS_TOKEN'),
],

Controllerで取得

  • InstagramController
public function index()
{
  // インスタ画像取得
  $instagramItems = [];
  try {
    $instagram_business_id = config('services.instagram.business_id');
    $instagram_access_token = config('services.instagram.access_token');
    $query = "business_discovery.username({$userName}){id,followers_count,media_count,media{id,caption,media_url,timestamp,permalink}}";
    $target_url = "https://graph.facebook.com/v12.0/{$instagram_business_id}?fields={$query}&access_token={$instagram_access_token}";
    $json = file_get_contents($target_url);
    $json = mb_convert_encoding($json, 'UTF8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS-WIN');
    $obj = json_decode($json, true);

    foreach ($obj['business_discovery']['media']['data'] as $item) {
      $instagramItems[] = !empty($item['thumbnail_url']) ? [
                  'img' => $item['thumbnail_url'],
                  'caption' => $item['caption'],
                  'link' => $item['permalink'],
                ] : [
                  'img' => $item['media_url'],
                  'caption' => $item['caption'],
                  'link' => $item['permalink'],
                ];
            }
    } catch (\Exception $exception) {
            // ビジネスアカウント・クリエイターアカウントの場合は取得できない
            Log::error($exception->getMessage());
    }

    return view('instagram.index', compact('instagramItems'));
}

viewで表示

  • instagram/index.blade.php
<div class="instagram-list">
  @foreach ($instagramItems as $instagramItem)
    <a href="{{ $instagramItem['link'] }}" target="_blank" class="instagram-list__item">
      <img src="{{ $instagramItem['img'] }}" alt="{{ $instagramItem['caption'] }}" />
    </a>
  @endforeach
</div>