Неверная подпись метода Last.fm (playlist.addTrack)

Я пытаюсь добавить запись «исполнитель - песня» в один из моих плейлистов на last.fm из командной строки.

Я подал заявку на получение ключа API и получил ключ сеанса, как описано в последней Документация по API .fm. Я получил идентификатор плейлиста, используя user.getplaylist ($PLID).

Служба требует, чтобы клиенты отправляли данные в виде запроса POST для методов, которые пишут что-либо. Для этого я решил использовать curl -d

Вот содержимое add_track.sh:

    SERVICE=http://ws.audioscrobbler.com/2.0/
    APIKEY=1dfdc3a278e6bac5c76442532fcd6a05 # mpc-last
    SECRET=<md5hash: api secret>
    LASTFM_USER=<string: myuser> 
    LASTFM_SK=<md5hash: valid session key> 

    # parameters (sorted alphabetically becasue method signature requires them to be)
    # api_key (Required) : A Last.fm API key.
    # api_sig (Required) : A Last.fm method signature. See authentication for more information.
    # artist (Required) : The artist name that corresponds to the track to be added.
    # method playlist.addTrack
    # playlistID (Required) : The ID of the playlist - this is available in user.getPlaylists.
    # sk (Required) : A session key generated by authenticating a user via the authentication protocol. 
    # track (Required) : The track name to add to the playlist.

    METHOD=playlist.addtrack
    ARTIST=prodigy
    TRACK=breathe
    PLID=8698647

    MS="api_key${APIKEY}"                                                                               # api_sig can't be here because it's not produced yet, obviously
    MS="${MS}artist${ARTIST}"                                                                           MS="${MS}method${METHOD}"                                                                           MS="${MS}playlistid${PLID}" # tried with playlistID too
    MS="${MS}track${TRACK}"                
    #MS="${MS}sk${LASTFM_SK}" # including this does not help
    MS="${MS}${SECRET}"

    # hash it
    MS=`echo -n  $MS | md5sum | cut -d' ' -f1`

    # call the service. 
    # args also sorted alphabetically, but this should definitely not matter
    curl \ 
     -d api_key=${APIKEY} \
     -d api_sig=${MS} \
     -d artist=${ARTIST} \
     -d method=${METHOD} \
     -d playlistID=${PLID} \
     -d sk=${LASTFM_SK} \
     -d track=${TRACK}  \
    $SERVICE

Затем я звоню в службу:

$ ./add_track.sh 
<?xml version="1.0" encoding="utf-8"?>
<lfm status="failed">
<error code="13">Invalid method signature supplied</error></lfm>

person Ярослав Рахматуллин    schedule 26.06.2011    source источник


Ответы (1)


Для справки:

curl -v \
    -d    "api_key=`perl -e 'use Encode; printf "%s", encode_utf8($ARGV[0])' ${APIKEY}`"    \   
    -d    "api_sig=`perl -e 'use Encode; printf "%s", encode_utf8($ARGV[0])' ${MS}`"        \
    -d     "artist=`perl -e 'use Encode; printf "%s", encode_utf8($ARGV[0])' ${ARTIST}`"    \
    -d     "method=`perl -e 'use Encode; printf "%s", encode_utf8($ARGV[0])' ${METHOD}`"    \
    -d "playlistID=`perl -e 'use Encode; printf "%s", encode_utf8($ARGV[0])' ${PLID}`"      \
    -d         "sk=`perl -e 'use Encode; printf "%s", encode_utf8($ARGV[0])' ${LASTFM_SK}`" \
    -d      "track=`perl -e 'use Encode; printf "%s", encode_utf8($ARGV[0])' ${TRACK} `"    \
$SE

.... возможно, лучше с самого начала использовать Perl: http://www.easyclasspage.de/lastfm/seite-11.html

person Ярослав Рахматуллин    schedule 27.06.2011