最近Spotifyを契約し始めたのだけど、Spotifyには曲やアルバム、プレイリスト、アーティストの情報を取得したりできるAPIがあるとのことなので試してみた。
Spotipyというラッパーライブラリがあるようだけど、今回はそれを使わずにrequestsを使ってAPIを使ってみる。
アプリの登録
APIを使うにはFreeかPremiumのユーザーである必要がある。登録はhttps://www.spotify.com/jp/から。
ユーザー登録したらダッシュボードページにログインして、アプリ登録をする。
作成したアプリをクリックする。
Client ID
とSHOW CLIENT SECRET
を押して表示されるClient Secret
を控えておく。
認証フロー
- 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で認証をするときにアクセストークンを使うので辞書形式でレスポンスを取得している。
参考:
http://docs.python-requests.org/en/latest/user/authentication/#basic-authentication
https://stackoverflow.com/questions/30557409/python-spotify-api-post-call
アルバムを検索する
Endpoints:
GET https://api.spotify.com/v1/search
Header Fields: Authorization
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以降の作品が表示されて、タイトルも日本語表記になった。日本のアーティストを検索するなら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]:~をワイルドカードで検索)やプレイリストの検索を調べてみたい。