【问题标题】:Kraken private API with F# returns EGeneral: invalid arguments带有 F# 的 Kraken 私有 API 返回 EGeneral:无效参数
【发布时间】:2016-04-17 16:48:17
【问题描述】:

我正在尝试使用 F# 访问 Kraken 私有 API。访问公共 API 的代码运行良好,但是当我尝试访问私有 API 时,我总是收到错误“EGeneral:Invalid arguments”。

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

有人看到我做错了吗?

编辑: Kraken.com API 文档可在此处获取:https://www.kraken.com/help/api

我想标题签名不正确。文档要求在 header 中提交以下两个值:

API-Key = API 密钥 API-Sign = 使用 HMAC-SHA512 的消息签名 (URI 路径 + SHA256(nonce + POST 数据))和 base64 解码的秘密 API 关键

编辑 2: 剩下的参数需要用POST方法传输。在我的例子中,这只是 HTTP 请求正文部分中的“nonce”值。

【问题讨论】:

    标签: rest f# http-post f#-data


    【解决方案1】:

    我在为 Kraken 编写 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();
    }
    

    “application/x-www-form-urlencoded” 是关键路径。如果您不发送请求,则会收到“EGeneral:无效参数”错误。有了它,一切正常。至少在我的情况下。

    【讨论】:

      猜你喜欢
      • 2012-08-28
      • 2023-03-12
      • 2012-12-27
      • 1970-01-01
      • 2021-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多