Spotify Web API - 错误 400,播放列表创建时没有正文
Spotify Web API - Error 400 with no body on playlist creation
我正在尝试使用 Spotify Web API 创建和填充播放列表。我正在关注 this 官方参考,并且我正在使用 Python 3 和 requests 模块。这是我的代码:
def spotify_write_playlist(auth, name, tracks, public=True):
ids = []
for track in tracks:
track_id = track.services['spotify']
if track_id: ids.append(track_id)
headers = {
"authorization":"Bearer " + auth.token,
"content-type":"application/json"
}
data = {
"name":name,
"public":public
}
r = makeRequest("https://api.spotify.com/v1/users/" + auth.username + "/playlists", "post", 201, json=data, headers=headers)
playlist_id = json.loads(r.content)['id']
data = {"uris":ids}
r = makeRequest("https://api.spotify.com/v1/users/" + auth.username + "/playlists/" + playlist_id + "/tracks", "post", 201, json=data, headers=headers)
return playlist_id
def makeRequest(url, method="get", expectedCode=200, *args, **kwargs):
while True:
r = requests.request(method, url, **kwargs)
if r.status_code == 429:
time.sleep(TMR_DELAY)
continue
elif r.status_code == expectedCode:
return r
else:
if "spotify.com" in url:
raise spotify.ApiError(r.status_code, expectedCode, r.content)
else:
raise youtube.ApiError(r.status_code, expectedCode, r.content)
makeRequest 函数是 requests.request 的包装器,用于处理速率限制。
上面的代码 运行 有一堆样本曲目 returns 在第一次调用 makeRequest 时出现错误 400,所以我的样本曲目不会是问题,因为只有名称和public 该调用涉及变量。
错误响应没有主体,因此没有错误描述。这表明我可能遗漏了一些非常明显的东西。有人可以帮忙吗?
播放列表创建请求不再出错,我不知道为什么。在尝试诊断问题时,我必须改变任何错误。我以为它试图创建一个同名的播放列表,但 spotify 允许重复的播放列表。也许我使用的令牌或令牌对象有问题。对不起。
然而,在清除前一个问题时,我还发现了另一个问题:添加到曲目时,您指定的曲目 uri (spotify:track:abcdef123) 而不仅仅是曲目 ID (abcdef123)。我修改了下面的spotify_write_playlists:
def spotify_write_playlist(auth, name, tracks, public=True):
ids = []
for track in tracks:
track_id = track.services['spotify']
if track_id: ids.append("spotify:track:"+track_id)
headers = {
"authorization":"Bearer " + auth.token,
"content-type":"application/json"
}
data = {
"name":name,
"public":public
}
r = makeRequest("https://api.spotify.com/v1/users/" + auth.username + "/playlists", "post", 201, json=data, headers=headers)
playlist_id = json.loads(r.content)['id']
data = {"uris":ids}
r = makeRequest("https://api.spotify.com/v1/users/" + auth.username + "/playlists/" + playlist_id + "/tracks", "post", 201, json=data, headers=headers)
return playlist_id
我正在尝试使用 Spotify Web API 创建和填充播放列表。我正在关注 this 官方参考,并且我正在使用 Python 3 和 requests 模块。这是我的代码:
def spotify_write_playlist(auth, name, tracks, public=True):
ids = []
for track in tracks:
track_id = track.services['spotify']
if track_id: ids.append(track_id)
headers = {
"authorization":"Bearer " + auth.token,
"content-type":"application/json"
}
data = {
"name":name,
"public":public
}
r = makeRequest("https://api.spotify.com/v1/users/" + auth.username + "/playlists", "post", 201, json=data, headers=headers)
playlist_id = json.loads(r.content)['id']
data = {"uris":ids}
r = makeRequest("https://api.spotify.com/v1/users/" + auth.username + "/playlists/" + playlist_id + "/tracks", "post", 201, json=data, headers=headers)
return playlist_id
def makeRequest(url, method="get", expectedCode=200, *args, **kwargs):
while True:
r = requests.request(method, url, **kwargs)
if r.status_code == 429:
time.sleep(TMR_DELAY)
continue
elif r.status_code == expectedCode:
return r
else:
if "spotify.com" in url:
raise spotify.ApiError(r.status_code, expectedCode, r.content)
else:
raise youtube.ApiError(r.status_code, expectedCode, r.content)
makeRequest 函数是 requests.request 的包装器,用于处理速率限制。
上面的代码 运行 有一堆样本曲目 returns 在第一次调用 makeRequest 时出现错误 400,所以我的样本曲目不会是问题,因为只有名称和public 该调用涉及变量。
错误响应没有主体,因此没有错误描述。这表明我可能遗漏了一些非常明显的东西。有人可以帮忙吗?
播放列表创建请求不再出错,我不知道为什么。在尝试诊断问题时,我必须改变任何错误。我以为它试图创建一个同名的播放列表,但 spotify 允许重复的播放列表。也许我使用的令牌或令牌对象有问题。对不起。
然而,在清除前一个问题时,我还发现了另一个问题:添加到曲目时,您指定的曲目 uri (spotify:track:abcdef123) 而不仅仅是曲目 ID (abcdef123)。我修改了下面的spotify_write_playlists:
def spotify_write_playlist(auth, name, tracks, public=True):
ids = []
for track in tracks:
track_id = track.services['spotify']
if track_id: ids.append("spotify:track:"+track_id)
headers = {
"authorization":"Bearer " + auth.token,
"content-type":"application/json"
}
data = {
"name":name,
"public":public
}
r = makeRequest("https://api.spotify.com/v1/users/" + auth.username + "/playlists", "post", 201, json=data, headers=headers)
playlist_id = json.loads(r.content)['id']
data = {"uris":ids}
r = makeRequest("https://api.spotify.com/v1/users/" + auth.username + "/playlists/" + playlist_id + "/tracks", "post", 201, json=data, headers=headers)
return playlist_id