Kanade's Dev Journal

如何通过 Spotify API 获取并展示当前播放歌曲

Published on
Published on
/3 mins read/---

如果您想在网站上显示 Spotify 正在播放的曲目,您需要从 Spotify 获取一个令牌。此令牌将用于从 Spotify API 获取曲目信息。

创建 Spotify 应用

首先,您需要创建一个 Spotify 应用程序来获取凭据,以便生成令牌。

  • 访问 Spotify for Developers,使用 Spotify 账户登录。
  • 点击 Create app 按钮。
  • 填写表格并输入应用程序名称和描述。
  • 添加重定向 URI。该 URI 将用于在验证后重定向到您的本地应用程序。例如,你启动的本地服务:http://localhost:3000
  • 点击 Save 按钮。

创建应用程序后,导航到 Settings 页面并复制 Client IDClient secret。 我们将在下一步中使用这些值。

Spotify App

认证与授权

由于只需生成一次令牌,我们将使用 Authorization Code Flow。 导航到下面的 URL,并将 CLIENT_ID 替换为 Spotify 应用程序的 CLIENT_ID

https://accounts.spotify.com/authorize?client_id=CLIENT_ID&response_type=code&redirect_uri=http://localhost:3000&scope=user-read-currently-playing

将上面的请求地址复制到浏览器并访问,Spotify 会将用户重定向到你指定的 redirect_uri,并在 URL 中附带一个授权码 codeSpotify auth

使用上一步获取的授权码,通过 API 工具请求获取访问令牌:

请求头 header

  • Authorization:使用 CLIENT_ID:Client secret 格式进行 Base64 编码
  • Content-Type:固定值 application/x-www-form-urlencoded

请求体 body

  • grant_type:固定值 authorization_code
  • code:授权码
  • redirect_uri:重定向 URI

响应结果

{
  "access_token": "access_token",
  "token_type": "Bearer",
  "expires_in": 3600,
  "refresh_token": "refresh_token",
  "scope": "user-read-currently-playing"
}

查询正在播放的曲目

现在我们有了令牌,可以用它从 Spotify API 获取正在播放的曲目。 使用下面代码在节点服务器中获取正在播放的曲目:

spotify.js
import fetch from 'isomorphic-unfetch'
 
let SPOTIFY_TOKEN_API = `https://accounts.spotify.com/api/token`
let SPOTIFY_NOW_PLAYING_API = `https://api.spotify.com/v1/me/player/currently-playing`
let SPOTIFY_TOP_TRACKS_API = `https://api.spotify.com/v1/me/top/tracks`
 
let {
  SPOTIFY_CLIENT_ID: client_id,
  SPOTIFY_CLIENT_SECRET: client_secret,
  SPOTIFY_REFRESH_TOKEN: refresh_token,
} = process.env
 
let basic = Buffer.from(`${client_id}:${client_secret}`).toString('base64')
 
async function getAccessToken() {
  let response = await fetch(SPOTIFY_TOKEN_API, {
    method: 'POST',
    headers: {
      Authorization: `Basic ${basic}`,
      'Content-Type': 'application/x-www-form-urlencoded',
    },
    body: new URLSearchParams({
      grant_type: 'refresh_token',
      refresh_token,
    }),
  })
 
  return response.json()
}
 
export async function getNowPlaying() {
  let { access_token } = await getAccessToken()
  let url = new URL(SPOTIFY_NOW_PLAYING_API)
  url.searchParams.append('additional_types', 'track,episode')
 
  return fetch(url.toString(), {
    headers: {
      Authorization: `Bearer ${access_token}`,
    },
  })
}

记得在 .env 文件中添加所需的环境变量。

.ENV.env
SPOTIFY_CLIENT_ID=your_spotify_client_id
SPOTIFY_CLIENT_SECRET=your_spotify_client_secret
SPOTIFY_REFRESH_TOKEN=your_spotify_refresh_token

现在你可以使用 getNowPlaying 函数从 Spotify API 获取正在播放的曲目,看看效果: now

Happy playing!