Я премиум-пользователь, но получаю 403 Premium account needed
, используя этот фрагмент.
Мне кажется, или воспроизвести песню Spotify из командной строки невероятно сложно?
#!/bin/bash
TRACK_ID = "0hCB0YR03f65y1YKr59OSs" # Zeppelin
# Spotify App Credentials
CLIENT_ID = "my_id"
CLIENT_SECRET = "my_secret"
# Obtain token
TOKEN = "$(\
curl -X POST "https://accounts.spotify.com/api/token" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=client_credentials&client_id=$CLIENT_ID&client_secret=$CLIENT_SECRET"| jq -r '.access_token')"
# Play a song on the Spotify player
curl -s -X "PUT" "https://api.spotify.com/v1/me/player/play" \
--data "{\"uris\": [\"spotify:track:$TRACK_ID\"]}" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${TOKEN}"
P.S. Spotipy возвращает ту же ошибку
Вы не можете воспроизвести песню с помощью команды curl. Ваш пробный метод — Поток учетных данных клиента. Этот метод может получить информацию об исполнителе, альбоме и песне.
Для воспроизведения песни требуется Поток кода авторизации. Он может заставить пользователей воспроизводить песни и получать информацию о пользователях в виде связанных пользовательских API.
Он должен получить токен по «redirect_URI».
Вот примеры здесь
Демонстрационный код — использование экспресса на node.js
Сохранить как play-song.js
Вам необходимо запустить приложение Spotify или войти в Spotify через браузер.
const axios = require('axios')
const express = require('express')
const cors = require('cors')
const app = express()
app.use(cors())
// for raw JSON of Body
app.use(express.json())
const REDIRECT_URI = '<your redirect URL>' // mine is http://localhost:3000/callback
const CLIENT_ID = '<your client id>'
const CLIENT_SECRET = '<your client secret>'
const SCOPE = ['playlist-modify-private', 'user-read-currently-playing', 'user-read-playback-state', 'user-modify-playback-state']
app.get("/login", (request, response) => {
const redirect_url = `https://accounts.spotify.com/authorize?response_type=code&client_id=${CLIENT_ID}&scope=${SCOPE}&state=123456&redirect_uri=${REDIRECT_URI}&prompt=consent`
response.redirect(redirect_url);
})
app.get("/callback", async (request, response) => {
const code = request.query["code"]
await axios.post(
url = 'https://accounts.spotify.com/api/token',
data = new URLSearchParams({
'grant_type': 'authorization_code',
'redirect_uri': REDIRECT_URI,
'code': code
}),
config = {
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
params: {
'grant_type': 'client_credentials'
},
auth: {
username: CLIENT_ID,
password: CLIENT_SECRET
}
})
.then(resp1 => {
axios.get(
url = 'https://api.spotify.com/v1/me/player/devices',
config = {
headers: {
'Accept-Encoding': 'application/json',
Authorization: `Bearer ${resp1.data.access_token}`
}
}
).then(resp2 => {
const device_id = resp2.data.devices[0].id
const track_id = '7pKfPomDEeI4TPT6EOYjn9' // Imagine-Remastered 2010
const access_token = resp1.data.access_token;
axios.put(`https://api.spotify.com/v1/me/player/play?device_id=${device_id}`, {
uris: [`spotify:track:${track_id}`]
}, {
headers: {
'Authorization': `Bearer ${access_token}`,
'Content-Type': 'application/json'
}
})
.then(data => {
response.send(JSON.stringify({"device id": device_id}))
})
.catch(error => {
console.error(error)
});
})
});
})
// use your <redirect URL>'s port
app.listen(3000, () => { console.info("Listening on : 3000") })
npm install axios express cors
node play-song.js
Затем откройте браузер, получите доступ к этому URL
localhost:3000/login
Помните, что номер порта должен быть вашим номером порта на панели инструментов
слева Spotify
справа вверху это браузер
правый нижний конец
В центре вверху находится панель «Звук» в Windows. Вы можете визуализировать звук через движение полосы после воспроизведения дорожки.
@jjk, спасибо, что приняли мой ответ, можете ли вы тоже проголосовать? Это даст мне еще 10 баллов.
Вы проверили, что попали по тому же URL-адресу от почтальона. если это работает, это может быть из-за режима боя с ботом, включенного на веб-сайте Spotify. Попробуйте передать заголовок агента пользователя, чтобы ваш запрос выглядел так, как будто он исходит из браузера.