• Hallo,

    ich habe mir vorgenommen, eine UDF für die Last.FM -Nutzer zu schreiben, denn leider gibt es noch keine UDF dazu und leider ist die Beschreibung komplett in Englisch und es könnte ja vorkommen bzw wird, das ich viele Sachen nicht ganz verstehen werde. Deswegen dachte ich, dass man sollch eine UDF zusammen schreiben könnte ;) . Wer Lust hat, kann ja hier ab und zu mal mithelfen.

    Also hier erstmal die wichtigsten Links:
    - http://www.lastfm.de/api/desktopauth ;Das sind die Erklärungen für Desktopanwendungen
    - http://www.lastfm.de/api ;Hier sind alle Funktionen aufgelistet


    Ich hab schonmal etwas angefangen:

    Edit: Etwas erweitert:

    Spoiler anzeigen
    [autoit]

    #cs ----------------------------------------------------------------------------

    [/autoit] [autoit][/autoit] [autoit]

    AutoIt Version: 3.3.0.0
    Author: myName

    [/autoit] [autoit][/autoit] [autoit]

    Script Function:
    Template AutoIt script.

    [/autoit] [autoit][/autoit] [autoit]

    #ce ----------------------------------------------------------------------------

    [/autoit] [autoit][/autoit] [autoit]

    ; Script Start - Add your code below here

    [/autoit] [autoit][/autoit] [autoit]

    #include <md5.au3>
    #include <Inet.au3>
    #include <String.au3>
    #include <Array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global Const $API_KEY = "aa72a3b1161d33d0eba36f986fa1fb43"

    [/autoit] [autoit][/autoit] [autoit]

    MsgBox(0, "", _LastFMGetSource("http://ws.audioscrobbler.com/2.0/?method=user.getInfo&api_sig=" & _api_signature() & "&sk=" & _auth_getSession() & "&api_key=" & $API_KEY))

    [/autoit] [autoit][/autoit] [autoit]

    Func _request_authorization()
    Local $GetToken = _auth_getToken()
    If @error Then Return SetError(1, 0, 0)
    Return ShellExecute("http://www.last.fm/api/auth/?api_key=" & $API_KEY & "&token=" & $GetToken)
    EndFunc ;==>_request_authorization

    [/autoit] [autoit][/autoit] [autoit]

    Func _auth_getToken()
    Local $Source = _LastFMGetSource("http://ws.audioscrobbler.com/2.0/?method=auth.gettoken&api_key=" & $API_KEY)
    If StringInStr($Source, "error") Then
    $Source = _StringBetween($Source, ">", "<")
    Return SetError(1, "", $Source[2])
    EndIf
    $Source = _StringBetween($Source, "<token>", "</token>")
    Return $Source[0]
    EndFunc ;==>_auth_getToken

    [/autoit] [autoit][/autoit] [autoit]

    Func _auth_getSession()
    Return _md5("api_key" & $API_KEY & "methodauth.getSessiontoken" & _auth_getToken() & "mysecret")
    EndFunc ;==>_auth_getSession

    [/autoit] [autoit][/autoit] [autoit]

    Func _auth_Token($Username = "Nutzername", $Passwort = "Passwort")
    Return _md5($Username & _md5($Passwort))
    EndFunc ;==>_auth_Token

    [/autoit] [autoit][/autoit] [autoit]

    Func _api_signature()
    Return _md5("api_key" & $API_KEY & "methodauth.getSessiontoken" & _auth_getToken() & "mysecret")
    EndFunc ;==>_api_signature

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _LastFMGetSource($s_URL, $s_Header = '')
    If StringLeft($s_URL, 7) <> 'http://' And StringLeft($s_URL, 8) <> 'https://' Then $s_URL = 'http://' & $s_URL
    Local $h_DLL = DllOpen("wininet.dll")
    Local $ai_IRF, $s_Buf = ''
    Local $ai_IO = DllCall($h_DLL, 'int', 'InternetOpen', 'str', "LastFM Plug-In", 'int', 0, 'int', 0, 'int', 0, 'int', 0)
    If @error Or $ai_IO[0] = 0 Then
    DllClose($h_DLL)
    SetError(1)
    Return ""
    EndIf
    Local $ai_IOU = DllCall($h_DLL, 'int', 'InternetOpenUrl', 'int', $ai_IO[0], 'str', $s_URL, 'str', $s_Header, 'int', StringLen($s_Header), 'int', 0x80000000, 'int', 0)
    If @error Or $ai_IOU[0] = 0 Then
    DllCall($h_DLL, 'int', 'InternetCloseHandle', 'int', $ai_IO[0])
    DllClose($h_DLL)
    SetError(1)
    Return ""
    EndIf
    Local $v_Struct = DllStructCreate('udword')
    DllStructSetData($v_Struct, 1, 1)
    While DllStructGetData($v_Struct, 1) <> 0
    $ai_IRF = DllCall($h_DLL, 'int', 'InternetReadFile', 'int', $ai_IOU[0], 'str', '', 'int', 256, 'ptr', DllStructGetPtr($v_Struct))
    $s_Buf &= StringLeft($ai_IRF[2], DllStructGetData($v_Struct, 1))
    WEnd
    DllCall($h_DLL, 'int', 'InternetCloseHandle', 'int', $ai_IOU[0])
    DllCall($h_DLL, 'int', 'InternetCloseHandle', 'int', $ai_IO[0])
    DllClose($h_DLL)
    Return $s_Buf
    EndFunc ;==>_LastFMGetSource

    [/autoit]

    Ist noch nicht so weit. Hab auch gerade erst angefangen. ;)

  • So da wäre schon die erste Frage ;)
    also ich möchte jetzt gerne UserInfos herausbekommen. Das geht mit diesem Befehl hier:

    [autoit]

    MsgBox(0, "", _LastFMGetSource("http://ws.audioscrobbler.com/2.0/?method=user.getInfo&api_sig=" & _api_signature() & "&sk=" & _auth_getSession() & "&api_key=" & $API_KEY))

    [/autoit]

    Doch bekomme eine Fehlermeldung:

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

    Hier stehen die Infos dazu: http://www.lastfm.de/api/show?service=344
    Unter Params steht folgendes:

    1. api_key (Required) : A Last.fm API key.
    2. api_sig (Required) : A Last.fm method signature. See authentication for more information.
    3. sk (Required) : A session key generated by authenticating a user via the authentication protocol.

    Doch was genau bedeutet der 3. Punkt? Hab ich es falsch angewandt?

    Danke schonmal für die Hilfe ;)

  • Uff...hast dir ja dabei viel Mühe gegeben. Vilen Dank erstmal, dass Du dir dafür Zeit genommen hast :thumbup:

    Hab eine kleine Frage. Wenn ich die Funktion "user.getInfo" nutzen möchte. Was muss ich dabei genau machen? Also
    api_key währe dann das hier: "aa72a3b1161d33d0eba36f986fa1fb43"
    api_sig dann das? ==> _LastFM_Generate_Sig($sAPIcall) ?
    und sk ==> Keine Ahnung :D

    Code
    api_key (Required) : A Last.fm API key.
    api_sig (Required) : A Last.fm method signature. See authentication for more information.
    sk (Required) : A session key generated by authenticating a user via the authentication protocol.

    Was soll denn der Sessionkey sein??

  • Ich denke mal, der key aus: auth.getSession
    Zum Aufruf, das sollte einfach so sein:

    [autoit]

    _LastFM_Call_API("method=user.getInfo&api_key=" & $_gsLastFM_APIkey & "&sk=" & $sSessionKey)

    [/autoit]


    (den api_key vllt. nach _LastFM_Call_API verschieben, der muss ja kedes Mal angehängt werden)

    //Edit: api_sig wird in der Funktion erzeugt und automatisch angehängt ;)

  • Ich hab gerade versucht, die Funktion _LastFM_Auth_getSession() zu erstellen. Ist das richtig sowei?

    [autoit]

    Func
    Local $_gsLastFM_APISig = _md5("api_key" & $_gsLastFM_APIkey & "methodauth.getSessiontoken" & _LastFM_Auth_getToken() & "mysecret")
    Return _LastFM_Call_API("method=auth.getSession&api_key=" & $_gsLastFM_APIkey & "&api_sig=" & $_gsLastFM_APISig)
    ;auth.getSession
    EndFunc ;==>_LastFM_Auth_getSession

    [/autoit][autoit]

    $sSessionKey = _LastFM_Auth_getSession()
    MsgBox(0, "", _LastFM_Call_API("method=user.getInfo&api_key=a563d0da6256f81b9037a3f251fca0a4&sk=" & $sSessionKey))

    [/autoit]

    Ich bekomme statt Infos nur eine Nachricht "Invalid Method signature supplied. Status: Failed".

    Was genau hab ich wieder falsch gemacht? 8|

  • einfach so denke ich, die Signatur wird in _LastFM_Call_API erstellt ;)

    [autoit]

    Func _LastFM_Auth_getSession($token)
    Return _LastFM_Call_API("method=auth.getSession&api_key=" & $_gsLastFM_APIkey&"&token="& $token)
    ;auth.getSession
    EndFunc ;==>_LastFM_Auth_getSession

    [/autoit]
  • Wie kann ich eigentlich Songs ohne Passwort scobbeln? Bei manchen Programmen geht das, ohne einen Passwort eingeben zu müssen.

    Hier mal ein Log aus einem anderen Programm:

    Code
    Username: BENUTZERNAME
    Sessionkey: 2ef9b0ae03fdf8ac4a8b0835bd94da0c
    HandShake Complete:
    SessionID: 760b13d1152c44d781c0e3ffd1cb3b72
    NowPlayingURL: http://post.audioscrobbler.com:80/np_1.2
    SubmissionURL: http://post2.audioscrobbler.com:80/protocol_1.2
    Now Playing Notification: OK. Evergreen Terrace - Chaney Can't Quite Riff Like Helmet's Page Hamilton
    Now Playing Notification: OK. Evergreen Terrace - High Tide Or No Tide
    Submission skipped: Playback too short (min. 50% or 4 minutes).

    http://www.lastfm.de/api/submissions

    Brauche unbedingt dabei eure Hilfe!