使用 Spotipy 设置 Spotify 凭据

Posted

技术标签:

【中文标题】使用 Spotipy 设置 Spotify 凭据【英文标题】:Setting Spotify credentials using Spotipy 【发布时间】:2016-01-31 09:29:06 【问题描述】:

我正在尝试在我的 mac 10.10 上预装 python 2.7.10 的 spotipy,特别是 [add_a_saved_track.py][1] 这是从 github 复制的代码:

# Add tracks to 'Your Collection' of saved tracks

import pprint
import sys

import spotipy
import spotipy.util as util

scope = 'user-library-modify'

if len(sys.argv) > 2:
    username = sys.argv[1]
    tids = sys.argv[2:]
else:
    print("Usage: %s username track-id ..." % (sys.argv[0],))
    sys.exit()

token = util.prompt_for_user_token(username, scope)

if token:
    sp = spotipy.Spotify(auth=token)
    sp.trace = False
    results = sp.current_user_saved_tracks_add(tracks=tids)
    pprint.pprint(results)
else:
    print("Can't get token for", username)

我在 developer.spotify.com/my-applications 注册了应用程序并收到了 client_id 和 client_secret。我对 redirect_uri 的选择有点不清楚,所以我将其设置为 'https://play.spotify.com/collection/songs'

从终端运行此程序,我收到一条错误消息:

You need to set your Spotify API credentials. You can do this by
setting environment variables like so:
export SPOTIPY_CLIENT_ID='your-spotify-client-id'
export SPOTIPY_CLIENT_SECRET='your-spotify-client-secret'
export SPOTIPY_REDIRECT_URI='your-app-redirect-url'

我将 id、secret 和 url 作为字符串放入我的代码中,就在导入之后,但在 util.prompt_for_user_token 方法之上。

导致回溯:

File "add-track.py", line 8
export SPOTIPY_CLIENT_ID='4f...6'
                       ^
SyntaxError: invalid syntax

我注意到 Text Wrangler 无法将“export”识别为特殊词。我在 docs.python.org 中搜索了“export”,但没有找到任何有用的信息。什么是出口?我怎么用错了?

接下来我尝试将 client_id、client_secret 和 redirect_uri 作为参数传递给 util.prompt_for_user_token 方法,如下所示:

util.prompt_for_user_token(username,scope,client_id='4f...6',client_secret='xxx...123',redirect_uri='https://play.spotify.com/collection/songs')

当我尝试这样做时,终端中会发生这种情况:

User authentication requires interaction with your
        web browser. Once you enter your credentials and
        give authorization, you will be redirected to
        a url.  Paste that url you were directed to to
        complete the authorization.


Opening https://accounts.spotify.com/authorize?scope=user-library-modify&redirect_uri=https%3A%2F%2Fplay.spotify.com%2Fcollection%2Fsongs&response_type=code&client_id=4f...6 in your browser


Enter the URL you were redirected to: 

我输入了https://play.spotify.com/collection/songs,然后得到了这个回溯:

Traceback (most recent call last):
File "add-track.py", line 21, in <module>
token = util.prompt_for_user_token(username, scope, client_id='4f...6', client_secret='xxx...123', redirect_uri='https://play.spotify.com/collection/songs')
File "/Library/Python/2.7/site-packages/spotipy/util.py", line 86, in prompt_for_user_token
token_info = sp_oauth.get_access_token(code)
File "/Library/Python/2.7/site-packages/spotipy/oauth2.py", line 210, in get_access_token
raise SpotifyOauthError(response.reason)
spotipy.oauth2.SpotifyOauthError: Bad Request

似乎我遗漏了一些东西,可能需要导入 Spotipy 的另一部分,或者其他一些 python 模块。看来我错过了设置客户端凭据的部分。我怎么做?我对此相当陌生(如果这不明显的话)。请帮忙。

更新:我将 redirect_uri 更改为 localhost:8888/callback。这会导致 Firefox 选项卡打开并显示错误——“无法连接到服务器”。 (因为我没有运行服务器。我想像在 Spotify Web API 教程中那样安装 node.js,但我还没有)。然后,python 脚本要求我复制并粘贴重定向到的 URL。即使 FF 无法打开页面,我还是通过复制 整个 URL 来实现这个功能,包括 localhost:8888/callback? 后面的“code=BG...”?我不确定这是一个理想的设置,但至少它可以工作。

是否设置 node.js 是否重要?

【问题讨论】:

fyi export 是一个 unix 命令而不是 python 方法。它用于设置环境变量,然后 prompt_for_user_token 将能够通过进行系统调用来读取。因此,您应该在终端中输入导出命令,而不是在 python 脚本中 【参考方案1】:

您遵循的过程(包括您的更新)与示例的意图完全相同,您没有遗漏任何东西!显然,这是一个相当简单的教程,但它为您设置了一个令牌,您应该能够获得所需的信息。

对于凭据,您可以通过运行每个导出命令直接在终端中进行设置。在此处阅读有关 EXPORT 的更多信息:https://www.cyberciti.biz/faq/linux-unix-shell-export-command/

【讨论】:

以上是关于使用 Spotipy 设置 Spotify 凭据的主要内容,如果未能解决你的问题,请参考以下文章

获得使用 Python3 的 spotipy 修改 Spotify 播放列表的授权

使用 Spotipy 获取当前正在播放的歌曲会出现错误:“'Spotify' 对象没有属性 'currently_playing'”

Spotipy(Spotify 的 Web API Python 包装器)示例失败

如何使用客户端ID和密码访问spotify的web api?

使用客户端凭据流刷新 spotify 令牌

Spotify API 从名称中查找艺术家 ID?