使用R访问Crypto.Com API(从Python翻译)
我保证我已经尽了最大努力,但我就是没能让它发挥作用 以下是API网站上的python代码: 我不确定我是否有任何进展,但以下是我得到的但不起作用的东西——不幸的是,我一辈子都不能说出我错了什么,因为我只收到了一条一般性的错误消息。例如,我可能没有按照他们想要的方式格式化UNIX时间。。任何想法,请帮助使用R访问Crypto.Com API(从Python翻译),python,r,api,hash,Python,R,Api,Hash,我保证我已经尽了最大努力,但我就是没能让它发挥作用 以下是API网站上的python代码: 我不确定我是否有任何进展,但以下是我得到的但不起作用的东西——不幸的是,我一辈子都不能说出我错了什么,因为我只收到了一条一般性的错误消息。例如,我可能没有按照他们想要的方式格式化UNIX时间。。任何想法,请帮助 library(httr) library(digest) API_KEY <- "FOO" SECRET_KEY <- "BAR" b
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()
所以我给了它几个小时,但我只是挠头。我知道我错过了一些简单的东西。有人能帮我把Python方法翻译成R吗?谢谢。好的,我想我找到了答案,为了人类的利益,我想我会发布我的解决方案!完成排序参数 我使用的是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()
API.Balance unix时间在python中以毫秒为单位,在R中以秒为单位。在python和R中设置相同的时间,然后查看从hmac
获得的输出是否相同(请考虑R函数中的serialize
参数)。您没有展示如何在python中执行API调用;看起来您刚刚演示了如何构建请求。正确,我没有编写的Python代码直接来自API。这是挫折的一部分。如果他们提供字符串输出,我可以将我的哈希值与他们的比较。。。这也很奇怪,ID看起来很随意,可以是我喜欢的任何数字吗?因为每个方法都没有定义自己的ID。但这太疯狂了,因为cryptocom怎么知道我选择了什么随机数来比较我发送的散列和他们在服务器上生成的散列?顺便问一下,我如何将r Unix时间转换为毫秒?另一个有趣的观察结果是,我得到了一个SYS错误,而不是一个身份验证错误,如果这是我的哈希错误,你会认为这是一个auth错误吗?我希望R能被更多地采用,因为我发现在统计类型的工作中使用它比使用Python要容易得多
[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"
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()