问题描述
我正在尝试使用 python 请求在 Binance 测试网上下订单。它总是抛出 {"code":-2014,"msg":"API-key format invalid."}
。但是当与 curl 一起使用时,相同的 url 会成功返回数据。有人可以指出我的python请求代码有什么问题吗?
API_KEY= <api_key>
SECRET= <password>
import time
import requests
import hashlib
import hmac
def hashing(query_string):
return hmac.new(SECRET.encode('utf-8'),query_string.encode('utf-8'),hashlib.sha256).hexdigest()
base_url = "https://testnet.binance.vision"
api_path = "/api/v3/order"
timestamp = int(time.time()*1000)
msg = "symbol=BNBUSDT&side=BUY&type=LIMIT&quantity=1&timeInForce=GTC&price=200×tamp={}".format(timestamp)
msg_hash = hashing(msg)
url = f"{base_url}{api_path}?{msg}&signature={msg_hash}"
print(url)
headers = {'Content-Type': 'application/json;charset=utf-8','X-MBX-APIKEY': API_KEY}
print("\nusing python-requests")
with requests.Session() as session:
session.headers.update(headers)
resp = session.put(url)
print(resp)
print("\nusing curl")
!curl -H "X-MBX-APIKEY: {API_KEY}" -X POST "{url}"
colab 链接:https://colab.research.google.com/drive/1qPuDK_mGBchpoD4cVbq6oKvt_WY4nX71?usp=sharing
解决方法
所以一些事情。
-
在您的 curl 中,您拥有的唯一标头是
X-MBX-APIKEY
而不是内容类型。所以我会尝试相应地改变它。 -
同样在 curl 中,您正在执行 POST 请求而不是 PUT。我也会改变它。
-
我不确定 curl 是否在编码任何不同的东西。我会以不同的方式传递 url 参数并让请求处理它。
因此,
params = {
'symbol': 'BNBUSDT','side': 'BUY','type': 'LIMIT','quantity': '1','timeInForce': 'GTC','price': '200','timestamp': timestamp,'signature': msg_hash
}
headers = {
'X-MBX-APIKEY': API_KEY
}
r = requests.post(base_url+api_path,params=params,headers=headers)
这是假设你的 curl 工作正常。我在您的 colab 中看到 curl 返回错误。通常还需要在 POST 中传入 data
关键字参数,我会参考 binance api 文档。
注意,要恢复请求的url,可以print(r.url)
,即https://testnet.binance.vision/api/v3/order?symbol=BNBUSDT&side=BUY&type=LIMIT&quantity=1&timeInForce=GTC&price=200×tamp=X&signature=XX