如何在R语言中实现Yobit交易API的认证请求?
在R语言中调用Yobit Trade API的认证实现
没问题,我来给你详细拆解Yobit Trade API的认证规则,以及在R里的具体实现方法,核心就是把签名生成和nonce的逻辑处理好。
核心认证规则
首先得把Yobit的认证要求摸清楚:
- 所有Trade API请求都必须带两个HTTP请求头:
Key:就是你的Yobit API密钥,比如示例里的FAF816D16FFDFBD1D46EEF5D5B10D8A2Sign:用HMAC-SHA512算法生成的数字签名,签名的内容是POST参数拼接成的字符串(格式类似param0=val0¶m1=val1&nonce=1),签名时要用你的API密钥(注意是密钥,不是Key)作为加密密钥
nonce参数是必须项:最小值是1,最大值是2147483646,而且每次请求的nonce必须比上一次的大,绝对不能重复或者递减,否则请求会直接被拒绝
R语言实现步骤
接下来一步步来实现:
- 准备API凭证:先在Yobit后台生成你的
Key和对应的密钥,记住密钥要妥善保管,绝对不能泄露给别人 - 生成合法的nonce:最简单的方式是用当前时间戳的整数部分,要是你在短时间内有多次请求,可以在时间戳基础上加个自增计数器,确保每次都递增
- 构造参数串:把所有请求参数(包括
nonce)拼接成key=value用&连接的字符串 - 生成签名:用R的
openssl包来生成HMAC-SHA512签名 - 设置请求头并发送请求:用
httr包来构造POST请求,带上Key和Sign头,以及参数串
完整代码示例
这里给你一个可直接参考的代码模板:
# 先加载需要的包,如果没装的话先执行install.packages(c("httr", "openssl")) library(httr) library(openssl) # 从环境变量读取API凭证(强烈建议这么做,别直接写在代码里!) api_key <- Sys.getenv("YOBIT_API_KEY") api_secret <- Sys.getenv("YOBIT_API_SECRET") # 生成nonce的函数:用时间戳+自增计数器,避免同一秒内请求重复 nonce_counter <- 0 get_valid_nonce <- function() { nonce_counter <<- nonce_counter + 1 as.integer(Sys.time()) * 1000 + nonce_counter } # 封装Yobit Trade API调用函数 call_yobit_trade <- function(endpoint, params = list()) { # 强制添加nonce参数 params$nonce <- get_valid_nonce() # 把参数按名称排序后拼接成字符串(确保签名生成和请求参数顺序一致) sorted_params <- params[order(names(params))] param_string <- paste0(names(sorted_params), "=", unlist(sorted_params), collapse = "&") # 生成HMAC-SHA512签名 signature <- hmac(api_secret, param_string, algo = "sha512") %>% as.character() # 设置请求头 request_headers <- add_headers( "Key" = api_key, "Sign" = signature ) # 发送POST请求,Yobit Trade API的基础地址是https://yobit.net/tapi/ response <- POST( url = paste0("https://yobit.net/tapi/", endpoint), body = param_string, encode = "form", request_headers ) # 解析并返回响应结果 content(response, "parsed") } # 示例:调用获取账户信息的接口(需要认证) account_details <- call_yobit_trade("getInfo") print(account_details)
注意事项
- 一定要区分
Key和api_secret:Key是放在请求头里的标识,api_secret是用来生成签名的加密密钥,别搞混了 nonce必须严格递增,用时间戳+计数器的方式能避免短时间内请求重复的问题- 参数拼接时最好按名称排序,这样能保证签名生成和请求参数的顺序完全一致,避免因为顺序问题导致签名验证失败
- 绝对不要把API凭证硬编码在代码里,用环境变量读取是最安全的方式
内容的提问来源于stack exchange,提问作者Nikita Bessonov




