最近Spotifyを契約し始めたのだけど、Spotifyには曲やアルバム、プレイリスト、アーティストの情報を取得したりできるAPIがあるとのことなので試してみた。
Spotipyというラッパーライブラリがあるようだけど、今回はそれを使わずにrequestsを使ってAPIを使ってみる。
アプリの登録
APIを使うにはFreeかPremiumのユーザーである必要がある。登録はhttps://www.spotify.com/jp/から。
ユーザー登録したらダッシュボードページにログインして、アプリ登録をする。
作成したアプリをクリックする。
Client ID
とSHOW 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(必須のものだけ抜粋)
参考:
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以降の作品が表示されて、タイトルも日本語表記になった。日本のアーティストを検索するならmarket
にJP
を指定するのがよさそう。海外勢は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]:~をワイルドカードで検索)やプレイリストの検索を調べてみたい。