ewi*_*ard 2 javascript python authentication cryptography cryptojs
我正在尝试使用Bittrex v3 beta API,但我不断收到:
{'code': 'INVALID_SIGNATURE'}
作为回应。
我已经使用 Javascript 和 Python 进行了尝试,因此我包含了这两个脚本 - 如果您发现任何问题,请告诉我。
Python(第一次尝试):
#!/Users/eamonwhite/.pyenv/versions/3.6.3/bin/python3.6
import requests
import time
import hashlib
from pprint import pprint
import json
import hmac
import base64
import codecs
# api-endpoint
url = "https://api.bittrex.com/v3/orders/closed"
api_key = b'yyyyyyyyy'
secret = b'xxxxxxxxx'
api_timestamp = str(int(time.time() * 1000))
print(api_timestamp)
params = {'marketSymbol':'BTC-LOOM','pageSize': 200,'startDate': '2019-09-25T01:10:27.000','endDate': '2019-09-25T01:29:27.000'}
signature = hashlib.sha512(b'').hexdigest()
pre_sign = api_timestamp+url+'GET'+signature
print(pre_sign)
pre_sign_var = pre_sign.encode()
sig = hmac.new(secret, pre_sign_var, hashlib.sha512).hexdigest()
headers = {'Api-Key': api_key, 'Api-Timestamp': api_timestamp, 'Api-Content-Hash': signature, 'Api-Signature': sig}
# sending get request and saving the response as response object
r = requests.get(url = url, params = params, headers = headers)
# extracting data in json format
data = r.json()
pprint(data)
Run Code Online (Sandbox Code Playgroud)
Javascript(第二次尝试 - 直接从 API 文档中提取):
var CryptoJS = require("crypto-js");
const fetch = require('node-fetch');
const url = 'https://api.bittrex.com/v3/orders/closed';
const data = {'marketSymbol':'BTC-LOOM','pageSize': 200,'startDate': '2019-09-25T01:10:27.000','endDate': '2019-09-25T01:29:27.000'};
var content_hash = CryptoJS.SHA512('').toString(CryptoJS.enc.Hex);
var api_timestamp = new Date().getTime();
var pre_sign_string = api_timestamp+url+'GET'+content_hash;
var signature = CryptoJS.HmacSHA512(pre_sign_string, 'xxxxxxsecretxxxxx').toString(CryptoJS.enc.Hex);
const headers = {'Api-Key': 'zzzzz', 'Api-Timestamp': api_timestamp, 'Api-Content-Hash': content_hash, 'Api-Signature': signature, 'Content-Type': 'application/json'};
function obj_to_query(obj, base_url) {
var parts = [];
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
parts.push(encodeURIComponent(key) + '=' + encodeURIComponent(obj[key]));
}
}
return base_url+"?" + parts.join('&');
}
async function getOrders(url = '', data = {}, headers = {}) {
return fetch(url, {
method: 'get',
headers: headers,
})
.then(res => res.json())
.then(json => {
console.log(json)
return json
});
}
var query_string = obj_to_query(data, url)
var r = getOrders(query_string, data, headers);
console.log(r);
Run Code Online (Sandbox Code Playgroud)
我返回的错误涉及Api-Signature标头,所有其他标头都是正确的,否则它们会抛出错误 - 我已经输出了签名之前的字符串,并且它看起来与文档中的完全相同,所以我觉得这一定是 API 的问题,因为它仍处于测试阶段。
如果是这种情况,请告诉我,以便我停止尝试:) 谢谢
小智 5
感谢您分享您的 python 代码。我做了一些更改并让它工作共享我的代码希望它对其他人有帮助:
import requests
import time
import hashlib
from pprint import pprint
import json
import hmac
import base64
import codecs
import urllib.parse
from collections import Counter
def query(method, request, query):
if query != '' and method == 'GET':
url = "https://api.bittrex.com/v3/" + str(request) + str('?') + str(urllib.parse.urlencode(query))
elif method == "DELETE":
url = "https://api.bittrex.com/v3/" + str(request) + str('/') + str(query)
else:
url = "https://api.bittrex.com/v3/" + str(request)
api_key = 'key'
secret = 'secret'
api_timestamp = str(int(time.time() * 1000))
if method == "POST":
payload = json.dumps(query)
else:
payload = ''
contentHash = hashlib.sha512(payload.encode()).hexdigest()
pre_sign = api_timestamp+url+method+contentHash
signature = hmac.new(secret.encode(), pre_sign.encode(), hashlib.sha512).hexdigest()
headers = {'Api-Key': api_key, 'Api-Timestamp': api_timestamp, 'Api-Content-Hash': contentHash, 'Api-Signature': signature, 'Content-Type': 'application/json', 'Accept': 'application/json'}
if method == "POST":
r = requests.post(url = url, data=json.dumps(query), headers = headers)
elif method == "DELETE":
r = requests.delete(url = url, headers = headers)
else:
r = requests.get(url = url, params = payload, headers = headers)
data = r.json()
return data
def getbalance():
return query('GET', 'balances', '')
def getopenorders(market):
return query('GET', 'orders/open', {'marketSymbol': market})
def buylimit(market, quantity, rate):
return query('POST', 'orders', {'marketSymbol': market, 'direction': 'BUY', 'type': 'LIMIT', 'timeInForce': 'GOOD_TIL_CANCELLED', 'quantity': quantity, 'limit': rate})
def selllimit(market, quantity, rate):
return query('POST', 'orders', {'marketSymbol': market, 'direction': 'SELL', 'type': 'LIMIT', 'timeInForce': 'GOOD_TIL_CANCELLED', 'quantity': quantity, 'limit': rate})
def getorderhistory(market):
return query('GET', 'orders/closed', {'marketSymbol': market})
def cancel(uuid):
return query('DELETE', 'orders', uuid)
#print (getbalance())
#print (getopenorders('XRP-USD'))
#print (buylimit('XRP-USD', '60', '0.10000000'))
#print (selllimit('XRP-USD', '100', '0.20000000'))
#print (getorderhistory('XRP-USD'))
#print (cancel('orderid-bla-bla-bla'))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1645 次 |
| 最近记录: |