2016-04-17 7 views
3

Ich versuche, mit F # auf die private API von Kraken zuzugreifen. Der Code für den Zugriff auf die öffentliche API läuft einwandfrei, aber wenn ich auf die private API zugreife, erhalte ich immer den Fehler "General: Ungültige Argumente".Kraken private API mit F # gibt EGeneral zurück: ungültige Argumente

#r "FSharp.Data.dll" 

open FSharp.Data 
open System 
open System.Text 
open System.Security.Cryptography 

let baseUri = "https://api.kraken.com" 
let key = MY_KRAKEN_API_KEY 
let secret = MY_KRAKEN_API_SECRET 
let path = "/0/private/Balance" 
let nonce = DateTime.UtcNow.Ticks 
let bodyText = "nonce=" + nonce.ToString() 

let hmac (key : byte []) (data : byte[]) = 
    use hmac = new HMACSHA512(key) 
    hmac.ComputeHash(data) 

let sha256 (data : string) = 
    use sha = SHA256Managed.Create() 
    sha.ComputeHash(Encoding.UTF8.GetBytes(data)) 

let createSignature (nonce : int64) body (path : string) secret = 
    let shaSum = nonce.ToString() + body |> sha256 
    let data = Array.append (Encoding.UTF8.GetBytes path) shaSum 
    let key = Convert.FromBase64String secret 
    hmac key data |> Convert.ToBase64String 

let signature = createSignature nonce bodyText path secret 

let response = Http.RequestString (
    url = baseUri + path, 
    httpMethod = "POST", 
    headers = ([("API-Key", key); ("API-Sign", signature)] |> Seq.ofList), 
    body = TextRequest bodyText 
) 

Sieht jemand, was ich falsch mache?

EDIT: Die Kraken.com API-Dokumentation ist awailable hier: https://www.kraken.com/help/api

Ich nehme an, die Header-Signatur nicht korrekt ist. Die Doku erfordert die folgenden zwei Werte im Header vorgelegt werden:

API-Key = API-Schlüssel API-Sign = Nachricht Signatur HMAC-SHA512 von (URI-Pfad + SHA256 (nonce + POST-Daten)) und Base64 decodierten Geheimschlüssel API

EDIT 2: Die übrigen Parameter müssen mit einer POST-Verfahren übertragen werden. In meinem Fall ist dies nur der "nonce" -Wert im Körperteil der HTTP-Anfrage.

Antwort

3

hatte ich den gleichen Fehler, während ich eine C# -Bibliothek für Kraken schrieb und ich eine Lösung für dieses Problem gefunden:

Dieser Fehler tritt nicht auf, wenn die API-Schlüssel oder das Zeichen falsch sind oder fehlen. Das Problem besteht darin, dass Sie Ihrer Anforderung keinen Medientyp hinzufügen. Ich weiß nicht, wie es in F # funktioniert, aber bei diesem Beispiel aussehen:

using (var client = new HttpClient()) 
{ 
    string address = String.Format("{0}/{1}/public/{2}", _url, _version, method); 
    // Does not work with this: 
    // var content = new StringContent(postData, Encoding.UTF8); 
    var content = new StringContent(postData, Encoding.UTF8, "application/x-www-form-urlencoded"); 

    var response = await client.PostAsync(address, content); 

    return await response.Content.ReadAsStringAsync(); 
} 

Die "application/x-www-form-urlencoded" der kritische Pfad ist. Wenn Sie damit keine Anfrage senden, erhalten Sie den Fehler "EGenal: ungültige Argumente". Damit funktioniert alles gut. Zumindest in meinem Fall.

Verwandte Themen