蛇ノ目の記

技術のことも。そうでないことも。

SpotifyのAPIを使ってみた

最近Spotifyを契約し始めたのだけど、Spotifyには曲やアルバム、プレイリスト、アーティストの情報を取得したりできるAPIがあるとのことなので試してみた。

Spotipyというラッパーライブラリがあるようだけど、今回はそれを使わずにrequestsを使ってAPIを使ってみる。

アプリの登録

APIを使うにはFreeかPremiumのユーザーである必要がある。登録はhttps://www.spotify.com/jp/から。

ユーザー登録したらダッシュボードページにログインして、アプリ登録をする。

f:id:Nao_Y:20190117234242p:plain

作成したアプリをクリックする。

f:id:Nao_Y:20190117234313p:plain

Client IDSHOW CLIENT SECRETを押して表示されるClient Secretを控えておく。

認証フロー

Spotify APIには3つの認証フローがある。

  • Refreshable user authorization: Authorization Code Flow

長期間稼働するアプリ向けの認証。エンドユーザーは一度だけアプリがリソースにアクセスすることを許可する。アプリにはリフレッシュ可能なアクセストークンが提供される。バックエンドなど安全な場所から実行する。

  • Temporary user authorization: Implicit Grant

JavaScriptを使用するため、リソース所有者のブラウザ上で動作するアプリ向けの認証。

  • Refreshable app authorization: Client Credentials Flow

サーバー間認証で使用される。エンドユーザーのリソースにアクセスしないエンドポイントのみ使用可能。

参考:

アクセストークンの取得

今回はClient Credentials Flowを使う。この認証方法ではClient IDとSecret Keyを使ってAccess Tokenを取得する。

  • Endpoints: POST https://accounts.spotify.com/api/token

  • Request Body Parameter: grant_type(client_credentialsを設定する)

  • Header Parameter: Basic <base64 encoded client_id:client_secret>

import requests

CLIENT_ID = 'YOUR CLIENT ID'

CLIENT_SECRET = 'YOUR CLIENT SECRET'

GRANT_TYPE = 'client_credentials'

TOKEN_URL = 'https://accounts.spotify.com/api/token'

body_params = {'grant_type': GRANT_TYPE}

auth = requests.post(TOKEN_URL, data=body_params, auth=(CLIENT_ID, CLIENT_SECRET)).json()

requestsでHTTP Basic auth(Basic認証)のあるURLにアクセスするときはキーワード引数auth(User, Password)とする。

この後、他のAPIで認証をするときにアクセストークンを使うので辞書形式でレスポンスを取得している。

参考:

アルバムを検索する

  • Endpoints: GET https://api.spotify.com/v1/search

  • Header Fields: Authorization

    • Value: 有効なアクセストークン。Bearer {{access token}}の形式。
  • Query Parameter(必須のものだけ抜粋)

    • q : 検索クエリ

    • type: 検索タイプ。有効な値はalbum, artist, playlist, trackでリストで指定可能

参考:

sora tob sakanaのアルバム・シングルを検索してみる。

header_params = {'Authorization': 'Bearer {}'.format(auth['access_token'])}

query_params = {'q': 'sora tob sakana', 'type': ['album']}

ENDPOINT = 'https://api.spotify.com/v1/search'

res = requests.get(ENDPOINT, headers=header_params, params=query_params)

for each in res.json()['albums']['items']:
    artist = each['artists'][0]
    url = each['external_urls']['spotify']
    print('{}: {} {} ({})'.format(artist['name'], each['name'], each['release_date'], url))
sora tob sakana: sora tob sakana 2016-07-26 (https://open.spotify.com/album/3cJxQS1oi8u2oBu9uhVyEk)
sora tob sakana: cocoon ep 2017-04-11 (https://open.spotify.com/album/467R6azC01pl67nSrLS55x)
sora tob sakana: mahou no kotoba 2016-02-16 (https://open.spotify.com/album/6x0xVz6hdHerGMf2yaMqLj)
sora tob sakana: yozora wo zenbu 2015-10-27 (https://open.spotify.com/album/2FezsFEuQFferFLy4syK4T)

どうしたことか。2017-04-11以降の作品が取得されない。よく見るとタイトルがアルファベット表記になっている。日本国内の設定になっていないっぽい。marketパラメータを指定してみる。このパラメータはISO 3166-1 alpha-2 country codeで表記する。日本はJP

header_params = {'Authorization': 'Bearer {}'.format(auth['access_token'])}

query_params = {'q': 'sora tob sakana', 'type': ['album']}

ENDPOINT = 'https://api.spotify.com/v1/search'

res = requests.get(ENDPOINT, headers=header_params, params=query_params)

for each in res.json()['albums']['items']:
    artist = each['artists'][0]
    url = each['external_urls']['spotify']
    print('{}: {} {} ({})'.format(artist['name'], each['name'], each['release_date'], url))

2017-04-11以降の作品が表示されて、タイトルも日本語表記になった。日本のアーティストを検索するならmarketJPを指定するのがよさそう。海外勢はalight epとかNew Stranger聴けないのかー。

sora tob sakana: sora tob sakana 2016-07-26 (https://open.spotify.com/album/6wy5MYR1ThaC7IuQu3VHHG)
sora tob sakana: New Stranger 2018-07-25 (https://open.spotify.com/album/1ATJgjPZ7Qz0LAUZtMW2Sp)
sora tob sakana: alight ep 2018-05-16 (https://open.spotify.com/album/36w9htd6tgXmNs0iPWte2P)
sora tob sakana: cocoon ep 2017-04-11 (https://open.spotify.com/album/3nN8No2a5ZhzK2xw9RIYQp)
sora tob sakana: アルファルド 2018-11-23 (https://open.spotify.com/album/3nA6Sd5gDIY8xHiVQQ3kvE)
sora tob sakana: 魔法の言葉 2016-02-16 (https://open.spotify.com/album/0UejaOY3nZq4h3fZ2be8lA)
sora tob sakana: 夜空を全部 2015-10-27 (https://open.spotify.com/album/03JuPAwApUfvx61cHvUmOJ)

APIを使ってアルバムを検索することができたので、この辺りで一旦区切りをつけておく。

今後はGET https://api.spotify.com/v1/searchにおけるワイルドカードの使い方(例えば、SawanoHiroyuki[nZk]:~をワイルドカードで検索)やプレイリストの検索を調べてみたい。