SpotifyをChatGPT APIを用いたSlack botに追加してみた。

[前回](https://qiita.com/katsuki_ono/items/5ba8d6b541bcbc633f56)、ChatGPT APIを用いたSlack botを作成したので、このbotに、いつも使っている音楽ストリーミングサービスのSpotifyの機能を追加してみました。

追加した機能は、botに話し掛けて好きな音楽をかけれる機能です。

今回もGoogle colabを使用してpythonでコードを書いています。

作成手順は、⒈ Spotify APIの設定及び必要な情報の取得、⒉Spotifyでプレイリストを検索して再生するコードを書く、⒊ChatGPT APIを用いたSlack botに⒉を追加する、です。

# ⒈Spotify APIの設定及び必要な情報の取得
まず、[Spotify APIのDashboard ](https://developer.spotify.com/dashboard/applications)にアクセスして、有料プランのアカウントでログインします。

ログインしたら、CREATE AN APPを押してアプリ名など、必要事項を入力します。

アプリを作成して以下のような黒いページが開いたら、Client IDとClient Secretを取得してメモしておきます。![FFB32299-E270-424C-8049-102B0AD348B2.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3287642/05a01414-825d-f9a2-4f4b-c6da96cee2ea.jpeg)

取得したらページ上のメニューからEDIT SETTINGSを開いてRedirect URIsを設定します。Redirect URIsは、アクセス出来るURLであれば、何でも良いです。私は自分のワードプレスにしています。こちらも後ほど使うので、メモしておきます。![083EDA43-A189-43B2-9F8B-9F85E7B87376.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3287642/c05d235d-4547-443c-f5d8-b7088c4f7461.jpeg)

以上で、Spotify APIの設定及び必要な情報の取得は完了です。

# ⒉Spotifyでプレイリストを検索して再生するコードを書く
まず、下記をインストールします。

```
!pip install spotipy
```
次に、認識を行うコードを以下のように書いて、先程集めた情報を入れます。
情報を入れたら一度全てのセルを実行します。

``` python
# Spotifyの認証
import spotipy
from spotipy.oauth2 import SpotifyOAuth

# Spotify APIのクライアントIDとシークレットを設定
client_id = ''
client_secret = ''
redirect_uri = ''

# 必要なスコープを指定
scope = 'user-read-recently-played playlist-read-private playlist-read-collaborative app-remote-control user-read-playback-state user-library-read user-modify-playback-state'

# 認証情報を取得するためのオブジェクトを作成
sp_oauth = SpotifyOAuth(client_id=client_id, client_secret=client_secret, redirect_uri=redirect_uri, scope=scope)

# ユーザーに認証を求めるために認証ページのURLを表示
auth_url = sp_oauth.get_authorize_url()

# ユーザーが認証後、自動的にアクセストークンを取得
token_info = sp_oauth.get_cached_token()
if not token_info:
    print(auth_url)
    response = input("Enter the URL you were redirected to: ")
    code = sp_oauth.parse_response_code(response)
    token_info = sp_oauth.get_access_token(code)

# アクセストークンを取得し、認証オブジェクトを作成
token = token_info['access_token']
sp = spotipy.Spotify(auth=token)  # sp変数を定義
```

実行すると認証用のURLとアクセストークンを入れるフォームが生成されます。認証用のURLを開いて、「同意する」を押します。
同意するとリダイレクト用のページが開きますので、そのページのURLをコピーして、リダイレクト用アドレス?code=のcode=以降の部分を取得します。
こちらがアクセストークンになるので、先程生成されたフォームに入力します。

最後に下記のコードを実行します。この際、Spotifyが起動中でないとデバイスのエラーになりますので、注意して下さい。

``` python
# ジャンルを指定してプレイリストを検索
genre = input("Enter a genre: ")
results = sp.search(q=genre, type='playlist')
items = results['playlists']['items']

# 最初のプレイリストを選択
playlist_uri = items[0]['uri']
playlist_name = items[0]['name']

# プレイリストのトラックリストを取得
playlist_tracks = sp.playlist_tracks(playlist_uri, fields='items(track(name,id,uri))')


# 最初のトラックのURIを取得
track_uri = playlist_tracks['items'][0]['track']['uri']

# 現在のユーザーのデバイスを取得
devices = sp.devices()
device_id = devices['devices'][0]['id']

# 取得したデバイスで再生を開始する
sp.start_playback(device_id=device_id, context_uri=playlist_uri, offset={"uri": track_uri})
```

実行後、出力されるフォームに好きな音楽のジャンルを入力します。
Spotifyから入力したジャンルのプレイリストが再生されたら、Spotifyでプレイリストを検索して再生するコードを書くは完了です。

# ⒊ChatGPT APIを用いたSlack botに⒉を追加する
⒉と別にノートブックを作成して、[前回](https://qiita.com/katsuki_ono/items/5ba8d6b541bcbc633f56)、作成したSlack botに⒉で作成した機能を追加します。

まずインストールです。
Spotify、Slack、Openaiをインストールします。

```
!pip install spotipy

!pip install slack-bolt

!pip install --upgrade pip
!pip install setuptools wheel
!pip install openai
```

次に先程のSpotifyの認証のコードを書きます。

``` python
# Spotifyの認証
import spotipy
from spotipy.oauth2 import SpotifyOAuth

# Spotify APIのクライアントIDとシークレットを設定
client_id = ''
client_secret = ''
redirect_uri = ''

# 必要なスコープを指定
scope = 'user-read-recently-played playlist-read-private playlist-read-collaborative app-remote-control user-read-playback-state user-library-read user-modify-playback-state'

# 認証情報を取得するためのオブジェクトを作成
sp_oauth = SpotifyOAuth(client_id=client_id, client_secret=client_secret, redirect_uri=redirect_uri, scope=scope)

# ユーザーに認証を求めるために認証ページのURLを表示
auth_url = sp_oauth.get_authorize_url()

# ユーザーが認証後、自動的にアクセストークンを取得
token_info = sp_oauth.get_cached_token()
if not token_info:
    print(auth_url)
    response = input("Enter the URL you were redirected to: ")
    code = sp_oauth.parse_response_code(response)
    token_info = sp_oauth.get_access_token(code)

# アクセストークンを取得し、認証オブジェクトを作成
token = token_info['access_token']
sp = spotipy.Spotify(auth=token)  # sp変数を定義
```

SlackとChatGPTに必要なインポートと情報の入力を行います。

``` python
import openai
from slack_bolt import App
from slack_bolt.adapter.socket_mode import SocketModeHandler
import os

os.environ["SLACK_BOT_TOKEN"] =  ""
os.environ["SLACK_SIGNING_SECRET"] = ""
os.environ["SLACK_APP_TOKEN"] =  ""

openai_api_key = ""

app = App(
    token=os.environ.get("SLACK_BOT_TOKEN"),
    signing_secret=os.environ.get("SLACK_SIGNING_SECRET")
)

openai.api_key = openai_api_key
```

最後にSpotifyを搭載したChatGPT APIを用いたSlack botを下記のように書けば、完成です。def handle_message(event, say):の関数内に機能を追加していけば、自由にSlack botに機能を追加出来ます。

``` python
assist1 = ""

@app.event("message")
def handle_message(event, say):
    global assist1
    text = event["text"]
    response = openai.ChatCompletion.create(
        model="gpt-3.5-turbo",
        messages=[
            {"role": "system", "content": "好きな設定を書く。"},
            {"role": "assistant", "content": assist1},
            {"role": "user", "content": text},
        ]
    )
    assist1 = response["choices"][0]["message"]["content"]  # assist1を更新
    say(assist1)

    if "聞きたい" in text:
        response = openai.ChatCompletion.create(
            model="gpt-3.5-turbo",
            messages=[
                {"role": "system", "content": "以下を音楽のジャンル、アーティスト名、ムードのどれか一つだけを一単語で表す。アーティスト名が含まれる場合には、アーティスト名だけ一単語で返す。"},
                {"role": "user", "content": text},
            ]
        )
        assist2 = response["choices"][0]["message"]["content"]  

        # ジャンルを指定してプレイリストを検索
        genre = assist2
        results = sp.search(q=genre, type='playlist')
        items = results['playlists']['items']

        # 最初のプレイリストを選択
        playlist_uri = items[0]['uri']
        playlist_name = items[0]['name']

        # プレイリストのトラックリストを取得
        playlist_tracks = sp.playlist_tracks(playlist_uri, fields='items(track(name,id,uri))')

        # 最初のトラックのURIを取得
        track_uri = playlist_tracks['items'][0]['track']['uri']

        # 現在のユーザーのデバイスを取得
        devices = sp.devices()
        device_id = devices['devices'][0]['id']

        # 取得したデバイスで再生を開始する
        sp.start_playback(device_id=device_id, context_uri=playlist_uri, offset={"uri": track_uri})


if __name__ == "__main__":
    handler = SocketModeHandler(app,app_token=os.environ.get("SLACK_APP_TOKEN"))
    handler.start()
```

完成したので、全てのセルを実行します。
実行したら、⒉で行ったようにアクセストークンで、Spotifyの認証を行います。

後は、Spotifyを起動してから、作った botのいるSlackのチャンネルで「〜聞きたい」と言ってみてください。
聴いていた音楽が切り替わったら、成功です！

※こちらでは「聞きたい」をトリガーにChatGPTでメッセージを処理して、Spotifyで音楽を再生していますが、普通に条件分岐させた方が便利です。

# 最後に
今回は大好きなSpotifyをSlack botに追加できて嬉しかったです。
 botと話しながら、好きな音楽を聴けるのは、とても楽しいので、おすすめです。
また何か作ってみます。