ちょっと話題の記事

Spotify Web APIの使い方

2017.12.19

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

事業開発部の酒匂です。
弊社ブログの下記記事を見て以来、私も何か書かねば!と思い、Spotifyについて書くことにいたしました。

オープンな音楽データベース「MusicBrainz」のマッシュアップサービスを作るための使い方まとめ

Spotifyとは

音楽のストリーミング配信サービスです。
https://www.spotify.com/jp/

同様のサービスにApple MusicやAmazon Music Unlimited‎などがありますね。

私は使いたいときに使える音楽視聴機だと思って利用しております。

Spotify for Developers

Spotifyは、Web API、AndroidやiOS向けのSDKなどを公開をしております。

https://beta.developer.spotify.com/documentation/

APIがあるとなると、とりあへず叩いてみたくなります。

Spotify Web APIの始め方

Spotify Web APIの概要

  • 各リソースへの操作は、以下のHTTPメソッドにて行います。
メソッド 操作
GET リソースの取得
POST リソースの作成
PUT リソースの変更または置き換え
DELETE リソースの削除
  • Spotify URIやSpotify IDなど、Spotify特有のパラメータ情報をリクエスト、レスポンス時に扱うことがあります。

  • レート制限に引っかかるとステータスコード429が返却される。これが返ってきた場合は、Retry-Afterヘッダーの値を確認し、そこに記載されている秒の間はAPIをコールすることができない。

  • レスポンスデータは、JSON Object形式で取得します。

  • タイムスタンプはUTC zero offset形式(YYYY-MM-DDTHH:MM:SSZ)

  • 一部のAPIではページネーションをサポート(offset、limitパラメータで指定)

  • 多くのAPIでは、クライアント側でレスポンスデータのキャッシュを行うためのヘッダー情報が付与される。

  • レスポンスステータスコードは、RFC 2616 と RFC 6585に則って2xx、3xx、4xx、5xxを返す。

  • レスポンスデータのエラー表現には、下記2種類のフォーマットを使用する。

    • Authentication Error Object
    • Regular Error Object

  • APIをコールするにはOAuthアクセストークンが必要。

アカウントのセットアップを行う

Web APIを使用するには、Spotifyのユーザーアカウント(Premium or Free)を作成する必要があります。
アカウントを持っていない場合は、下記から行います。
https://www.spotify.com/jp/

すでにアカウントを持っている場合は、ダッシュボードページに行ってログインを行い、サービス利用に許諾します。
https://beta.developer.spotify.com/dashboard/

クライアントアプリケーションの登録を行う

Spotify Web APIをコールするクライアントアプリケーションをダッシュボードページから登録します。
"CREATE AN APP"をクリックします。

下記の画面が表示されますので、該当する方を選択します。
今回は商用ではないので、"No"を選択します。

下記の画面が表示されますので、クライアントアプリケーション名、その説明を入力し、同意事項にチェックを付けて"CREATE"を選択します。

下記の画面が表示されれば、クライアントアプリケーションの登録は完了です。

画面上の"SHOW CLIENT SECRET"をクリックして、値を確認しておきます。(Web APIへアクセスするために必要)

クライアントアプリケーションがWeb APIへアクセスするためには許可が必要

クライアントアプリケーションが、Spotifyのデータや機能にアクセスするには、それを行う許可が与えられている必要があります。

https://beta.developer.spotify.com/documentation/general/guides/authorization-guide/より抜粋

許可が誰に、どのように、与えられるかと言いますと、下記の2種類のパターンがあります。

  • App Authorization
    • システム(Spotify)が、クライアントアプリケーションに、Spotify Platform (APIs, SDKs and Widgets)へアクセスすることを許可します。

  • User Authorization
    • エンドユーザー(Spotifyのエンドユーザー)が、クライアントアプリケーションに、エンドユーザーが所有するデータへアクセスすることを許可します。

というわけで、繰り返しになりますが、クライアントアプリケーションがSpotify Platformへの許可されたリクエストを作成するには、データにアクセスする権限が与えられている必要があります。RFC-6749によると、この権限を得るプロセスには下記の関係者が関与します。

関係者 説明
Server Spotifyのサーバー
Client Spotify Web APIをコールするクライアントアプリケーションのこと
Resource Spotifyのエンドユーザーのデータ

