我正在尝试设置一个简单的快捷方式,将当前正在播放的Spotify音轨添加到spotify播放列表中,以便在流程中听到它们时记录我喜欢的音乐。
我正在使用Apple的那个。
到目前为止,我发现有Spotify API可以满足我的需求,但我在最后一步失败了。
更准确地说,由于我想修改私人播放列表,这个api(1): https://developer.spotify.com/web-api/console/post-playlist-tracks/ 需要授权令牌。这个令牌可以手动检索,到目前为止很好,这个Applescript正在运行:
-- Main
set userID to "XXXXX"
-- my real userID can be retrieved with https://developer.spotify.com/web-api/console/get-current-user/#complete
set SelectedPlaylistID to "YYYY"
-- my target playlist can be retrieved with https://developer.spotify.com/web-api/console/get-playlists/#complete
set BearerID to "ZZZZ"
-- ZZZZ can be retrieved manually on page (1)
tell application "Spotify"
set currentSpotifyID to id of current track as string
end tell
set currentlyPlayingTrack to trim_line(currentSpotifyID, "spotify:track:", 0)
set theURL to "'https://api.spotify.com/v1/users/" & userID & "/playlists/" & SelectedPlaylistID & "/tracks?uris=spotify%3Atrack%3A" & currentlyPlayingTrack & "' -H 'Accept: application/json' -H 'Authorization: Bearer " & BearerID & "'"
-- built from https://developer.spotify.com/web-api/console/post-playlist-tracks/#complete
set theCommand to "curl -X POST " & theURL
do shell script theCommand
-- trim subroutine; not the subject here; mentioned for completeness, you can skip it
on trim_line(this_text, trim_chars, trim_indicator)
-- 0 = beginning, 1 = end, 2 = both
set x to the length of the trim_chars
-- TRIM BEGINNING
if the trim_indicator is in {0, 2} then
repeat while this_text begins with the trim_chars
try
set this_text to characters (x + 1) thru -1 of this_text as string
on error
-- the text contains nothing but the trim characters
return ""
end try
end repeat
end if
-- TRIM ENDING
if the trim_indicator is in {1, 2} then
repeat while this_text ends with the trim_chars
try
set this_text to characters 1 thru -(x + 1) of this_text as string
on error
-- the text contains nothing but the trim characters
return ""
end try
end repeat
end if
return this_text
end trim_line
现在是棘手的部分。
BearerID是临时的,所以我每次都需要手动检索它,这违背了快捷方式的目的。
我想自动检索“ZZZZ”,BearerID。
有一个关于授权的教程 https://developer.spotify.com/web-api/authorization-guide/#disqus_thread坦率地说,我无法理清。
我认为我在授权代码流中实现了请求4)的解决方案:
set base64encodedCredentials to "WWWW"
-- where WWWW is the result of
-- $ echo - n 'CCCC:SSSS' | base64
-- "CCCC" being my Spotify ClientID and "SSSS" my Client Secret as given on https://beta.developer.spotify.com/dashboard/applications/
set BearerID to "ZZZZ"
-- where ZZZZ is the expired token
set authorizationURL to "-H 'Authorization: Basic " & base64encodedCredentials & "' -d grant_type=authorization_code -d code=" & BearerID & "-d redirect_uri=https%3A%2F%2Fwww.foo.com%2Fauth https://accounts.spotify.com/api/token"
set theAuthorization to "curl -X 'POST' " & authorizationURL
do shell script theAuthorization
但是我收到了错误
“{\”error \“:\”invalid_client \“,\”error_description \“:\”无效的客户端\“}”
所以基本上我没有找到在Spotify中自动检索授权令牌的正确方法。
有什么想法吗?
答案 0 :(得分:0)
您似乎正在使用部分授权代码流和部分客户端凭据流。
如果您要使用客户端凭据(这将允许您获取常规Spotify数据但不能获取用户特定数据),则需要将grant_type设置为client_credentials并删除重定向uri。将该行更改为:
set authorizationURL to "-H 'Authorization: Basic " & base64encodedCredentials & "' -d grant_type=client_credentials https://accounts.spotify.com/api/token"
如果您想使用授权码(这将允许您获取用户特定数据),您需要遵循更复杂的流程。请注意,此流需要用户交互以向您的应用授予您请求的范围,这一点非常重要。这在脚本中很难做到,但这是bash中的一个例子:https://gist.github.com/hughrawlinson/358afa57a04c8c0f1ce4f1fd86604a73
幸运的是,您只需要获得一次用户操作,因为一旦您拥有刷新令牌,您就可以在后台刷新用户的访问令牌(授权指南中的步骤7)。
您当前的方法无法正常工作的原因是您所称的BearerID实际上是访问令牌,但您将其用作"代码"对于此流程(您提到的授权指南中的步骤4)。
我建议为此设置一个小型服务器,它可以在后台运行并处理身份验证和刷新。请参阅此处的示例,其中包含授权代码流Python和Node.js。
如果您有任何疑问,请与我联系!