3

私はしばらくこれを試してきましたが、何が問題なのか理解できません。たぶん、私はあまりにも多くの方法を試したので、このコードが正しいかどうかさえ確信が持てません。

track.scrobble基本的に、Last.fm API のメソッドを使用して、トラックのバッチを送信しようとしています。

それが私が持っているコードで、常に返されInvalid method signatureます。ここで誰か助けてくれませんか?

アップデート

mccannf の回答に基づいて、コードを変更しましたが、まだエラーが発生しています:

var apiUrl = "http://ws.audioscrobbler.com/2.0/";
var apiMethod = "track.scrobble";
var apiKey = "MY_API_KEY";
var apiSecret = "MY_API_SECRET";
var key = "MY_SESSION_KEY";
var apiSig = "";

var lastfmScrobble = function (data) {
    var dataToScrobble = setTiming(data);

    var albums = [];
    var artists = [];;
    var timestamps = [];
    var tracks = [];
    var dataToHash = "";

    for (var i = 0; i < dataToScrobble.tracks.length; i++) {
        albums["album["+ i.toString() + "]"] = dataToScrobble.album;        
        artists["artist[" + i.toString() + "]"] = dataToScrobble.artist;
        timestamps["timestamp[" + i.toString() + "]"] = dataToScrobble.tracks[i].split("|")[1];
        tracks["track[" + i.toString() + "]"] = dataToScrobble.tracks[i].split("|")[0];     
    }

    dataToHash += albums.sort().join("");
    dataToHash += "api_key" + apiKey;   
    dataToHash += artists.sort().join("");  
    dataToHash += "method" + apiMethod;
    dataToHash += "sk" + key;   
    dataToHash += timestamps.sort().join("");       
    dataToHash += tracks.sort().join("");
    dataToHash += apiSecret;

    apiSig = $.md5(unescape(encodeURIComponent(dataToHash)));

    var songsToScrobble = {};

    $.extend(songsToScrobble, 
        albums.sort(), 
        { api_key: apiKey }, 
        { api_sig: apiSig }, 
        artists.sort(), 
        { method: apiMethod }, 
        { sk: key }, 
        timestamps.sort(), 
        tracks.sort());

    $.ajax({
        url: apiUrl,
        type: "POST",
        data: songsToScrobble,
        success: function (data) { 
            console.log(data);
        }
    });
}

送信されたオブジェクトは正しい形式 (JSON) になりました。まだ何が間違っている可能性がありますか?

4

1 に答える 1

0

コードの簡単なサンプルJS Fiddle を作成しました。

は次のdataToHashようになります。

 album[0]Achtung Babyalbum[1]Achtung Babyapi_keyxxxBLAHxxxartist[0]U2artist[1]U2methodtrack.scrobbleskkkkFOOkkktimestamp[0]1379368800timestamp[1]1379369000track[0]Onetrack[1]The FlymmmySecrettt 

上記songsToScrobbleのコードの変数は次のようになります。

 { "album": [ 
              "album[0]Achtung Baby",
              "album[1]Achtung Baby"
            ], 
   "api_key":"xxxBLAHxxx",
   "api_sig":"8dbc147e533411a41ba9169f59e65b3a",
   "artist":["artist[0]U2","artist[1]U2"],          
   "method": "track.scrobble", 
   "sk":"kkkFOOkkk" 
   "timestamp": [
                  "timestamp[0]1379368800",
                  "timestamp[1]1379369000"
                ],
   "track": [ 
              "track[0]One",
              "track[1]The Fly"
            ]
  } 

私はこのように見えるべきだと信じています: songsToScrobble

 { "album[0]": "Achtung Baby",
   "album[1]": "Achtung Baby",
   "api_key":"xxxBLAHxxx",
   "api_sig":"8dbc147e533411a41ba9169f59e65b3a",
   "artist[0]": "U2",
   "artist[1]": "U2",          
   "method": "track.scrobble", 
   "sk":"kkkFOOkkk" 
   "timestamp[0]": "1379368800",
   "timestamp[1]": "1379369000",
   "track[0]": "One",
   "track[1]": "The Fly"
  } 

MD5 ハッシュに変換する前に、dataToHash が UTF-8 でエンコードされていることを確認してください。

編集

これが、ajax 呼び出し用のデータを作成した方法です。注: これはテストされていません - 私は last.fm アカウントを持っていません。

var songsToScrobble = {};

function addDataToScrobble(parentElement, inputData) {
    if ($.isArray(inputData)) {
      $.each(inputData, function(index ,element) {
         songsToScrobble[parentElement + "[" + index + "]"] = element;
         dataToHash += parentElement + "[" + index + "]" + element;
      });
    } else {
      songsToScrobble[parentElement] = inputData;
      dataToHash += parentElement + inputData;
    }
}

for (var i = 0; i < data.tracks.length; i++) {
     albums.push(data.album);
     artists.push(data.artist);
     // The tracks are coming in the format: title|timestamp
     timestamps.push(data.tracks[i].split("|")[1]);
     tracks.push(data.tracks[i].split("|")[0]);     
}

addDataToScrobble("album", albums);
addDataToScrobble("api_key", apiKey);
addDataToScrobble("artist", artists);
addDataToScrobble("method", apiMethod);
addDataToScrobble("sk", key);
addDataToScrobble("timestamp", timestamps);
addDataToScrobble("track", tracks);

apiSig = $.md5(unescape(encodeURIComponent(dataToHash+apiSecret)));

songsToScrobble["api_sig"] = apiSig;

$.ajax({
    url: apiUrl,
    type: "POST",
    data: songsToScrobble,
    success: function (data) { 
        console.log(data);
    }
});
于 2013-09-16T22:30:25.047 に答える