使用LastFM API调用track.scrobble时遇协议版本错误求助
问题:LastFM track.scrobble 接口返回协议版本错误
已完成LastFM认证及GET请求,但调用track.scrobble接口时,请求返回状态码200,却收到错误提示:FAILED Incorrect protocol version (missing clientID/version/username)
初始请求配置
- URL:
http://ws.audioscrobbler.com/2.0/?method=track.scrobble&api_key={YOUR_API_KEY}&sk={SESSION_KEY}&api_sig{API_SIGNATURE}&user={USERNAME} - Headers:
Content-Type: application/x-www-form-urlencoded - Body:
"artist=Kanye+West×tamp={TIMESTAMP}&track=Heartless"
实际请求代码(Godot 3.5.1)
var body = "method=track.scrobble&api_key={YOUR_API_KEY}&sk={SESSION_KEY}&api_sig{API_SIGNATURE}&artist=Daniel+Caesar×tamp={TIMESTAMP}&track=Pseudo".format( { "YOUR_API_KEY" : APIKey, "SESSION_KEY" : session_key, "TIMESTAMP" : str(OS.get_unix_time() - 31), "API_SIGNATURE" : ConstructMD5Hash() } ) HTTP.request( url, headers, true, HTTPClient.METHOD_POST, body ) HTTP.connect("request_completed",self,"replace_tag")
API签名构造代码
func ConstructMD5Hash() -> String: return LastFM_MD5_Hash_Template.format( { "YOUR_API_KEY" : APIKey, "REQUEST_TOKEN" : request_token, "MY_SECRET" : APISecret, } ).md5_text()
完整响应
[Server: openresty/1.13.6.2, Date: Mon, 30 Jan 2023 17:10:21 GMT, Content-Type: text/plain; charset=utf-8, Transfer-Encoding: chunked, Access-Control-Allow-Methods: POST, GET, OPTIONS, Access-Control-Allow-Origin: *, Access-Control-Max-Age: 86400, Via: 1.1 google]
FAILED Incorrect protocol version (missing clientID/version/username)
问题排查与解决建议
修正API签名构造逻辑
- LastFM的API签名必须包含所有POST参数(除api_sig本身),拼接API密钥后做MD5哈希。当前签名仅用了
api_key、request_token和secret,遗漏了scrobble请求的核心参数(method、sk、artist、track、timestamp),导致签名无效触发错误。 - 正确步骤:
- 收集所有请求参数:
method=track.scrobble、api_key=xxx、sk=xxx、artist=xxx、track=xxx、timestamp=xxx、api_version=1.2.1、client=自定义客户端ID - 按参数名字典序排序
- 拼接成无分隔符的字符串(如
artistDanielCaesarapi_keyxxx...) - 末尾追加API Secret,整体做MD5哈希得到
api_sig
- 收集所有请求参数:
- LastFM的API签名必须包含所有POST参数(除api_sig本身),拼接API密钥后做MD5哈希。当前签名仅用了
修复参数传递方式
- POST请求参数需全部放在Body中,URL仅保留基础地址
http://ws.audioscrobbler.com/2.0/即可,避免URL与Body重复传参。 - 注意URL中
api_sig{API_SIGNATURE}缺少等号,正确格式为api_sig={API_SIGNATURE},但建议将该参数移至Body。
- POST请求参数需全部放在Body中,URL仅保留基础地址
补充客户端版本参数
- 按错误提示,需添加
api_version(如1.2.1)和client(自定义客户端标识,如mygodotscrobbler1.0)参数,且这两个参数也要纳入签名构造。
- 按错误提示,需添加
验证时间戳合法性
- 确保
timestamp为秒级Unix时间戳,与当前时间差不超过180秒,当前OS.get_unix_time() -31符合要求,需确认格式为纯整数无多余字符。
- 确保
内容的提问来源于stack exchange,提问作者LyffLyff
相关产品推荐
相关产品推荐

