Python+Spotify APIでアーティストをフォローしてみる


いまさらながらSpotifyの素晴らしさに感動し、有料会員になってこれからどっぷり使っていこうと鼻息を荒くする今日この頃なのですが、先立ってローカルにある音楽のアーティストをSpotify上でしこたまフォローしてやろうと思いSpotify API叩こうとしたのですが、登録系のための認証に少々手こずったので備忘録のためにも記事にしておきます。

クライアント認証

まずはSpotifyでアプリケーションの登録が必要です。次のサイトに飛んでログインしましょう。

Spotify.forDevelopers#dashboard

ログインが完了したらダッシュボード画面で [CREATE A CLIENT ID] をクリック。必要事項を入力して(適当でいいと思う)アプリケーションを作成します。Client IDとClient Secretが発行されます。

このIDとSecretでAPIを叩けます。

とりあえず検索してみる

python用にspotipyというライブラリがありますので、それを使用します。spotifyじゃなくてspotipyなのでお間違えなく。

plamere/spotipy

pipでインストールします。

$ pip install spotipy

github上にもサンプルが載っていますが、その通りに検索してみましょう。「weezer」で検索する例です。

📄example.py
import spotipy
from spotipy.oauth2 import SpotifyClientCredentials

sp = spotipy.Spotify(client_credentials_manager=SpotifyClientCredentials())

results = sp.search(q='weezer', limit=20)
for idx, track in enumerate(results['tracks']['items']):
    print(idx, track['name'])

上記コードを実行する際に注意点があるのですが、デフォルトではClient IDとSecretは環境変数から取ってくるようになってます。下の例のように事前にexportする等してからコードを実行して下さい。

$ export SPOTIPY_CLIENT_ID='<貴殿のCLIENT ID>'
$ export SPOTIPY_CLIENT_SECRET='<貴殿のCLIENT SECRET>'
$ python example.py

書き捨てのコードであればコードの中に書いてしまうという手もあります。

import os
...
os.environ['SPOTIPY_CLIENT_ID'] = '<貴殿のCLIENT ID>'
os.environ['SPOTIPY_CLIENT_SECRET'] = '<貴殿のCLIENT SECRET>'
...

example.pyを実行するとWeezerというバンドの曲情報が表示されるはずです。

データ更新のための認証

検索結果を取得するぐらいならここまでの内容でOKなのですが、アルバムをお気に入りに入れるとか、アーティストをフォローするとか、そういった更新系のAPIを使用するにはさらに認証が必要です。ちなみに『アーティストをフォローする』だったら user-follow-modify というスコープになります。Spotifyのスコープについては公式サイトで確認してみてください。

Authorization Scopes

では認証を進めます。

基本的にはspotipyのドキュメントに沿って進めるわけなんですが、少々分かりづらかったので順を追って説明していきます。まずSpotifyでWebアプリ登録を済ませるにはコールバックを受け付けるWebアプリが必要になります。Facebookアプリ登録と同じやつです。ただPythonからちょっといじりたいだけなんじゃ〜という人にはわざわざそんなサーバ立てるの面倒ですよね。

そんなあなたに朗報です。localhostでアプリ登録するためのサンプルをSpotifyが公開しています。これを利用すれば簡単にアプリ認証が完了します。

spotify/web-api-auth-examples

このREADMEに書いてあるとおりに実施すればOKです。(あ、実行にはnodeが必要ですので!)

  1. Spotify.forDevelopersのDashboardから先程作成したアプリの画面に入り、[EDIT SETTINGS]をクリック。表示されるダイアログでRedirect URIsを登録する。内容は”http://localhost:8888″と”http://localhost:8888/callback”の2つ。
  2. spotify/web-api-auth-examplesをgit cloneしてきて、app.jsの内容を編集する。編集するのはclient_id, redirect_uri, client_secretの3つ。それぞれ自分の値に書き換える。
  3. 次のコードを実行する。
    $ cd authorization_code
    $ node app.js

    Webサーバが立ち上がる。

  4. spotipyのutilを使用して認証を通す。
    import spotipy
    import spotipy.util as util
    
    scope = 'user-follow-modify'
    token = util.prompt_for_user_token(
        '<貴殿のユーザー名>',
        scope,
        client_id='<貴殿のCLIENT ID>',
        client_secret='<貴殿のCLIENT SECRET>', redirect_uri='http://localhost:8888') 
    
    sp = spotipy.Spotify(auth=token)
    print('ok')

    なおここで使用するユーザー名とは、メールアドレとかじゃなくて、下図のようなランダムな文字列のことですから注意!

  5. さきほどのPythonコードを実行するとブラウザが立ち上がりSpotifyの認証が求められるはず。そこを通るとweb-api-auth-examplesが用意してくれてるログインボタンひとつのしょぼい画面に辿り着くはず。このページのURL(code=XXXXXXXXXXとかいう文字列が入ってるURL)をコピーして、コードを実行したターミナルに貼り付ける(貼り付けてくれ、って英語で書いてあるはず)
  6. エラーがなく終了したらOK。なお認証情報はカレントディレクトリに.cache*ファイルとして保存されるので、次回以降にWebサーバを立ち上げる必要はない

上手く行ったでしょうか?僕は所々ハマって少々時間がかかってしまいました・・・。

アーティストをフォローしてみる

ではさっそくアーティストをフォローしてみましょう。アーティストをフォローするにはアーティストのIDを知っておく必要があります。これもAPIを取ってくることにします。サンプルとしてMGMTというバンドをフォローしてみることにします。

import spotipy
import spotipy.util as util

scope = 'user-follow-modify'    # アーティストをフォローするのに必要なスコープ
token = util.prompt_for_user_token(
    '<貴殿のユーザー名>',
    scope,
    client_id='<貴殿のCLIENT ID>',
    client_secret='<貴殿のCLIENT SECRET>',
    redirect_uri='http://localhost:8888')

sp = spotipy.Spotify(auth=token)

# `MGMT`のアーティスト検索を実行
target = 'MGMT'
result = sp.search(q='artist:' + target, type='artist', limit=10)
for item in result['artists']['items']:
    # 名前が完全一致するアーティストを採用
    if item['name'].lower() == target.lower():
        sp.user_follow_artists([item['id']])
        print('アーティスト`{}`[id={}]をフォローしました'.format(item['name'], item['id']))

検索内容によっては結果が複数返ってくるので、名前がピッタリ一致するアーティストを正解だとみなして(簡易ロジックなのでベタなアーティスト名だと問題があるかも)。

正常に動作すればMGMTがフォローされているはず。Spotifyを立ち上げて確認してみてください。

 

というわけでSpotify APIを使ってみましたが、シンプルでわりと使いやすそうな印象でした。今回はアーティストをフォローでしたが、例えばアルバムをお気に入りに追加するなんてものほぼ同じような流れでできると思います。なんか面白そうなことができたらまた記事にしてみようと思います。

関連する記事


コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください