明日から、身につける。
明日から、身につける。
2015.02.18

Instagram APIを取得してWebサイトと連携し、投稿写真を自動に掲載する方法

しょごたん

下準備

ということで、APIを使うには下準備が必要です。

1. Instagramアカウントを取得する

instgram

とにもかくにも、まずはアカウントを取得しましょう。

2. Instagram Developerに登録する

develop登録に加えて、アプリ登録をします。TwitterやFacebookと同じですね。

Instagram Developer

以下の手順で登録を行います。

  1. ヘッダー右上にログインボタンがあるので、ログインする
  2. 「Register Your Application」をクリック
  3. 開発者プロフィール登録をする
    →どのような使用目的で使うのかなど簡単なプロフィールを登録する
  4. 「Register a New Client」ボタンをクリックする
  5. 下記必要情報を登録し、「register」をクリックする
  • Application Name:アプリケーションの名前(特にシステムに関与はされないので適当に)
  • Description:アプリケーションの概要(特にシステムに関与はされないので適当に)
  • Website:連携先のURL
  • OAuth redirect_url:認証後にリダイレクトする場合、遷移させるURL
  • Disable implicit OAuth:チェックするとクライアント側だけで認証ができなくなります
  • Enforce signed header:チェックするとAPIリクエストに独自の証明書が必要になります
  • captcha:表示された文字を入力する

するとアプリ登録が完了になり、固有のCLLENT IDとCLLENT SECRETが発行されます。

3. アクセストークンを取得する

APIを利用するにあたり、別にアクセストークンが必要になります。
下記URLに取得したCLLENT IDとRedirectURLを入力してブラウザでアクセスしてください。

https://instagram.com/oauth/authorize/?client_id=【CLIENT-ID】&redirect_uri=【REDIRECT-URL】&response_type=token

認証画面が出てきますが、「Authorize」をクリックします。
するとredirect_urlで設定したページが表示され、パラメータにアクセストークンが付与されているのでこれを保持する。

【REDIRECT-URI】#access_token=xxxxxxxxxxxxxxx.xxxxxxxxxxxxxxxxxxxx.xxxxxxxxxxxx

ユーザアカウントから固有ユーザIDを取得する

APIで特定ユーザの画像を取得するには、ユーザ固有のIDを確認する必要があります。
この固有のIDは、ユーザアカウントではありません。なので、APIを使いユーザアカウントからユーザ情報を取得し、そこに格納されている固有IDを取得する必要があるんです。

// ユーザネームから固有のuser_IDを取得する。
define("INSTAGRAM_ACCESS_TOKEN", "xxxxxxxxxxxxxxx.xxxxxxxxxxxxxxxxxxxx.xxxxxxxxxxxx");
// ユーザアカウント名
$user_account = 'user_acount_mei';

// ユーザアカウント名からユーザデータを取得する。
$user_api_url = 'https://api.instagram.com/v1/users/search?q=' . $user_account . '&access_token=' . INSTAGRAM_ACCESS_TOKEN;
$user_data = json_decode(@file_get_contents($user_api_url));

$user_data->data[0]->id; // ユーザ固有ID

成功するとjsonデータが帰ってきます。
そこにIDとして数字が帰ってきたのが、固有のユーザIDになります。これを使うことで、特定ユーザの情報を取得することができます。

ユーザ情報を取得する上での注意点

上記方法でユーザの詳細情報を取得するわけですが、API側の仕様で検索した際、似たようなユーザアカウントの情報も取得してきてしまいます。
例を挙げると、「twintail」というユーザアカウントで取得しようとすると1つではなく、複数取得されちゃいます。
実はlike検索だったんですねぇ。。。(゚Д゚)

そのため、上記コードのまま使用すると一番頭に想定外のものが取得されてきたときに違うアカウントの画像がとれちゃう可能性があるので、ループさせて該当のアカウントを見つけた上で、そのIDを取得するようにしましょう。

// ユーザネームから固有のuser_IDを取得する。
define("INSTAGRAM_ACCESS_TOKEN", "xxxxxxxxxxxxxxx.xxxxxxxxxxxxxxxxxxxx.xxxxxxxxxxxx");
// ユーザアカウント名
$user_account = 'user_acount_mei';

// ユーザアカウント名からユーザデータを取得する。
$user_api_url = 'https://api.instagram.com/v1/users/search?q=' . $user_account . '&access_token=' . INSTAGRAM_ACCESS_TOKEN;
$user_data = json_decode(@file_get_contents($user_api_url));

// 取得したデータの中から正しいデータを選出
foreach ($user_data->data as $user_data) {
	if ($user_account == $user_data->username) {
		$user_id = $user_data->id;
	}
}