如何通过Spotify Web API获取歌曲的总播放量?
问题描述
我尝试从Spotify的TOP 50播放列表中获取歌曲的全局总播放量,流程是先获取歌曲ID,再发起二次请求,但返回的数值只是我个人账号的播放量。请问如何获取全局总播放量?这是否可行?
useEffect(() => { if (!accessToken) return alert("Failed OAUTH"); axios.get('https://api.spotify.com/v1/playlists/37i9dQZEVXbMDoHDwVN2tF/tracks?fields=items(track(name%2C%20id)%2C%20track(album(images)%2C%20artists))', { headers: { 'Authorization': `Bearer ${accessToken}` } }).then(response => { const firstTrackId = response.data.items[0].track.id; setnameTopArtist(response.data.items[0].track.artists[0].name) axios.get(`https://api.spotify.com/v1/tracks/${firstTrackId}`, { headers: { 'Authorization': `Bearer ${accessToken}` } }).then(res => { const firstTrackStreams = res.data.popularity; console.log("ress:" + res); console.log(`Počet poslechů první skladby: ${firstTrackStreams}`); setmonthlyListeners(firstTrackStreams); }).catch(error => { console.error(error); }); }).catch(error => { console.error(error); }); }, [accessToken]); return ( <div className=" max-w-5xl bg-primary ml-4 mr-4 mb-4 mt-4 rounded-lg md:ml-8 md:mr-8 md:mb-8 md:mt-8"> {/*Left side*/} <div className= "mt-4 md:mt-8 gap-2 flex flex-col justify-left items-left" > {/* Verification icon*/} <div className=" ml-4 gap-1 flex flex-row justify-left items-center "> <MdVerified className="w-6 h-6 md:w-12 h-12" /> <h2 className = "text-sm md:text-base ">Verified artist</h2> </div> {/*Artist name*/} <h2 className= "ml-4 md:ml-6 text-lg md:text-3xl font-bold">{nameTopArtist}</h2> {/*Monthly listeners*/} <h3 className= "text-sm md:text-base text-gray-300 ml-4 md:ml-6 ">{monthlyListeners} monthly listeners</h3> </div> {/*Right side with image*/ } </div> ); }
解答
先纠正一个误解
你当前获取的res.data.popularity不是个人播放量,它是Spotify基于全球播放数据计算的歌曲流行度指标(取值0-100)。数值越高,代表该歌曲近期在全球范围内的播放量越多、热度越高。你误以为是个人数据,可能是测试时的巧合,但这个字段本身就是全局热度的体现。
关于获取精确全局总播放量的可行性
Spotify官方公开API不提供单首歌曲的精确全局总播放次数。这类数据属于商业敏感信息,仅对歌曲的艺术家本人或其授权团队开放,可通过Spotify for Artists平台查看,第三方开发者无法通过公开接口获取。
可用的替代方案
如果需要展示歌曲的热度相关数据,建议继续使用popularity字段,它已经能直观反映歌曲的全球流行程度。
如果你的需求是展示艺人相关数据(比如代码里的monthlyListeners),注意:公开API中无法获取艺人的月度听众数,但可以获取艺人的总粉丝数,通过调用/artists/{artist_id}接口的followers.total字段实现,示例代码调整如下:
useEffect(() => { if (!accessToken) return alert("Failed OAUTH"); axios.get('https://api.spotify.com/v1/playlists/37i9dQZEVXbMDoHDwVN2tF/tracks?fields=items(track(name%2C%20id)%2C%20track(album(images)%2C%20artists))', { headers: { 'Authorization': `Bearer ${accessToken}` } }).then(response => { const firstTrack = response.data.items[0].track; const artistId = firstTrack.artists[0].id; setnameTopArtist(firstTrack.artists[0].name); // 调用艺人信息接口获取总粉丝数 axios.get(`https://api.spotify.com/v1/artists/${artistId}`, { headers: { 'Authorization': `Bearer ${accessToken}` } }).then(res => { const totalFollowers = res.data.followers.total; console.log(`艺人总粉丝数: ${totalFollowers}`); setmonthlyListeners(totalFollowers); // 建议修改字段名避免歧义,比如改为totalFollowers }).catch(error => { console.error(error); }); }).catch(error => { console.error(error); }); }, [accessToken]);
内容的提问来源于stack exchange,提问作者Peter_Griffindor
相关产品推荐
相关产品推荐

