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

使用Spotipy获取Spotify官方账号歌曲触发TypeError(Python)【已解决:用了废弃函数】

Spotify API调用异常问题:官方账号'Spotify'触发TypeError的解决

问题现象

编写的一组函数,使用自身或朋友的Spotify用户名时可正常运行,但使用官方账号名'Spotify'时,程序要么无限运行,要么触发TypeError。

访问Spotify API的代码

load_dotenv()
cid = os.getenv("SPOTIPY_CLIENT_ID")
secret = os.getenv("SPOTIPY_CLIENT_SECRET")
redirect = os.getenv("REDIRECT_URI")
username = os.getenv("SPOTIFY_USERNAME")
scope = 'user-library-read'


token = spotipy.prompt_for_user_token(username=username, scope=scope, client_id=cid, client_secret=secret, redirect_uri=redirect)
oauth = spotipy.SpotifyOAuth(client_id=cid, client_secret=secret, redirect_uri=redirect, username=username)
session = spotipy.Spotify(auth=token)

核心业务代码

def get_audio_features(uris):
    data = []
    batch_size = 50
    for i in range(0, len(uris), batch_size):
        batch_uris = uris[i:i+batch_size]
        features = session.audio_features(batch_uris)
        for feature in features:
            if feature is not None:
                data.append([
                    feature['danceability'],
                    feature['energy'],
                    feature['key'],
                    feature['loudness'],
                    feature['mode'],
                    feature['speechiness'],
                    feature['acousticness'],
                    feature['instrumentalness'],
                    feature['liveness'],
                    feature['valence'],
                    feature['tempo'],
                    feature['id']
                ])
    return data


def get_user_playlists(user):
    user_playlist_ids = []
    playlists = session.user_playlists(user)
    while playlists:
        for i, playlist in enumerate(playlists['items']):
            user_playlist_ids.append(playlist['uri'][-22:])
        if playlists['next'] is not None:
            playlists = session.next(playlists)
        else:
            playlists = None
    return user_playlist_ids


def get_playlist_tracks(playlist_uris):
    playlist_track_ids = []
    for uri in playlist_uris:
        tracks = session.playlist_tracks(uri, limit=50)['items']
        for track in tracks:
            print(track)
            if track is not None:
                playlist_track_ids.append(track['track']['id'])
    return playlist_track_ids


def get_user_playlists_tracks_audio_features(user):
    user_playlists = get_user_playlists(user)
    user_plalist_tracks = get_playlist_tracks(user_playlists)
    user_playlist_tracks_audio_features = get_audio_features(user_plalist_tracks)
    return user_playlist_tracks_audio_features

user_playlist_tracks_audio_features = get_user_playlists_tracks_audio_features('Spotify')

print(user_playlist_tracks_audio_features)

运行结果对比

  • 使用自身username运行时,输出格式正常:
    [[#, #, ..., id], [#, #, ..., id], ...]
    
  • 使用'Spotify'作为用户名时,触发错误:
    playlist_track_ids.append(track['track']['id'])  TypeError: 'NoneType' object is not subscriptable
    

尝试的修复方案及结果

  1. 在get_playlist_tracks()中添加if track is not None:判断,仅针对'Spotify'用户名时无效。
  2. 添加try: except TypeError:语句后,程序运行时长增加,打印数千条曲目后终止,无法执行最后的print(user_playlist_tracks_audio_features)。

后续编辑补充

  • 编辑1:发布问题后,代码无法在任何用户名上运行,原因不明。
  • 编辑2:推测是短时间内API调用次数耗尽,但'Spotify'用户名的原始问题仍存在。

【已解决】问题根源为使用了废弃函数。

内容的提问来源于stack exchange,提问作者Robert.O

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 07:37:43