You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 13:10:37