3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2023-03-27

前回、ChatGPT APIを用いたSlack botを作成したので、このbotに、いつも使っている音楽ストリーミングサービスのSpotifyの機能を追加してみました。

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

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

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

⒈Spotify APIの設定及び必要な情報の取得

まず、Spotify APIのDashboard にアクセスして、有料プランのアカウントでログインします。

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

アプリを作成して以下のような黒いページが開いたら、Client IDとClient Secretを取得してメモしておきます。FFB32299-E270-424C-8049-102B0AD348B2.jpeg

取得したらページ上のメニューからEDIT SETTINGSを開いてRedirect URIsを設定します。Redirect URIsは、アクセス出来るURLであれば、何でも良いです。私は自分のワードプレスにしています。こちらも後ほど使うので、メモしておきます。083EDA43-A189-43B2-9F8B-9F85E7B87376.jpeg

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

⒉Spotifyでプレイリストを検索して再生するコードを書く

まず、下記をインストールします。

!pip install spotipy

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

# 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が起動中でないとデバイスのエラーになりますので、注意して下さい。

# ジャンルを指定してプレイリストを検索
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に⒉を追加する

⒉と別にノートブックを作成して、前回、作成したSlack botに⒉で作成した機能を追加します。

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

!pip install spotipy

!pip install slack-bolt

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

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

# 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に必要なインポートと情報の入力を行います。

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に機能を追加出来ます。

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と話しながら、好きな音楽を聴けるのは、とても楽しいので、おすすめです。
また何か作ってみます。

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?