hello-world
webエンジニアのメモ。とりあえずやってみる。

[php]Instagram APIを使って特定タグの画像とリンクをjsonに保存する

公開日時

久しぶりにphpを書きました。

Instagram API Console で色々試しながら、特定タグに紐づくデータを取得して、画像とリンクをjsonに保存するスクリプトを作ってみました。

API Console便利です。

# generate_api.php

<?php
class InstagramApiBatch
{
  const TAG = 'タグ名';  # 取得したいタグ名
  const ACCESS_TOKEN = 'YOUR_ACCESS_TOKEN';  # アクセストークン
  const MAX_PAGR = 10;  # 最大取得ページ数
  const API_FILE_PATH = './';  # jsonの保存先
  private $base_url;
  private $exclude_link_list;

  function __construct() {
    # 33件が一度に取得できる最大値のようなのでcount=33
    $this->base_url = 'https://api.instagram.com/v1/tags/'. self::TAG . '/media/recent?access_token=' . self::ACCESS_TOKEN . '&count=33';
    # 除外したい写真のURLを配列内に記述 : 'http://instagram.com/p/{一意なキー}/'
    $this->exclude_link_list = array();
  }

  public function run() {
    $this->get_tags($this->base_url, 1);
  }

  private function get_tags($next_url, $page) {
    $obj = json_decode(file_get_contents($next_url));

    $list = array();
    foreach($obj->data as $data) {
      if (in_array($data->link, $this->exclude_link_list)) {
        continue;
      }
      array_push($list, array(
        'image_url' => $data->images->low_resolution->url,
        'link' => $data->link,
      ));
    }

    $this->write_api($list, $page);

    if ($page >= self::MAX_PAGE) {
      return;
    }

    if (isset($obj->pagination->next_url)) {
      $this->get_tags($obj->pagination->next_url, $page + 1);
    }
  }

  private function write_api($data, $no) {
    $file = self::API_FILE_PATH . "$no.json";
    $fp = fopen($file, 'w');
    fwrite($fp, json_encode($data));
    fclose($fp);
  }
}

$instagram = new InstagramApiBatch();
$instagram->run();

アクセストークンと取得したいタグを指定した後

php generate_api.php

を実行すると、1.json ~ 10.jsonが生成されます。

認証済みアプリのAPI制限は 5000req/hour(1トークンあたり)なので制限に引っかからない範囲でcronで定期取得するようにしておけばよさそうです。

あとはjsからajaxでjsonを呼び出せばInstagramの写真取得機能が作れます。

参考