【问题标题】:Last.Fm API - Invalid parameters when trying to use track.scrobble service in Node.js appLast.Fm API - 尝试在 Node.js 应用程序中使用 track.scrobble 服务时参数无效
【发布时间】:2021-08-06 23:30:40
【问题描述】:

我已经完成了 Last.Fm 身份验证过程(如here 所述),结果很好 - 找回了会话密钥和一切。但是,当我尝试向 Last.Fm API 的 track.scrobble 方法发出经过身份验证的 POST 请求时,我一直收到“无效参数 - 您的请求缺少必需参数”的响应(Last.FM API 错误 # 6)。

我很困惑为什么会发生这种情况,因为我几乎肯定我在我的 track.scrobble 调用中包含了所有必需的参数。我在这里做错了什么?

这是我的乱码轨道方法:

  scrobbleTrack(track) {
    const timestamp = Date.now();
    let params = {
        artist: track.artist,
        track: track.title,
        duration: track.duration,
        timestamp: timestamp,
        api_key: this.apiKey,
        method: 'track.scrobble',
        sk: this.sessionKey,
    };
    const apiSig = this._createApiSig(params);
    params.api_sig = apiSig;
    params.format = 'json';
    const body = JSON.stringify(params);
    request.post(this.baseUrl, { //this.baseUrl is "http://ws.audioscrobbler.com/2.0/?format=json"
        headers: {
            'Content-Type': 'application/json'
        },
        body: body
    }, function(err, res) {
        if(err) { return err; }
  });

然后这是我的 _createApiSig 方法:

  _createApiSig(params) {
    let apiSig = '';
    const keys = Object.keys(params).sort();
    for(let key of keys) {
        apiSig += key + params[key];
    }
    apiSig += this.secret;
    return md5(encodeURIComponent(apiSig));
  }

据我所知,我正在为 track.scrobble 提供所有必需的参数(艺术家、曲目、api_key、api_sig、sk、时间戳)。

如需进一步参考,请here is the documentation for the API endpoint I'm trying to access

【问题讨论】:

  • 确保您的参数确实是您认为的第一个参数,并确保您的方法具有您期望的this。这些是我常犯的错误。仅供参考:您可以使用带有 node.js 的 chrome 调试工具来检查这些东西,或者console.log
  • 我的参数设置为我期望的值 - 一旦所有参数都设置好后,对参数执行 console.log 显示所有参数都已正确设置以及我期望它们的值设置为...并检查 _createApiSig 方法,它确实正确地创建了一个按参数名称字符串按字母顺序排列的字符串,因此我认为它也应该是正确的...所以我认为问题不在于没有这些参数设置为我期望的值,除非我忽略了一些非常愚蠢的东西
  • 你能提供一个 params/body 完全生成后的样子吗?
  • @LukasBach 参数如下所示:{ 艺术家:'The Monkees',曲目:'Daydream Believer',持续时间:177,时间戳:1531340440263,api_key:'e0dc0d194eaed6dd63b7732507471214',方法:'track .scrobble', sk: 's6XgdqbLINnQpLQdrxOH6Kn1NDyCDK9r', api_sig: 'b64ee024e19ce8877f937eccf083f90f', format: 'json' } and here is what apiSig looks like prior to encoding: api_keye0dc0d194eaed6dd63b7732507471214artistThe Monkeesduration177methodtrack.scrobblesks6XgdqbLINnQpLQdrxOH6Kn1NDyCDK9rtimestamp1531340440263trackDaydream Believerfe2d007371ae4ef6c2c0d2a3ce9e4bcd
  • Date.now() 返回自纪元以来的时间戳(以毫秒为单位),而 API 需要一个 unix 时间戳(即自纪元以来的 )。尝试将您的 timestamp 除以 1000。

标签: javascript node.js last.fm


【解决方案1】:

任何可能遇到此问题的人,对我有用的是在请求的正文数据中使用 URLsearchparam 对象而不是 JSON.stringify

基本上:

let data = new URLSearchParams(params)
    let myReq = new Request("http://ws.audioscrobbler.com/2.0/", {
        method: "POST",
        body: data
    })

fetch(myReq)

【讨论】:

    猜你喜欢
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-18
    • 1970-01-01
    • 1970-01-01
    • 2018-10-27
    • 2014-08-28
    相关资源
    最近更新 更多