首页 文章

Spotify API:将曲目添加到播放列表:解析JSON时出错

提问于
浏览
0

我正在尝试批量添加歌曲到播放列表 . 我不能为我的生活找到API文档和我发送的内容之间的区别,但无论如何它都是错误的 . 这是我正在使用的功能以及我如何调用它:

def addToPlaylist(songs, playlistUrl, positions = None):
    data = { 'uris': songs }
    if position != None:
        data.update({ 'position': position })

    headers = authHeader.copy()
    headers.update({'Content-Type': 'application/json'})
    print(headers)
    print(json.dumps(data))

    req = requests.post(playlistUrl, headers = headers, data = json.dumps(data))
    if req.status_code != 201:
        print('Error: Request returned status code {}. Returned: {}'.format(req.status_code, req.text))

songs = ["spotify:track:1i1fxkWeaMmKEB4T7zqbzK", "spotify:track:2VKqMKKCFhTPczQb10TMKB", "spotify:track:7Gl9cKtVjRN6KHNMfV1gD3"]
url = "https://api.spotify.com/v1/users/username/playlists/2...Q/tracks"
addToPlaylist(songs, url, 0)

两个调试print()s告诉我以下内容:

{'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Bearer BlahblahblA'}
{"position": 0, "uris": ["spotify:track:1i1fxkWeaMmKEB4T7zqbzK", "spotify:track:2VKqMKKCFhTPczQb10TMKB", "spotify:track:7Gl9cKtVjRN6KHNMfV1gD3"]}

错误输出告诉我这个:

Error: Request returned status code 400. Returned: {
  "error" : {
    "status" : 400,
    "message" : "Error parsing JSON."
  }
}

将URL更改为 http://localhost:3001 并使用netcat nc -l -p 3001 进行侦听时,我可以看到以下请求:

POST / HTTP/1.1
Host: 0:3001
Accept: application/json
Connection: keep-alive
User-Agent: python-requests/2.11.1
Accept-Encoding: gzip, deflate
Content-Type: application/json
Authorization: Bearer BlahblahblA
Content-Length: 145

{"position": 0, "uris": ["spotify:track:1i1fxkWeaMmKEB4T7zqbzK", "spotify:track:2VKqMKKCFhTPczQb10TMKB", "spotify:track:7Gl9cKtVjRN6KHNMfV1gD3"]}

我可能认为正文应该是URL编码的,即使这不是Content-Type Headers 提到的,但是另一个请求( DELETE 从播放列表中删除歌曲)有效,并且我不使用url编码 .

最后the documentation提到以下内容:

POST https://api.spotify.com/v1/users//playlists//tracks
[...] Content-Type:如果在请求正文中传递URI,则为必需,否则将被忽略 . 请求体的内容类型:application / json [...] uris:Spotify URI字符串数组|可选的 . 要添加的Spotify轨道URI的JSON数组 . 例如:{“uris”:[“spotify:track:4iV5W9uYEdYUVa79Axb7Rh”,“spotify:track:1301WleyT98MSxVHPZCA6M”]}

难道我做错了什么?

1 回答

  • 0

    在撰写这篇文章时,它引起了我的注意, position 参数不应该包含在请求体中 . 它必须在URI参数中 . 测试这个,它的工作原理 .

    在我的辩护中,Spotify的错误声称JSON是不可解析的,而不是'未知参数'或类似的东西 . 这花费了太多时间 .

    这有效:

    if position != None:
        playlistUrl += '?position=' + str(position)
    

    而不是 data.update({ 'position': position}) (<=这是错误的) .

相关问题