PHPでSpotify APIを使う

# 目次
 - はじめに
 - GitHubからライブラリを落とす
 - Spotifyのダッシュボードからアプリケーションを作成する
 - APIに接続する
 - 関数を使ってみる
 - 補足
 - お世話になったサイト

# はじめに
脱プログラミング初心者を目指すがてら、PHPでSpotify APIを使ったWEBアプリを作りました。いろいろ調べながら大変な思いをして作ったので、せっかくだから爪痕を残そうと思って書いてます。自分のようなプログラミング初学者の助けになればと思います。
APIってなんのことだかよくわからないという方、プログラミング始めたての方でもわかるように書いたつもりです。

# GitHubからライブラリを落とす
こちらのライブラリを使ってます。
> [spotify-web-api-php](https://github.com/jwilsson/spotify-web-api-php)

このライブラリの[README](https://github.com/jwilsson/spotify-web-api-php/blob/master/README.md)を読んでちゃんと理解できる人はこの記事を読まなくていいと思います。自分、そこまで詳しく書けるほどの逸材ではないので。

このライブラリはcomposerというツールの使用が推奨されています。composerはファイル間の依存管理を楽にしてくれるものらしいです。よくわからないまま使ってます。composerのインストール後、composerを使ってライブラリをインストールします。

# Spotifyのダッシュボードからアプリケーションを作成する
#### Spotify for Developersにアクセスし、自分のアカウントのダッシュボードページへ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486031/6fb11386-b39a-e9d1-4298-f1050fbccaaa.png)
Spotifyのアカウントが必要です。持っていない人はアカウントを作成してください。曲が豊富で最高です。もし良ければ僕の[Spotifyのプロフィール](https://open.spotify.com/user/kmtrh1998)も見てください。
アプリの名前やアプリの説明、商用か否か、規約の同意など求められるので言われたとおりに進めていくと、アプリケーションの作成が終了します。


#### Client ID, Client Secretを控える
先ほどのダッシュボードから作成したアプリを選択すると、以下の画面が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486031/3b5249b8-c11f-37b9-70d1-283873b2b1c4.png)
画面左上にClient ID, Client Secret（画像では隠れている）が表示されています。これはAPIに接続する際は必須になります。あとで利用できるようにどこかにコピペするなりして控えておいてください。

あともう一点、必要になるのがRedirect URIです。これは自分で指定します。APIをコールしたときにどのページにリダイレクトするかを指定します。これを指定していないとエラーが出ます。Redirect URIの指定についてはあとで触れます。

# APIに接続する
以下のコードに関しては、こちらのサイトを大いに参考にいたしました。
> [Spotify APIを使ってLINEBotであなたにおすすめプレイリストを全自動で作ってもらう](https://qiita.com/momochan/items/459c95d075f12c6e6b77#%E6%88%90%E5%8A%9F%E4%BE%8B)

適当なファイルに以下のコードを入力してみてください。アクセストークンを取得後、API通信をして認証を受けたSpotifyユーザの情報がstdClassオブジェクトで表示されると思います。デフォルトで返り値がオブジェクトになっていますが、連想配列に変更することもできます。やり方は後述してます。

アクセストークンやらクライアントやらがなんのことだかよくわからない方はこちらの記事を読むといいと思います。
> [一番わかりやすいOAuthの説明](https://qiita.com/TakahikoKawasaki/items/e37caf50776e00e733be)


```index.php
<?php

require 'vendor/autoload.php';

$session = new SpotifyWebAPI\Session(
    '{YOUR_CLIENT_ID}', 
    '{YOUR_CLIENT_SECRET}', 
    '{YOUR_REDIRECt_URI}'
);
$api = new SpotifyWebAPI\SpotifyWebAPI();

if (isset($_GET['code'])) {
    $session->requestAccessToken($_GET['code']);
    $api->setAccessToken($session->getAccessToken());

} else {
    header('Location: ' . $session->getAuthorizeUrl(array(
        'scope' => array( 
          'playlist-read-private', 
          'playlist-modify-private', 
          'user-read-private',
          'playlist-modify'
        )
    )));
    die();
}

echo '<pre>';
    print_r($api->me()); //認証を受けたアカウントのプロフィールが表示される
echo '</pre>';
?>
```

`{Client ID}`, `{Client Secret}`には、先ほどメモしたClient ID, Client SecretをSessionのコンストラクタの引数に指定してください。`{Redirect URI}`にはコードを書いたファイルの絶対パスを指定します。アクセストークン取得後、文字通り指定されているRedirect URIにリダイレクトします。

Redirect URIは先ほどのアカウントページのダッシュボードから登録が必要です。ダッシュボード右上のEDIT SETTINGSからRedirect URIを登録してください。Redirect URIはユーザのアカウントとデータにアクセスする際に必須になります。Spotifyのカタログデータ以外にアクセスが必要ないのであれば、Redirect URIは必要ありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486031/023263d4-6008-9f49-c157-c7c34ae72a77.png)



# 関数を使ってみる
ここから先はGitHubに上がっている[ライブラリのリファレンス](https://github.com/jwilsson/spotify-web-api-php/tree/master/docs/method-reference)をかいつまんで説明するだけです。こんなことができるんだなー程度の目で見てください。

### 現在のユーザのトップトラックまたはアーティストを取得する
[リファレンス](https://github.com/jwilsson/spotify-web-api-php/blob/master/docs/method-reference/SpotifyWebAPI.md#getmytop)

```php
<?php
    require 'vendor/autoload.php';
    $session = new SpotifyWebAPI\Session(
        '{YOUR_CLIENT_ID}', 
        '{YOUR_CLIENT_SECRET}', 
        '{YOUR_REDIRECt_URI}'
    ); 
    $api = new SpotifyWebAPI\SpotifyWebAPI();

    if (isset($_GET['code'])) {
        $session->requestAccessToken($_GET['code']);
        $api->setAccessToken($session->getAccessToken());

    } else {
        header('Location: ' . $session->getAuthorizeUrl(array(
            'scope' => array( 
                'playlist-read-private', 
                'playlist-modify-private', 
                'user-read-private',
                'playlist-modify',
                'user-top-read'
            )
        )));
        die();
    }

    $top = $api->getMyTop('tracks', ['limit' => 4]);
```
これで自分が聴いてるトップ4の曲の情報がオブジェクトで返ってきます。`'tracks'`を`'artist'`に指定すればトップ4のアーティストが返ってきます。いまは4つだけ返ってくるようにしてますが1~50まで設定可能です。また、集計期間も変えることができます。短期/中期/長期の3つに変更可能で、デフォルトでは中期になっています。
また、このgetMyTopメソッドはSpotifyユーザの情報にアクセスが必要になるので、Redirect URIが必要になります。

### Spotifyのカタログを検索する
```php
<?php
    require_once('vendor/autoload.php');
    $session = new SpotifyWebAPI\Session(
        '{Client ID}',
        '{Client Secret}'
    );
    $api = new SpotifyWebAPI\SpotifyWebAPI();
    $session->requestCredentialsToken();
    $accessToken = $session->getAccessToken();
    $api->setAccessToken($accessToken);
    
    $result = $api->search('Retrovision', 'artist');

?>

<pre>
    <?php print_r($result) ?>
</pre>
```
こちらはユーザの情報を必要としないため、Redirect URIを指定しない認証コードフローを使ってセッションを作成しています。検索する文字列、検索するアイテム（アルバム、アーティスト、プレイリスト、トラック）の文字列、オプション（結果を返す上限、マーケット、任意入力）を渡すと、検索結果が返ってきます。

といったようなことがGitHubのリファレンス、Spotify公式のリファレンスにも書いてあります。他にもいろいろやれることがいっぱいあるので、のぞいてみてください。

# 補足
自分がミスってめちゃくちゃ立ち往生したとこについて。
このエラーに2日ぐらいずっと悩まされたことがありました。

```
Fatal error: Uncaught SpotifyWebAPI\SpotifyWebAPIException: 
An unknown error occurred. in /~/spotify-web-api-php/src/Request.php on line 52

SpotifyWebAPI\SpotifyWebAPIException: 
An unknown error occurred. in /~/spotify-web-api-php/src/Request.php on line 52
```

不明なエラー。というやつです。自分は`scope`の指定に不備があったためこのエラーが出ていました。

> [scopeについて（公式リファレンス）](https://developer.spotify.com/documentation/general/guides/authorization-guide/)

上記の`getMyTop()`で考えます。書いてあるコードだと、`scope`にプレイリストなんじゃのどうこう設定されているのがわかるとおもいますが、`getMyTop()`メソッドを使いたいときに必要になるスコープは`'user-top-read'`というスコープです。自分はこれの指定をせずにメソッドの呼び出し方が悪いのかとか、アクセストークンのやりとりがうまくいっていないのか、とか模索してしまいました。
ここで使用しているライブラリで用意されているメソッドを機能させるには、どのスコープが必要なのか？っていうのは、[ライブラリのメソッドリファレンス](https://github.com/jwilsson/spotify-web-api-php/blob/master/docs/method-reference/SpotifyWebAPI.md)にメソッドごとに記載されている公式リファレンスへのリンクから確認することができます。英語ですが頑張ってください。

なにか不明な点や間違った説明があった場合はご教授いただければ幸いです。


# お世話になったサイト
 - [GitHub - spotify-web-api](https://github.com/jwilsson/spotify-web-api-php)
 - [PHPのライブラリ「Spotify Web API PHP」でSpotify APIを動かしてみる | helog - WEB／システム／IT技術ブログ](https://helog.jp/api/spotify-web-api-php/)
 - [PHPのオートロード(autoload)](https://qiita.com/atwata/items/5ba72d3d881a81227c2a)
 - [一番わかりやすいOAuthの説明](https://qiita.com/TakahikoKawasaki/items/e37caf50776e00e733be)
 - [Spotify APIを使ってLINEBotであなたにおすすめプレイリストを全自動で作ってもらう](https://qiita.com/momochan/items/459c95d075f12c6e6b77)