使用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
尝试的修复方案及结果
- 在
get_playlist_tracks()中添加if track is not None:判断,仅针对'Spotify'用户名时无效。 - 添加
try: except TypeError:语句后,程序运行时长增加,打印数千条曲目后终止,无法执行最后的print(user_playlist_tracks_audio_features)。
后续编辑补充
- 编辑1:发布问题后,代码无法在任何用户名上运行,原因不明。
- 编辑2:推测是短时间内API调用次数耗尽,但'Spotify'用户名的原始问题仍存在。
【已解决】问题根源为使用了废弃函数。
内容的提问来源于stack exchange,提问作者Robert.O
相关产品推荐
相关产品推荐

