gpt4 book ai didi

Swift:用于 coinpot API 的 HMAC SHA-512

转载 作者:行者123 更新时间:2023-11-30 11:51:45 24 4
gpt4 key购买 nike

我正在尝试连接到有非常劣质文档的coinspot API。链接如下:

https://www.coinspot.com.au/api

它需要附加到用户 key 的 HMAC SHA512 哈希值,然后是 POST 请求参数中的随机数 key ,该随机数 key 是转换为整数的时间戳,以在每个请求中保持唯一。 header 需要 API key 和签名。

我通过coinspot的私有(private)API URL使用Alamofire的JSON编码的post请求https://www.coinspot.com.au/api

似乎我收到了连接成功的消息,但收到了 {status = invalid;} 响应。

我能想到的唯一两件事是错误的 POST 请求(似乎并非如此,就好像我没有在参数中添加随机数键一样,我得到了一个正确的响应,请求从服务器请求一个) )和 HMAC SHA-512 哈希值。我已经从 HMAC SHA512 using CommonCrypto in Swift 3.1

并稍微修改它以仅包含 SHA512 哈希。

代码如下:

extension String{

var sha512:String{
return HMAC.hash(inp: self, algo: HMACAlgo.SHA512)
}
}

public struct HMAC{

static func hash(inp: String, algo: HMACAlgo)->String{
if let stringData = inp.data(using: String.Encoding.utf8, allowLossyConversion: false){
return hexStringFromData(input: digest(input: stringData as NSData, algo: algo))
}
return ""
}

private static func digest(input: NSData, algo: HMACAlgo)-> NSData{
let digestLength = algo.digestLength()
var hash = [UInt8](repeating: 0, count: digestLength)
CC_SHA512(input.bytes, UInt32(input.length), &hash)
return NSData(bytes: hash, length: digestLength)
}

private static func hexStringFromData(input: NSData)-> String{
var bytes = [UInt8](repeating: 0, count: input.length)
input.getBytes(&bytes, length: input.length)
var hexString = ""
for byte in bytes{
hexString += String(format: "%02x", UInt8(byte))
}
return hexString
}
}

enum HMACAlgo{
case SHA512

func digestLength()->Int{
var result:CInt = 0
switch self{
case .SHA512:
result = CC_SHA512_DIGEST_LENGTH
}
return Int(result)
}
}

CommonCrypto 库已正确添加了 ObjectiveC 桥接文件,打印结果为我提供了正确的散列签名。

我已经联系了 coinpot,但他们收到了大量的请求,而且他们只有一个关于其 API 技术支持的 cookie 模板响应。

这是我放置在函数下的 Alamofire 段,用于调用 coinpot 服务器的任何命令:

    func request(_ command: Router, params: [String: AnyObject]?, completion: @escaping (Result<JSON>)-> Void){
var parameters = ["nonce": Int(Date().timeIntervalSince1970*1000) as AnyObject]
if params != nil{
parameters = parameters + params!
}
let sign = customerSecret.sha512
print(sign)
let headers:HTTPHeaders = ["key": APIKey, "sign": sign]
do{
try Alamofire.request( command.asURL(), method: .post, parameters: parameters, encoding: JSONEncoding.default, headers: headers).responseJSON{(response) in
guard let json = response.result.value else {
completion(.failure(CoinSpotError.networkError(error: response.result.error)))
return
}
print(response)
}
} catch {
print("error")
}
}

我认为以上是正确的。路由器只是一组调用正确的 POST 请求来检索数据的地址。

最后,我将请求更改为 GET,去掉了 header 和参数,并且得到了状态 ok 和生成的 JSON。我想我只需在浏览器上尝试一个命令就可以了,

API 确实规定每个请求都必须是 post 方法。

最佳答案

Coinspot API 已关闭,预计到达时间:Coinbase API down

我继续收到我提出的任何请求返回的 {'status': 'invalid'}

他们的 publicapi 仍在运行,尽管仅适用于 BTC、LTC 和 DOGE。

def get_latest_price():
r = requests.get("https://www.coinspot.com.au/pubapi/latest").json()
print(r)

关于Swift:用于 coinpot API 的 HMAC SHA-512,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48271223/

24 4 0
文章推荐: ios - 为什么调用 reloadRows 后在数组中找不到 heightForRowAt 值?
文章推荐: java - 访问具有完全相同名称的类
文章推荐: java - 将视频大小从大千兆字节减少到小千字节
文章推荐: javascript - 为什么 在多次渲染时不显示复选框?