Spotify APIを使ってアプリケーションを作ろう

# はじめに
サブスクリプションモデル系はデータが豊富になりやすい（使い放題だから使う）と思っています。
私の場合は最近、音楽をものすごく聞くため、Spotify APIを使用すると面白いかなと思いました。

なので、今回はSpotify APIを使用して何かアプリケーションを作ってみます。

# アプリケーションを登録しよう
https://developer.spotify.com/dashboard/

ここから登録可能です。
すでにアカウントがあればそれでログインすればすぐ使えるようになります。

登録中に商用利用するかというのも聞かれますので、正確に答えましょう。
アプリケーションを作成したら、`EDIT SETTINGS`からOAuthの情報を入力可能となります。
Webだったりスマホだったり色々と選択肢があります。
自分に合ったものを登録しましょう。

今回は後述しますが、厳密にWebサービスから叩くわけではないため、適当なURLを設定しています。

# 認証周りを作る
https://developer.spotify.com/documentation/general/guides/authorization-guide/

詳しくは上記に記載があります。
今回はWebアプリケーションとして作成しますが、実態としては`Google Cloud Functions`から実行するため、Refresh Tokenが必要となります。
Spotifyの仕様上、Access Tokenは1時間、Refresh Tokenは何かしら無効化するまで有効であり続けるとなっています。
なので、今回はアプリケーション作成前にRefresh Tokenを手で作って、コード上でAccess Tokenへ変換 -> SpotifyのAPIを叩くという手順を取ります。

## 1. code取得
まずはcodeの取得を行うためのURLを生成します。
詳細は省きますが、最終的に以下のようなURLになります。
client_idとredirect_uriは環境に合わせてください。

また、Spotify APIはscopeがとても細かく区切られています。
下記に記載されていますので、必要なscopeを指定するようにする必要があります。
https://developer.spotify.com/documentation/general/guides/scopes/

```
https://accounts.spotify.com/authorize?client_id=${CLIENT_ID}&response_type=code&redirect_uri=${REDIRECT_URL}&scope=user-read-private%20user-read-email&state=34fFs29kd09
```

出来上がったら適当なブラウザに貼り付けてEnter押すと設定したredirect_uriに帰ってきます。
ここでエラーになっていても特に問題はありません。
URL自体は変わっているため、そのURLからcodeの部分だけを次で使用します。

## 2. Refresh Tokenの取得
次はPOSTを投げないといけません。
なので、curlで投げます。
具体的には下記コマンドを取れたcodeと環境に合わせたclient_id、client_secretを設定して投げます。
問題なければトークンが返ってきますので、Refresh Tokenを保持しておきます。

```
curl --data "code=${CODE}" --data "client_id=${CLIENT_ID}" --data "client_secret=${CLIENT_SECRET}" --data "redirect_uri=http://localhost/callback" --data "grant_type=authorization_code" https://accounts.spotify.com/api/token
```

## from Refresh Token to Access Token
Refresh TokenからAccess Tokenへの変換はAPI叩けば一発です。
その際はHeaderに`Authorization: Basic <base64 encoded client_id:client_secret>`を含めないといけなく、それを作るのが面倒くさいと思ったぐらいであとは簡単です。

一応、自分が作ったpythonコードを貼っておきます。

``` python
from dotenv import load_dotenv

import os
import requests
import base64
import json

load_dotenv(verbose=True)

client_id = os.environ.get("SPOTIFY_CLIENT_ID", default="")
client_secret = os.environ.get("SPOTIFY_CLIENT_SECRET", default="")
token = base64.b64encode((client_id + ":" + client_secret).encode("utf-8")).decode(
    "utf-8"
)

headers = {"Authorization": "Basic " + token}
data = {
    "refresh_token": os.environ.get("REFRESH_TOKEN"),
    "grant_type": "refresh_token",
}
response = requests.post(
    "https://accounts.spotify.com/api/token", data=data, headers=headers
)  # noqa: E501
print(json.loads(response.text)["access_token"])
```

# APIコールする部分を作成する
APIコールは取れたAccess TokenをBearerに設定して投げるだけです。
下に自分が作ろうとしているランキングデータ生成についてのサンプルコードを載せます。

``` python
    header = {"Authorization": "Bearer " + access_token}
    data = {
        "limit": 50,
        "time_range": "short_term",
    }
    response = requests.get(
        "https://api.spotify.com/v1/me/top/tracks", params=data, headers=header
    )
```

# 終わりに
ということでこれで無事Spotify API使ってアプリケーションが作れるようになりました。
Spotifyはどこに何があるかが分かりにくい反面、API仕様については細かく書かれています。
出来ることも意外と多いので、API作成の初歩としては中々良いサンプルとして使えるというのが感想です。

ちなみに今作ってるのはTwitterに月に1回、前月の聞いてたランキングを投稿するというものです。
まだ投稿部分が出来ていないため、これから作ろうと思います。

他のOAuthのAPIでも手で作る手順は同じなので、応用効きます。
是非色んなAPIを叩いてみて色んなアプリケーションを作ってみてください。
ただし、公開するとAPI Limitをすぐ超えるので、その場合はきちんと認証部分をUIで出来るように作り込みましょう。