如何使用Spotify Web API按名称搜索用户 [英] How to search for a user by name using Spotify Web API

查看:17
本文介绍了如何使用Spotify Web API按名称搜索用户的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试创建一个Android应用程序,其中包含一个可以按名称搜索Spotify用户的功能。使用Spotify时,你可以按ID或姓名搜索用户。然而,目前,我看不到Spotify Web API支持按名称搜索用户。如果您有用户ID,则可以使用Web API访问他们的配置文件。但我希望有一种方法可以搜索用户名并以这种方式获得他们的ID。

Spotify的Web API允许您搜索"曲目"或"艺术家",他们将返回所有搜索结果。那么,为什么不能对用户名执行同样的操作呢?有没有什么方法可以让这件事在我看不到的情况下发挥作用?

推荐答案

我认为这是一个有趣的问题,因为它涉及到一个巨大社区的用户数据,所以我会尝试弄清楚。

首先,您可以清楚地看到Spotify Web API终结点 具有仅允许以下类型的type参数:artistplaylisttrack。 让我们试着从这里运行(注意:请参阅我正在使用的Promise.all获取数据的解决方案here)

备注 最新的SpotifysearchAPI将要求在请求标头中指定访问令牌:

-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响应中获取它们:

数据-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) {
          
          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" />

拿出来!此时,我们可以看到userdisplay_namefollowers个类似计数的对象(示例json):

{
    "name": "Joe Deere",
    "followers": 666,
    "url": "https://api.spotify.com/v1/users/12345678"
}
因此,简单地说,起点是playlist搜索API中的搜索类型。考虑到这一点,您无需身份验证即可获得用户配置文件。假设您已获取有效的OAuth令牌,则可以获取顶层图表以进行进一步查询。

这篇关于如何使用Spotify Web API按名称搜索用户的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
其他开发最新文章
热门教程
热门工具
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