我正在尝试连接到coinpot API,它有非常伪劣的文档。链接如下:
https://www.coinspot.com.au/api
它需要HMAC SHA512哈希附加到用户的密钥,然后是随机数密钥在POST请求的参数中,时间戳变为整数,以便在每个请求时保持唯一。标头需要API密钥和签名。
我通过coinpot的私有API网址https://www.coinspot.com.au/api
使用Alamofire的JSON编码发布请求似乎我收到了成功的连接消息,但获得了{status = invalid;}响应。
我能想到的唯一两件事就是错误的POST请求(看起来似乎并非如此,好像我没有在参数中添加nonce键,我得到了正确的响应请求一个来自服务器)和HMAC SHA-512哈希。我已经从中获取了代码 HMAC SHA512 using CommonCrypto in Swift 3.1
稍微修改它以包含SHA512散列。
以下代码:
}}
CommonCrypto库已正确添加了objectiveC桥接文件,打印结果为我提供了正确的散列签名。
我已经联系了coinpot,但是他们满足了请求,并且他们只对API的任何技术支持提供了Cookie模板响应。
这是我在一个函数下放置的Alamofire段,以便向coinpot服务器调用任何命令:
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)
}
}
我认为以上是正确的。路由器只是一组地址,它们调用正确的POST请求来检索数据。
最后,我已将请求更改为GET,删除了标头和参数,并且我获得了状态正常和生成的JSON。我想我只是在浏览器上尝试一个命令就可以了,
API确实说每个请求都必须是post方法。
答案 0 :(得分:0)
Coinspot API已关闭,没有ETA:Coinbase API down
我继续从我提出的任何请求中收到{'status': 'invalid'}
。
def get_latest_price():
r = requests.get("https://www.coinspot.com.au/pubapi/latest").json()
print(r)