使用R访问Crypto.Com API(从Python翻译)

2024-09-30 20:34:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我保证我已经尽了最大努力,但我就是没能让它发挥作用

以下是API网站上的python代码: https://exchange-docs.crypto.com/spot/index.html?python#digital-signature

import hmac
import hashlib
import json
import requests
import time

API_KEY = "API_KEY"
SECRET_KEY = "SECRET_KEY"

req = {
  "id": 11,
  "method": "private/get-order-detail",
  "api_key": API_KEY,
  "params": {
    "order_id": "337843775021233500",
  },
  "nonce": int(time.time() * 1000)
};

# First ensure the params are alphabetically sorted by key
paramString = ""

if "params" in req:
  for key in sorted(req['params']):
    paramString += key
    paramString += str(req['params'][key])

sigPayload = req['method'] + str(req['id']) + req['api_key'] + paramString + str(req['nonce'])

req['sig'] = hmac.new(
  bytes(str(SECRET_KEY), 'utf-8'),
  msg=bytes(sigPayload, 'utf-8'),
  digestmod=hashlib.sha256
).hexdigest()

我不确定我是否有任何进展,但以下是我得到的但不起作用的东西——不幸的是,我一辈子都不能说出我错了什么,因为我只收到了一条一般性的错误消息。例如,我可能没有按照他们想要的方式格式化UNIX时间。。任何想法,请帮助

library(httr)

library(digest)

API_KEY <- "FOO"
SECRET_KEY <- "BAR"

base <- "https://api.crypto.com/v2/"

API.Balance <- function() {
  method <- "private/get-account-summary"
  
  hash<-paste0(method,11,API_KEY,"",ceiling(as.numeric(Sys.time())))
  print(hash)
  hash<-hmac(SECRET_KEY,hash,algo="sha256")
  print(hash)
  
  call1 <- paste0(base,method,"?api_key=",API_KEY,"&sig=",hash)
  print(call1)
  get.req <- GET(call1)
  get.req.txt <- content(get.req, "text",encoding = "UTF-8")
  return(fromJSON(get.req.txt, flatten = TRUE))
}

API.Balance()

这将返回:

[1] "private/get-account-summary11FOO5"
[1] "ed19ac611d5342f2cbd93a52c70ce884bbcdb9a4062572b013a494fd2c50fd03"
[1] "https://api.crypto.com/v2/private/get-account-summary?api_key=FOO&sig=ed19ac611d5342f2cbd93a52c70ce884bbcdb9a4062572b013a494fd2c50fd03"
$code
[1] "100001"

$msg
[1] "SYS_ERROR"

所以我给了它几个小时,但我只是挠头。我知道我错过了一些简单的东西。有人能帮我把Python方法翻译成R吗?多谢各位


Tags: keyimportapigetsecrettimehashparams
1条回答
网友
1楼 · 发布于 2024-09-30 20:34:18

好吧,我已经找到了答案,为了人类的利益,我想我会发布我的解决方案!完成排序参数

我使用的是GET而不是POST,我完全忘记了在计算“req”对象(以及其他一些小事情)之后将散列重新注入到“req”对象中。不管怎样,几个小时撕我的头发,所以你不必,你得到这个:

API.Balance <- function() {
  endpoint <- "private/get-account-summary"
  
  req <- list(
    id=11, #This doesn't matter, you define it
    method=endpoint,
    api_key=API_KEY,
    params=list(
      currency="USDT" #leave blank if no params
    ),
    nonce=floor(as.numeric(Sys.time())*1000)
  )
  
  req$params <- req$params[order(names(req$params))]
  
  params<-""
  for(i in 1:length(req$params)) {
    params=paste0(params,names(req$params)[i])
    params=paste0(params,req$params[[i]])
  }

  hash<-paste0(req$method,
               req$id,
               req$api_key,
               params,
               req$nonce)

  hash<-hmac(SECRET_KEY,
             hash,
             algo="sha256")

  req<-c(req,sig=hash)
  
  response <- POST(url=paste0(base,endpoint),
                     body=req,
                     encode="json")
  
  response.txt <- content(response, "text",encoding = "UTF-8")
  return(fromJSON(response.txt, flatten = TRUE))
}

API.Balance()

相关问题 更多 >