Python 如何让所有艺术家使用Spotify API?
我能够创建一个类对象来验证我的客户端ID。在下面的代码中,我编写了一个函数——这将允许我根据ID抓取多个艺术家 函数是get_all_artists()。当我运行两个ID时,它给我一个404错误。有人能解释或帮助我理解我需要修改的内容吗?我希望能够将json格式转换为数据帧Python 如何让所有艺术家使用Spotify API?,python,dataframe,api,spotify,spotify-app,Python,Dataframe,Api,Spotify,Spotify App,我能够创建一个类对象来验证我的客户端ID。在下面的代码中,我编写了一个函数——这将允许我根据ID抓取多个艺术家 函数是get_all_artists()。当我运行两个ID时,它给我一个404错误。有人能解释或帮助我理解我需要修改的内容吗?我希望能够将json格式转换为数据帧 enter code here class SpotifyAPI(object): access_token = None access_token_expires = datetime.datetime.now() acc
enter code here
class SpotifyAPI(object):
access_token = None
access_token_expires = datetime.datetime.now()
access_token_did_expire = True
client_id = None
client_secret = None
token_url = "https://accounts.spotify.com/api/token"
def __init__(self, client_id, client_secret, *args, **kwargs):
super().__init__(*args, **kwargs)
self.client_id = client_id
self.client_secret = client_secret
def get_client_credentials(self):
"""
Returns a base64 encoded string
"""
client_id = self.client_id
client_secret = self.client_secret
if client_secret == None or client_id == None:
raise Exception("You must set client_id and client_secret")
client_creds = f"{client_id}:{client_secret}"
client_creds_b64 = base64.b64encode(client_creds.encode())
return client_creds_b64.decode()
def get_token_headers(self):
client_creds_b64 = self.get_client_credentials()
return {
"Authorization": f"Basic {client_creds_b64}"
}
def get_token_data(self):
return {
"grant_type": "client_credentials"
}
def perform_auth(self):
token_url = self.token_url
token_data = self.get_token_data()
token_headers = self.get_token_headers()
r = requests.post(token_url, data=token_data, headers=token_headers)
if r.status_code not in range(200, 299):
raise Exception("Could not authenticate client.")
# return False
data = r.json()
now = datetime.datetime.now()
access_token = data['access_token']
expires_in = data['expires_in'] # seconds
expires = now + datetime.timedelta(seconds=expires_in)
self.access_token = access_token
self.access_token_expires = expires
self.access_token_did_expire = expires < now
return True
def get_access_token(self):
token = self.access_token
expires = self.access_token_expires
now = datetime.datetime.now()
if expires < now:
self.perform_auth()
return self.get_access_token()
elif token == None:
self.perform_auth()
return self.get_access_token()
return token
def get_resource_header(self):
access_token = self.get_access_token()
headers = {
"Authorization": f"Bearer {access_token}"
}
return headers
def get_resource(self, lookup_id, resource_type='albums', version='v1'):
endpoint = f"https://api.spotify.com/{version}/{resource_type}/{lookup_id}"
headers = self.get_resource_header()
r = requests.get(endpoint, headers=headers)
if r.status_code not in range(200, 299):
return {}
return r.json()
def get_album(self, _id):
return self.get_resource(_id, resource_type='albums')
def get_artist(self, _id):
return self.get_resource(_id, resource_type='artists')
#get all artists
def get_all_artists(self, resource_type='artists', version='v1', lookup_ids):
endpoint = f"https://api.spotify.com/{version}/{resource_type}?{lookup_ids}="
headers = self.get_resource_header()
r = requests.get(endpoint, headers=headers)
if r.status_code in range(200, 299):
return {}
return r.json()
import pandas as pd
import warnings
warnings.filterwarnings('ignore')
#normalize the data to get proper form for one artist
from pandas.io.json import json_normalize
all_artists = spotify.get_all_artists("7LTShHcq1KdTrWeLvWoYed",
"64k5e9kV9MdukXjFrR5R37")
df2 = pd.json_normalize(all_artists)
在此处输入代码
类SpotifyAPI(对象):
访问令牌=无
access\u token\u expires=datetime.datetime.now()
access\u token\u Dod\u expire=True
客户端id=无
client_secret=None
令牌\u url=”https://accounts.spotify.com/api/token"
定义初始化(self、client\u id、client\u secret、*args、**kwargs):
super()
self.client\u id=客户端\u id
self.client\u secret=client\u secret
def获取客户端凭据(自身):
"""
返回base64编码的字符串
"""
client\u id=self.client\u id
client\u secret=self.client\u secret
如果客户端\u secret==无或客户端\u id==无:
引发异常(“必须设置客户端id和客户端机密”)
client_creds=f“{client_id}:{client_secret}”
client\u creds\u b64=base64.b64encode(client\u creds.encode())
返回客户端\u creds\u b64.decode()
def get_令牌_头(自身):
client\u creds\u b64=self.get\u client\u credentials()
返回{
“授权”:f“基本{客户信任{U b64}”
}
def获取令牌数据(自身):
返回{
“授予类型”:“客户端凭据”
}
def perform_auth(self):
token\u url=self.token\u url
token\u data=self.get\u token\u data()
token\u headers=self.get\u token\u headers()
r=requests.post(token\u url,data=token\u data,headers=token\u headers)
如果r.status_代码不在范围内(200299):
引发异常(“无法对客户端进行身份验证。”)
#返回错误
data=r.json()
now=datetime.datetime.now()
access\u token=数据['access\u token']
expires_in=数据['expires_in']#秒
expires=now+datetime.timedelta(秒=expires\u in)
self.access\u token=访问\u token
self.access\u token\u expires=过期
self.access\u token\u did\u expire=expires