【PHP】Spotify API使うまでの流れ

## 概要
Spotify APIを使用して色々な楽曲のデータなど取得するための手順をまとめました。

API叩いてデータを取得するところまでが今回のゴールになります。

## 対象者
- PHP使っている方
- Dockerを使用している方
- APIからデータ取得してみたいという方

## 手順

### 準備
#### 準備1. アカウントIDとキーを確認する:pick:
Spotify APIを使用する際にはアカウントを登録する必要があります。
（フリープランでもOK！）
登録後、[開発者用ダッシュボード](https://developer.spotify.com/)にアクセスしてIDとキーを取得します。
※このIDとキーが肝です。
![スクリーンショット 2024-09-23 135758.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3877267/2d70cfb7-f271-65f8-43b3-a95d8560b6b3.png)
App nameとか色々と入力する項目があるかと思いますが、一旦適当に入力しておくので大丈夫です。

#### 準備2. PHPの準備 :desktop:
ここからはDockerでPHPの準備をしていきます。
DockerでPHPを使うまでの手順は省略します。
簡単にAPIからデータを取得できるよう、 [spotify-web-api-php](https://github.com/jwilsson/spotify-web-api-php) を使用していきますので、その前にComposerを準備しておいてください。

Composerが準備できましたらspotify-web-api-phpを入れていきましょう。
service名の部分はご自身の環境に合わせて直してください。
```
docker-compose exec (service名) composer require jwilsson/spotify-web-api-php
```

コマンドが通ってvendorフォルダができていれば準備OKです。
さっそくデータを取得していきましょう！


### データ取得
#### 1.アクセストークンの準備
適当にindex.phpなどのファイルを作成し、準備段階で確認した固有のIDとclient secretをセットしていきます。
```
<?
require_once('./vendor/autoload');
$session = new SpotifyWebAPI\Session(
    '準備1で確認したID',
    '準備1で確認したclient secret'
);

$api = new SpotifyWebAPI\SpotifyWebAPI();
$session->requestCredentialsToken();
$accessToken = $session->getAccessToken();
$api->setAccessToken($accessToken);
```



#### 2. 各種データの取得
```
// アーティストを検索
$result = $api->search('weezer', 'artist');
echo json_encode($result);
```

こんな感じでデータが返ってきます。長いので省略していますが、アーティストの画像やジャンルなんかが取得できています。
詳細についはSpotify公式やspotify-web-api-phpのドキュメントなんかを読むと良いです。
```
{
- artists:
    {
    - href: "[https://api.spotify.com/v1/search?query=weezer&type=artist&offset=0&limit=20](https://api.spotify.com/v1/search?query=weezer&type=artist&offset=0&limit=20)",   
    - items:
        [
        - {   
            - external_urls:     
                {
                - spotify: "[https://open.spotify.com/artist/3jOstUTkEu2JkjvRdBA5Gu](https://open.spotify.com/artist/3jOstUTkEu2JkjvRdBA5Gu)"   
                },
            - followers:
                {
                - href: null,   
                - total: 3790877
                },
            - genres:
                [
                - "alternative rock",   
                - "modern power pop",
                - "modern rock",
                - "permanent wave",
                - "rock"
                ],
            - href: "[https://api.spotify.com/v1/artists/3jOstUTkEu2JkjvRdBA5Gu](https://api.spotify.com/v1/artists/3jOstUTkEu2JkjvRdBA5Gu)",
            - id: "3jOstUTkEu2JkjvRdBA5Gu",
            - images:
                [
                - {   
                    - height: 640,     
                    - url: "[https://i.scdn.co/image/ab6761610000e5eb3cd35451daa1b690cfbbb2d4](https://i.scdn.co/image/ab6761610000e5eb3cd35451daa1b690cfbbb2d4)",
                    - width: 640
                    },
                - {
                    - height: 320,     
                    - url: "[https://i.scdn.co/image/ab676161000051743cd35451daa1b690cfbbb2d4](https://i.scdn.co/image/ab676161000051743cd35451daa1b690cfbbb2d4)",
                    - width: 320
                    },
                - {
                    - height: 160,     
                    - url: "[https://i.scdn.co/image/ab6761610000f1783cd35451daa1b690cfbbb2d4](https://i.scdn.co/image/ab6761610000f1783cd35451daa1b690cfbbb2d4)",
                    - width: 160
                    }
                ],
            - name: "Weezer",

(このあとにも色々データが続きます。今回は省略。)
```

続けてアルバム情報を取得してみましょう。先程取得したアーティスト情報の中からアーティストIDを使用して、そのアーティストに紐づくアルバム情報を取得してみようと思います。
```
// アルバム
$result = $api->getArtistAlbums('3jOstUTkEu2JkjvRdBA5Gu', ['include_groups' => 'album', 'limit' => 5]);
echo json_encode($result);
```

index.phpを見てみましょう。

```
{
- href: "[https://api.spotify.com/v1/artists/3jOstUTkEu2JkjvRdBA5Gu/albums?offset=0&limit=5&include_groups=album](https://api.spotify.com/v1/artists/3jOstUTkEu2JkjvRdBA5Gu/albums?offset=0&limit=5&include_groups=album)",   
- limit: 5,
- next: "[https://api.spotify.com/v1/artists/3jOstUTkEu2JkjvRdBA5Gu/albums?offset=5&limit=5&include_groups=album](https://api.spotify.com/v1/artists/3jOstUTkEu2JkjvRdBA5Gu/albums?offset=5&limit=5&include_groups=album)",
- offset: 0,
- previous: null,
- total: 406,
- items:
    [
    - {   
        - album_type: "album",     
        - total_tracks: 28,
        - available_markets:
            [],
        - external_urls:
            {
            - spotify: "[https://open.spotify.com/album/2WJsNhU7H0rZQzWdMVQ4NV](https://open.spotify.com/album/2WJsNhU7H0rZQzWdMVQ4NV)"   
            },
        - href: "[https://api.spotify.com/v1/albums/2WJsNhU7H0rZQzWdMVQ4NV](https://api.spotify.com/v1/albums/2WJsNhU7H0rZQzWdMVQ4NV)",
        - id: "2WJsNhU7H0rZQzWdMVQ4NV",
        - images:
            [],
        - name: "SZNZ: Winter",
        - release_date: "2022-12-21",
        - release_date_precision: "day",
        - type: "album",
        - uri: "spotify:album:2WJsNhU7H0rZQzWdMVQ4NV",
        - artists:
            [],
        - album_group: "album"
        },
(省略)
```
取得できましたね！（取得データは長いので今回も省略します。）

今回はこれで以上です。

***

色々とデータが取得できて面白いですね。
[公式ドキュメント](https://developer.spotify.com/documentation/web-api)を読んでみるとどんなデータが取得できているのかわかりますし、[ライブラリのドキュメント](https://github.com/jwilsson/spotify-web-api-php/tree/main/docs)からもどんなデータが取得できるのか確認できます。
音楽データの分析？なんかもされている方もいるみたいです。
一度目を通して見られてはいかがでしょうか。