Spotify API,尝试查找当前歌曲时收到 404 响应

问题描述 投票:0回答:1

我正在尝试制作一个程序来查找当前正在播放的歌曲,然后将其放入我的播放列表之一。但是当尝试获取当前正在播放的歌曲时,我收到了 404 响应。

这就是我获取访问令牌的方式:

def get_token():
    auth_str = client_id + ":" + client_secret
    auth_bytes = auth_str.encode("utf-8")
    auth_base64 = str(base64.b64encode(auth_bytes), "utf-8")

    url = "https://accounts.spotify.com/api/token"
    headers = {
        "Authorization": "Basic " + auth_base64,
        "Content-Type": "application/x-www-form-urlencoded"
    }
    data = {"grant_type": "client_credentials"}
    result = post(url, headers=headers, data=data)
    json_result = json.loads(result.content)
    token = json_result["access_token"]
    return token

这就是我创建标题的方式:

def get_headers(token):
    return {"Authorization": "Bearer " + token}

这就是我试图获取当前正在播放的歌曲 uri 的方式:

def get_current_track_and_post_in_playlist(token):
    headers = get_headers(token)
    result = get('https://api.spotify.com/v1/me/player/currently-playing', headers=headers)
    playlist_id = "0p4d0akcszc87kcf0pym6qws1"
    print(result)
    json_result = json.loads(result.content)["item"]["uri"]
    print(json_result)

    playlist_put = post(f'https://api.spotify.com/v1/playlists/{playlist_id}/tracks?uris={json_result}', headers=headers)

当在 get_current_track_and_post_in_playlist 函数中打印结果时,我得到一个 。有人可以帮我解决这个问题吗?

python spotify
1个回答
2
投票

对于这两个 REST API,需要提供原因

user authentication

获取当前播放曲目

https://api.spotify.com/v1/me/player/currently-playing

将项目添加到播放列表

https://api.spotify.com/v1/playlists/{playlist_id}/tracks

需要通过授权码流程

获取token

所以我将通过本地服务器进行演示

Flask

整体步骤

# 步骤 1

我通过浏览器播放歌曲。它将添加到我的播放列表中

# 步骤 2

使用此代码和

add-song.py
文件名运行本地重定向服务器。

您需要在仪表板中配置应用程序的

Redirect URIs

https://developer.spotify.com/dashboard/applications

from flask import Flask, request, redirect
from requests_oauthlib import OAuth2Session
from requests.auth import HTTPBasicAuth
import requests
import json

app = Flask(__name__)

AUTH_URL = 'https://accounts.spotify.com/authorize'
TOKEN_URL = 'https://accounts.spotify.com/api/token'
REDIRECT_URI = 'http://localhost:3000/callback' # your redirect URI
CLIENT_ID = "<your client ID>"
CLIENT_SECRET = "<your client Secret>"
SCOPE = [
    "user-read-playback-state",
    "app-remote-control",
    "user-modify-playback-state",
    "playlist-read-private",
    "playlist-read-collaborative",
    "user-read-currently-playing",
    "user-read-playback-position",
    "user-library-modify",
    "playlist-modify-private",
    "playlist-modify-public",
    "user-read-recently-played",
    "user-read-private",
    "user-library-read"   
]

def get_headers(token):
    return {"Authorization": "Bearer " + token}

@app.route("/login")
def login():
    spotify = OAuth2Session(CLIENT_ID, scope=SCOPE, redirect_uri=REDIRECT_URI)
    authorization_url, state = spotify.authorization_url(AUTH_URL)
    return redirect(authorization_url)

# your redirect URI's path
@app.route("/callback", methods=['GET'])
def callback():
    code = request.args.get('code')
    res = requests.post(TOKEN_URL,
        auth=HTTPBasicAuth(CLIENT_ID, CLIENT_SECRET),
        data={
            'grant_type': 'authorization_code',
            'code': code,
            'redirect_uri': REDIRECT_URI
        })
    access_token = res.json()['access_token']
    listObj = []
    listObj.append(res.json())

    # get current playing
    headers = get_headers(access_token)
    result1 = requests.get(url='https://api.spotify.com/v1/me/player/currently-playing', headers=headers)
    current_song = result1.json()
    listObj.append(current_song)

    # Add new song into playlist with current playing song
    playlist="<your playlist ID>"
    url = "https://api.spotify.com/v1/playlists/{0}/tracks".format(playlist)
    # current_song['item']['uri']  = 'spotify:track:xxxxxxxxxxxxxxxx'
    params = {'uris': current_song['item']['uri']}
    result2 = requests.post(url,
        params=params,
        headers={'Content-Type':'application/json',
            'Authorization': 'Bearer {0}'.format(access_token)})
    added_song = result2.json()    
    listObj.append(added_song)
    return listObj

if __name__ == '__main__':
    app.run(port=3000,debug=True) # your redirect URI's port
$ python add-song.py

#3 通过浏览器登录

http://localhost:3000/login

登录您的 Spotify 凭据

添加歌曲之前

添加歌曲后

在浏览器中,会显示当前播放歌曲信息以及添加歌曲的

snapshot_id

关键是播放歌曲的曲目URI需要设置一个添加播放列表的参数。

current_song['item']['uri']

#步骤4~6

它是通过内部代码运行的。

我希望通过这个演示您正在寻找解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.