我编写了一个程序,旨在将歌曲添加到我自己的 Spotify 播放列表中。
以下是授权码:
const { SpotifyWebApi } = require('spotify-web-api-node');
module.exports = async (req, res) => {
const spotifyApi = new SpotifyWebApi({
clientId: process.env.SPOTIFY_CLIENT_ID,
clientSecret: process.env.SPOTIFY_CLIENT_SECRET,
redirectUri: `${process.env.VERCEL_URL}/api/callback`,
});
const scopes = ['playlist-read-private', 'playlist-read-collaborative', 'playlist-modify-public', 'playlist-modify-private', 'user-read-playback-state', 'user-modify-playback-state', 'user-read-currently-playing', 'playlist-read-collaborative', 'user-read-playback-position', 'user-library-modify'];
const authorizeURL = spotifyApi.createAuthorizeURL(scopes, null);
res.writeHead(302, { Location: authorizeURL });
res.end();
};
虽然您认为我只需要播放列表修改公共和私人,但我在测试后将它们全部包含在内。 /callback 函数返回我在代码中包含的刷新令牌。
然而,当我尝试
await spotifyApi.addTracksToPlaylist(playlistId, [`spotify:track:${songId}`]);
时,我收到以下错误:
"An error occurred while communicating with Spotify's Web API.\nDetails: Insufficient client scope."
我不明白如何获得不正确的客户端范围?我已经确保令牌是正确的。我不知道该怎么办。
spotify-web-api-node
不完全支持Authorization Code Flow
。
这意味着你需要通过express提供一个回调端点作为本地服务器。
并请求
code
并兑换成access token
。
本教程代码是来自
spotify-web-api-node
的最佳示例
https://github.com/thelinmichael/spotify-web-api-node/blob/master/examples/tutorial/00-get-access-token.js
用于将歌曲添加到您的播放列表中
另存为
demo.js
const express = require('express');
const SpotifyWebApi = require('spotify-web-api-node');
const PORT = 3000; // it need to match your REDIRECT URI's port
const CLIENT_ID = '<your client id>'
const CLIENT_SECRET = '<your client secret>'
const PLAYLIST_ID = '<your playlist id>'
const scopes = [
'playlist-modify-public',
'playlist-modify-private'
];
const spotifyApi = new SpotifyWebApi({
redirectUri: `http://localhost:${PORT}/callback`,
clientId: CLIENT_ID,
clientSecret: CLIENT_SECRET
});
const app = express();
app.get('/login', (req, res) => {
res.redirect(spotifyApi.createAuthorizeURL(scopes));
});
app.get('/callback', (req, res) => {
const error = req.query.error;
const code = req.query.code;
const state = req.query.state;
if (error) {
console.error('Callback Error:', error);
res.send(`Callback Error: ${error}`);
return;
}
spotifyApi
.authorizationCodeGrant(code)
.then(data => {
const access_token = data.body['access_token'];
const refresh_token = data.body['refresh_token'];
const expires_in = data.body['expires_in'];
spotifyApi.setAccessToken(access_token);
spotifyApi.setRefreshToken(refresh_token);
spotifyApi.addTracksToPlaylist(PLAYLIST_ID, [
'spotify:track:4iV5W9uYEdYUVa79Axb7Rh' // Prelude for Piano No. 11 in F-Sharp Minor
])
res.send('Success! You added a song into your playlist');
setInterval(async () => {
const data = await spotifyApi.refreshAccessToken();
const access_token = data.body['access_token'];
spotifyApi.setAccessToken(access_token);
}, expires_in / 2 * 1000);
})
.catch(error => {
console.error('Error getting Tokens:', error);
res.send(`Error getting Tokens: ${error}`);
});
});
app.listen(PORT, () =>
console.log(
`HTTP Server up. Now go to http://localhost:${PORT}/login in your browser.`
)
);
https://developer.spotify.com/dashboard
npm install express spotify-web-api-node
node demo.js
http://localhost:3000/login
端口号再次需要与您的配置相匹配。