2016-04-17 8 views
3

F#を使用してKrakenプライベートAPIにアクセスしようとしています。パブリックAPIにアクセスするコードは正常に動作しますが、プライベートAPIにアクセスしようとすると、常に「EGeneral:Invalid arguments」というエラーが発生します。F#のクラケンプライベートAPIが返すEGeneral:無効な引数

#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 
) 

誰かが間違っているのを誰も見ていませんか?

EDIT: Kraken.com APIドキュメントはこちらawailableです:https://www.kraken.com/help/api

私は、ヘッダの署名が間違っていたとします。

APIキー= APIキーAPI-サイン= のHMAC-SHA512を使用してメッセージの署名(URIパス+ SHA256(ノンス+ POSTデータ)):ドキュメンタリーヘッダで送信される次の2つの値を必要とします 残りのパラメータは、POSTメソッドで送信する必要がありますし、BASE64はEDIT 2

キー

秘密のAPIをデコード。私の場合、これはHTTP要求の本体部分の「ノンス」値だけです。

答えて

3

私はクラーケンのためのC#ライブラリを書いていた間、私は同じエラーを持っていた私は、この問題の解決策を見つけた:

APIキーや記号が間違っているか不足している場合、このエラーが表示されていません。問題は、要求にメディアタイプを追加しないことです。私はそれがF#でどのように機能するかを知っているが、この例を見ていない:

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(); 
} 

"アプリケーション/ x-www-form-urlencodedでは"がクリティカルパスです。それを要求しないと、 "EGeneral:無効な引数" -errorが出ます。それで、すべてうまく動作します。私の場合は少なくとも。