Ich denke, das ist eine interessante Frage, da es Benutzerdaten einer großen Gemeinschaft betrifft, so werde ich versuchen, herauszufinden.
Erstens kann man deutlich sehen, dass der Spotify Web API Endpunkt search
einen type
Parameter hat, die nur die folgenden Arten gibt zu: artist
, playlist
und track
. Versuchen wir es von hier aus laufen zu lassen (Anmerkung: siehe Promise.all
Lösung, um Daten zu holen I here bin mit)
HINWEIS Aktuelle Spotify search
APIs wird ein Zugriffstoken erfordert in den Request-Header angegeben werden:
-H "Authorization: Bearer {your access token}"
var spotifyAccessToken = "YourSpotifyAccessToken";
var console = {
log: function(s) {
document.getElementById("console").innerHTML += s + "<br/>"
}
}
// Simple XMLHttpRequest
// based on https://davidwalsh.name/xmlhttprequest
SimpleRequest = {
call: function(what, response) {
var request;
if (window.XMLHttpRequest) { // Mozilla, Safari, ...
request = new XMLHttpRequest();
} else if (window.ActiveXObject) { // IE
try {
request = new ActiveXObject('Msxml2.XMLHTTP');
} catch (e) {
try {
request = new ActiveXObject('Microsoft.XMLHTTP');
} catch (e) {}
}
}
// state changes
request.onreadystatechange = function() {
if (request.readyState === 4) { // done
if (request.status === 200) { // complete \t
response(request.responseText)
} else response();
}
}
request.open('GET', what, true);
request.setRequestHeader("Authorization", "Bearer " + spotifyAccessToken);
request.send(null);
}
}
//PromiseAll
var promiseAll = function(items, block, done, fail) {
var self = this;
var promises = [],
index = 0;
items.forEach(function(item) {
promises.push(function(item, i) {
return new Promise(function(resolve, reject) {
if (block) {
block.apply(this, [item, index, resolve, reject]);
}
});
}(item, ++index))
});
Promise.all(promises).then(function AcceptHandler(results) {
if (done) done(results);
}, function ErrorHandler(error) {
if (fail) fail(error);
});
}; //promiseAll
// LP: deferred execution block
var ExecutionBlock = function(item, index, resolve, reject) {
var url="https://api.spotify.com/v1/"
url+=item;
SimpleRequest.call(url, function(result) {
if (result) {
console.log(JSON.stringify(result, null, 2)
.replace(/\\n/g,"<br>").replace(/\\"/g,'"'));
resolve(result);
} else {
reject(new Error("call error"));
}
})
}
arr = [
"search?type=playlist&q=%22doom%20metal%22",
"search?type=playlist&q=Adele"]
promiseAll(arr, function(item, index, resolve, reject) {
console.log("Making request [" + index + "]")
ExecutionBlock(item, index, resolve, reject);
}, function(results) { // aggregated results
console.log("All response received " + results.length);
//console.log(JSON.stringify(results));
}, function(error) { // error
console.log(error);
});
<div id="console" />
A Diese Objekte sind selbstdefiniert, aber eins: playlist
. In der Tat können wir aus dieser Antwort sehen, dass wir user
Objekte wie (Beispiel) haben:
"owner" {
"external_urls": {
"spotify": "http://open.spotify.com/user/12345678"
}
Nizza !, die external_urls
sind Benutzerprofile url, während die href
Wiedergabelisten url sind (die eine Authentifizierung erfordern btw), so dass wir können sie zunächst von dieser json
Reaktion greifen:
var console = {
log: function(s) {
document.getElementById("console").innerHTML += s + "<br/>"
}
}
// Simple XMLHttpRequest
// based on https://davidwalsh.name/xmlhttprequest
SimpleRequest = {
call: function(what, response) {
var request;
if (window.XMLHttpRequest) { // Mozilla, Safari, ...
request = new XMLHttpRequest();
} else if (window.ActiveXObject) { // IE
try {
request = new ActiveXObject('Msxml2.XMLHTTP');
} catch (e) {
try {
request = new ActiveXObject('Microsoft.XMLHTTP');
} catch (e) {}
}
}
// state changes
request.onreadystatechange = function() {
if (request.readyState === 4) { // done
if (request.status === 200) { // complete \t
response(request.responseText)
} else response();
}
}
request.open('GET', what, true);
request.send(null);
}
}
//PromiseAll
var promiseAll = function(items, block, done, fail) {
var self = this;
var promises = [],
index = 0;
items.forEach(function(item) {
promises.push(function(item, i) {
return new Promise(function(resolve, reject) {
if (block) {
block.apply(this, [item, index, resolve, reject]);
}
});
}(item, ++index))
});
Promise.all(promises).then(function AcceptHandler(results) {
if (done) done(results);
}, function ErrorHandler(error) {
if (fail) fail(error);
});
}; //promiseAll
// LP: deferred execution block
var ExecutionBlock = function(item, index, resolve, reject) {
var url="https://api.spotify.com/v1/"
url+=item;
SimpleRequest.call(url, function(result) {
if (result) {
JSON.parse(result).playlists.items.map(function(item,index) {
var userProfileUrl = item.owner.href;
console.log(JSON.stringify(userProfileUrl, null, 2)
.replace(/\\n/g,"<br>").replace(/\\"/g,'"'));
})
resolve(result);
} else {
reject(new Error("call error"));
}
})
}
arr = [
"search?type=playlist&q=%22doom%20metal%22",
"search?type=playlist&q=Adele"]
promiseAll(arr, function(item, index, resolve, reject) {
console.log("Making request [" + index + "]")
ExecutionBlock(item, index, resolve, reject);
}, function(results) { // aggregated results
console.log("All response received " + results.length);
//console.log(JSON.stringify(results));
}, function(error) { // error
console.log(error);
});
<div id="console" />
An diesem Punkt y ou wird eine Liste von Spotify user
Objekte Urls wie (zB URL)
"https://api.spotify.com/v1/users/12345678"
So, jetzt können wir sehen, holen Benutzer url Profile (kein Auth erforderlich):
var console = {
log: function(s) {
document.getElementById("console").innerHTML += s + "<br/>"
}
}
// Simple XMLHttpRequest
// based on https://davidwalsh.name/xmlhttprequest
SimpleRequest = {
call: function(what, response) {
var request;
if (window.XMLHttpRequest) { // Mozilla, Safari, ...
request = new XMLHttpRequest();
} else if (window.ActiveXObject) { // IE
try {
request = new ActiveXObject('Msxml2.XMLHTTP');
} catch (e) {
try {
request = new ActiveXObject('Microsoft.XMLHTTP');
} catch (e) {}
}
}
// state changes
request.onreadystatechange = function() {
if (request.readyState === 4) { // done
if (request.status === 200) { // complete \t
response(request.responseText)
} else response();
}
}
request.open('GET', what, true);
request.send(null);
}
}
//PromiseAll
var promiseAll = function(items, block, done, fail) {
var self = this;
var promises = [],
index = 0;
items.forEach(function(item) {
promises.push(function(item, i) {
return new Promise(function(resolve, reject) {
if (block) {
block.apply(this, [item, index, resolve, reject]);
}
});
}(item, ++index))
});
Promise.all(promises).then(function AcceptHandler(results) {
if (done) done(results);
}, function ErrorHandler(error) {
if (fail) fail(error);
});
}; //promiseAll
// LP: deferred execution block
var ExecutionBlock = function(item, index, resolve, reject) {
var url = "https://api.spotify.com/v1/"
url += item;
SimpleRequest.call(url, function(result) {
if (result) {
var profileUrls = JSON.parse(result).playlists.items.map(function(item, index) {
return item.owner.href;
})
resolve(profileUrls);
} else {
reject(new Error("call error"));
}
})
}
arr = [
"search?type=playlist&q=%22doom%20metal%22",
"search?type=playlist&q=Adele"
]
promiseAll(arr, function(item, index, resolve, reject) {
console.log("Making request [" + index + "]")
ExecutionBlock(item, index, resolve, reject);
}, function(results) { // aggregated results
console.log("All profiles received " + results.length);
//console.log(JSON.stringify(results[0], null, 2));
///// promiseall again
var ExecutionProfileBlock = function(item, index, resolve, reject) {
SimpleRequest.call(item, function(result) {
if (result) {
var obj = JSON.parse(result);
resolve({
name: obj.display_name ,
followers: obj.followers.total,
url : obj.href
});
}//result
})
}//ExecutionProfileBlock
promiseAll(results[0], function(item, index, resolve, reject) {
//console.log("Making request [" + index + "] " + item)
ExecutionProfileBlock(item, index, resolve, reject);
}, function(results) { // aggregated results
console.log("All response received " + results.length);
console.log(JSON.stringify(results, null, 2));
}
,function(error) { // error
console.log(error);
})
/////
},
function(error) { // error
console.log(error);
});
<div id="console" />
Get es raus! An dieser Stelle können wir user
Objekte mit display_name
und followers
Zahl wie (Beispiel json) sehen:
{
"name": "Joe Deere",
"followers": 666,
"url": "https://api.spotify.com/v1/users/12345678"
}
also rekapitulieren, ist der Ausgangspunkt playlist
Suchart bei der Suche api.Angesichts dessen können Sie Benutzerprofile ohne Authentifizierung erhalten. Wenn Sie gültige Oauth-Token erhalten, können Sie Top-Charts abrufen, um weitere Abfragen durchzuführen.
Ich glaube, ich verstehe Ihren ersten Codeabschnitt nicht. Es sieht so aus, als ob du eine Wiedergabeliste mit den Schlagwörtern "Doom Metal" und "Adele" suchst. Soweit ich weiß, haben Sie Nutzer anhand dieser Wiedergabelistenergebnisse gefunden. Sind diese Benutzer mit Wiedergabelisten mit Adele oder Doom Metal verbunden? Bedeutet das, dass ich, um ein Benutzerprofil zu finden, Informationen über ihre Playlists wissen muss? Ich sehe nicht, wie dieser Code die Eingabeinfo "Benutzername" überhaupt verwendet, alles was ich sehe ist, dass die Playlist-Information die Eingabe ist. – OMGitzMidgar
@OMGitzMidgar Ja dies ist die einzige Möglichkeit, Benutzer als Ausgabe zu haben, da es keine Möglichkeit gibt, nach Benutzernamen zu fragen, wenn Sie in der Antwort die einzigen Objekte, die Sie abfragen können, Künstler, Album, Track und Playlist sind. Aber bei Playlists können Sie Usera als Ausgabe haben, das ist die Hälfte des Problems;) – loretoparisi