【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'),
],

これで config('services.instagram.business_id') / config('services.instagram.access_token')
といった感じで値を取得できるようになった

Controllerで取得

  • InstagramController
public function index()
{
  // インスタ投稿格納用
  $instagramItems = [];
  // インスタAPIを使用するためのIDとトークンを設定
  $instagramBusinessId = config('services.instagram.business_id');
  $instagramAccessToken = config('services.instagram.access_token');
  // 取得条件や項目などを指定
  $userName = '取得したいインスタユーザー名を入れる';
  $query = "business_discovery.username({$userName}){id,followers_count,media_count,media{id,caption,media_url,timestamp,permalink}}";
  
  try {
    // インスタ投稿を取得する
    $target_url = "https://graph.facebook.com/v12.0/{$instagramBusinessId}?fields={$query}&access_token={$instagramAccessToken}";  
    $json = file_get_contents($target_url);
    $json = mb_convert_encoding($json, 'UTF8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS-WIN');
    $result = json_decode($json, true);

    foreach ($result['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>

\ 案件のご依頼・ご相談はこちらから /