Как искать пользователя по имени с помощью Spotify Web API
0 OMGitzMidgar [2016-04-11 01:25:00]
Я пытаюсь создать приложение для Android, которое содержит функцию, в которой вы можете искать пользователей Spotify по имени. При использовании Spotify вы можете искать пользователя по их идентификатору или по имени. Однако в настоящее время я не вижу, чтобы Spotify Web API поддерживал поиск пользователей по имени. Если у вас есть идентификатор пользователя, вы можете получить доступ к своему профилю с помощью веб-API. Но я надеялся, что вы можете запустить поиск имени пользователя и получить свой идентификатор таким образом.
Spotify Web API позволяет вам искать "дорожку" или "художник", где они возвратят все результаты поиска. Итак, почему вы не можете сделать то же самое с именами пользователей? Есть ли способ сделать эту работу, которую я просто не вижу?
spotify
1 ответ
0 loretoparisi [2016-04-11 02:48:00]
Я думаю, что это интересный вопрос, поскольку он касается пользовательских данных огромного сообщества, поэтому я постараюсь выяснить.
Во-первых, вы можете четко видеть, что конечная точка Spotify Web API search
имеет параметр type
, который допускает только следующие типы: artist
, playlist
и track
.
Попробуйте запустить его здесь (примечание: см. Решение Promise.all
для получения данных, которые я использую здесь)
Примечание
В последних API-интерфейсах Spotify search
для заголовков запросов должен быть указан токен доступа:
-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
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" />
Все эти объекты определены самим собой, но одно: playlist
.
На самом деле мы можем видеть из этого ответа, что user
объекты, подобные (пример):
"owner" {
"external_urls": {
"spotify": "http://open.spotify.com/user/12345678"
}
Nice!, external_urls
- это URL-адреса пользовательских профилей, а href
- это URL-адреса плейлистов (для которых требуется аутентификация btw), чтобы мы могли сначала захватить их из этого ответа json
:
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
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" />
В этот момент вы увидите список пунктов user
URL-адресов объектов, например (пример url)
"https://api.spotify.com/v1/users/12345678"
Итак, теперь мы можем получить URL-адрес профилей пользователей (не требуется авторизация):
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
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" />
Получите это! На этом этапе мы можем видеть объекты user
с display_name
и followers
count like (пример json):
{
"name": "Joe Deere",
"followers": 666,
"url": "https://api.spotify.com/v1/users/12345678"
}
Итак, для повторения, отправной точкой является playlist
тип поиска в api поиска. Учитывая это, вы можете получить профили пользователей без аутентификации. Предполагалось, что вы получаете действительные токены oauth, вы можете получать лучшие диаграммы для выполнения дальнейших запросов.