また、Web APIをコールするには、スコープを指定する必要があります。
スコープを使用すると、ユーザーがクライアントアプリケーションを使用して特定のAPIエンドポイントにアクセスできるようになります。 Web APIコールで渡すスコープのセットによって、ユーザーが付与する必要のあるアクセス許可が決まります。

クライアントアプリケーションが許可を得るための3つの方法

Spotifyでは下記の3つの方法が用意されております。

  • Refreshable user authorization: Authorization Code
    • このフローでは、エンドユーザーはクライアントアプリケーションがリソースへアクセスすることを1度だけ許可します。そのため長期間稼働させるアプリケーションに適しています。 アプリケーションにはリフレッシュ可能なアクセストークンを提供されます。ちなみにトークン交換には秘密鍵の送信が含まれるため、ブラウザやモバイルアプリなどのクライアントからではなく、バックエンドサービスなどの安全な場所でこれを実行します。

  • Temporary user authorization: Implicit Grant
    • このフローは、JavaScriptを使用するため、リソース所有者のブラウザで実行されるクライアントアプリケーション向けです。サーバー側のコードを使用する必要はありません。リクエストのレート制限は改善されていますが、リフレッシュトークンは提供されていません。このフローはRFC-6749で定義されています。

  • Refreshable app authorization: Client Credentials Flow
    • このフローは、サーバー間認証で使用されます。エンドユーザー情報にアクセスしないエンドポイントのみにアクセスが可能です。

それぞれ、できること、できないことがあります。

FLOW ACCESS USER RESOURCES REQUIRES SECRET KEY (SERVER-SIDE) ACCESS TOKEN REFRESH IMPROVED RATE LIMITS
Authorization Code Yes Yes Yes Yes
Client Credentials No Yes No Yes
Implicit Grant Yes No No Yes

今回は、Client CredentialsのパターンでWeb APIをコールしてみます。

Client Credentials Flowでアクセストークンを取得

まずは、Client IDとClient SecretをBase64でエンコードした値を取得します。

Macならばターミナル上で下記を実行します。

echo -n {client_id}:{Client_Secret} | base64

出力された値を「ZjM4ZjAw...WY0MzE=」とした場合、以下のようにリクエストを実行します。

curl -X "POST" -H "Authorization: Basic ZjM4ZjAw...WY0MzE=" \
-d grant_type=client_credentials https://accounts.spotify.com/api/token

以下のような結果が返ってくるので、アクセストークンを控えておきます。

{
  "access_token": "NgCXRKc...MzYjw",
  "token_type": "Bearer",
  "expires_in": 3600,
  "scope": ""
}

試しに以下のようにAPIをコールしてみると・・・

curl -H "Authorization: Bearer NgCXRKc...MzYjw"  \
GET https://api.spotify.com/v1/artists/1O8CSXsPwEqxcoBE360PPO

見事に結果が返ってきました!

{
  "external_urls": {
    "spotify": "https://open.spotify.com/artist/1O8CSXsPwEqxcoBE360PPO"
  },
  "followers": {
    "href": null,
    "total": 179434
  },
  "genres": [
    "finnish metal",
    "gothic metal",
    "hard rock",
    "melodic death metal",
    "metal",
    "neo classical metal",
    "power metal",
    "progressive metal",
    "speed metal"
  ],
  "href": "https://api.spotify.com/v1/artists/1O8CSXsPwEqxcoBE360PPO",
  "id": "1O8CSXsPwEqxcoBE360PPO",
  "images": [
    {
      "height": 768,
      "url": "https://i.scdn.co/image/7cb6d4e48dac26e74eba682212b3b3ecd4836d23",
      "width": 512
    },
    {
      "height": 300,
      "url": "https://i.scdn.co/image/e63f29b1a8cde872666bb0c3b702280a3bd45ff8",
      "width": 200
    },
    {
      "height": 96,
      "url": "https://i.scdn.co/image/d4a5047c0c96ab65ea3fbe539cd19779d753bcf6",
      "width": 64
    }
  ],
  "name": "Stratovarius",
  "popularity": 59,
  "type": "artist",
  "uri": "spotify:artist:1O8CSXsPwEqxcoBE360PPO"
}

おわりに

私が担当しておりますprismatixもそうですが、Web APIで様々なシステムやサービスと組み合わせることができるのは面白いことです。 今後も面白そうなサービスを見つけていきたいと思います。

参考情報