如何使用Spotify Web API按名称搜索用户 [英] How to search for a user by name using Spotify Web API
本文介绍了如何使用Spotify Web API按名称搜索用户的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在尝试创建一个Android应用程序,其中包含一个可以按名称搜索Spotify用户的功能。使用Spotify时,你可以按ID或姓名搜索用户。然而,目前,我看不到Spotify Web API支持按名称搜索用户。如果您有用户ID,则可以使用Web API访问他们的配置文件。但我希望有一种方法可以搜索用户名并以这种方式获得他们的ID。
Spotify的Web API允许您搜索"曲目"或"艺术家",他们将返回所有搜索结果。那么,为什么不能对用户名执行同样的操作呢?有没有什么方法可以让这件事在我看不到的情况下发挥作用?
推荐答案
我认为这是一个有趣的问题,因为它涉及到一个巨大社区的用户数据,所以我会尝试弄清楚。
首先,您可以清楚地看到Spotify Web API终结点 具有仅允许以下类型的type
参数:artist
、playlist
和track
。
让我们试着从这里运行(注意:请参阅我正在使用的Promise.all
获取数据的解决方案here)
备注
最新的Spotifysearch
API将要求在请求标头中指定访问令牌:
-H "Authorization: Bearer {your access token}"
数据-lang="js"数据-隐藏="假"数据-控制台="假"数据-巴贝尔="假">
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"
}
好!,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" />
此时您将看到Spotifyuser
对象URL的列表,如(示例URL)
"https://api.spotify.com/v1/users/12345678"
现在我们可以获取用户配置文件URL(不需要身份验证):
数据-lang="js"数据-隐藏="假"数据-控制台="假"数据-巴贝尔="假">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
个类似计数的对象(示例json):
{
"name": "Joe Deere",
"followers": 666,
"url": "https://api.spotify.com/v1/users/12345678"
}
因此,简单地说,起点是playlist
搜索API中的搜索类型。考虑到这一点,您无需身份验证即可获得用户配置文件。假设您已获取有效的OAuth令牌,则可以获取顶层图表以进行进一步查询。
这篇关于如何使用Spotify Web API按名称搜索用户的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!