Spotipy获取当前播放Track ID遇TypeError报错求助
Spotipy 获取当前播放曲目ID时触发TypeError的解决方案
我发现Spotipy的current_user_playing_track()相关资料较少,特此求助。原本代码可以正常获取当前播放的艺术家名称与曲目名称,但添加获取track ID的代码后,触发TypeError: string indices must be integers, not 'str'错误。
原正常代码
import spotipy import spotipy.util as util from spotipy.oauth2 import SpotifyClientCredentials from spotipy.oauth2 import SpotifyOAuth import json import requests cid = 'my client id' secret = 'my client secrets' redirect_uri = 'http://localhost:7777/callback' username = 'my username' scope = 'user-read-currently-playing' token = util.prompt_for_user_token(username, scope, cid, secret, redirect_uri) spotify = spotipy.Spotify(token) def get_current_song(): # Get track information track = spotify.current_user_playing_track() print(json.dumps(track, sort_keys=True, indent=4)) artist = json.dumps(track['item']['album']['artists'][0]['name']) track = json.dumps(track['item']['name']) return artist, track def main(): artist, track = get_current_song() if artist != "": print("Currently playing " + artist + " - " + track + "--TRACK ID--") if __name__ == '__main__': main()
修改后报错的代码片段
def get_current_song(): # Get track information track = spotify.current_user_playing_track() print(json.dumps(track, sort_keys=True, indent=4)) artist = json.dumps(track['item']['album']['artists'][0]['name']) track = json.dumps(track['item']['name']) track_id = json.dumps(track['item']['id']) return artist, track
错误栈信息
Traceback (most recent call last): File "C:\Users\Me\AppData\Local\Programs\Python\Python311\Projects\spotipy\kasify.py", line 32, in <module> main() File "C:\Users\Me\AppData\Local\Programs\Python\Python311\Projects\spotipy\kasify.py", line 27, in main artist, track = get_current_song() ^^^^^^^^^^^^^^^^^^ File "C:\Users\Me\AppData\Local\Programs\Python\Python311\Projects\spotipy\kasify.py", line 23, in get_current_song track_id = json.dumps(track['item']['id']) ~~~~~^^^^^^^^ TypeError: string indices must be integers, not 'str'
问题分析
错误核心原因:变量名冲突导致覆盖
- 初始的
track是Spotipy API返回的字典对象,包含完整的曲目元数据。 - 执行
track = json.dumps(track['item']['name'])后,track变量被覆盖成了字符串类型(曲目名称的JSON序列化字符串)。 - 后续尝试用
track['item']['id']访问时,字符串仅支持整数索引(如track[0]取第一个字符),无法识别字符串索引'item',因此触发TypeError。
解决方案
修改变量名避免覆盖原API返回的字典对象,同时正确获取track ID:
def get_current_song(): # 重命名变量,避免覆盖原始API数据 track_data = spotify.current_user_playing_track() print(json.dumps(track_data, sort_keys=True, indent=4)) # 若不需要JSON序列化,可直接获取原始字符串(去掉json.dumps更简洁) artist = json.dumps(track_data['item']['album']['artists'][0]['name']) track_name = json.dumps(track_data['item']['name']) track_id = json.dumps(track_data['item']['id']) # 返回新增的track_id return artist, track_name, track_id def main(): artist, track_name, track_id = get_current_song() if artist != "": print(f"Currently playing {artist} - {track_name} --TRACK ID-- {track_id}")
额外优化建议
增加空值判断,避免无曲目播放时触发KeyError:
def get_current_song(): track_data = spotify.current_user_playing_track() # 检查是否有正在播放的曲目 if not track_data or not track_data.get('item'): return "", "", "" # 直接获取原始字符串,无需JSON序列化 artist = track_data['item']['album']['artists'][0]['name'] track_name = track_data['item']['name'] track_id = track_data['item']['id'] return artist, track_name, track_id
内容的提问来源于stack exchange,提问作者error500
相关产品推荐
相关产品推荐

