问题描述
我是API的新手,非常感谢您的建议。 我想回想Binance API“ GET / api / v3 / account(HMAC SHA256)”,以仅获取我帐户中可用的免费资产。
我得到的代码的响应是这样的:
{
"makerCommission": 15,"takerCommission": 15,"buyerCommission": 0,"sellerCommission": 0,"canTrade": true,"canWithdraw": true,"canDeposit": true,"updateTime": 123456789,"accountType": "SPOT","balances": [
{
"asset": "BTC","free": "4723846.89208129","locked": "0.00000000"
},{
"asset": "LTC","free": "4763368.68006011","locked": "0.00000000"
}
],"permissions": [
"SPOT"
]
}
Cannot read property 'map' of undefined at Object.<anonymous><C:\Users\etc..
at Module._compile (internal/module/cjs/loader.js1137:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1157:10)
at Function.Module._load (internal/modules/cjs/loader.js:878:14)
at Function.executeEntryPoint [as runMain] (internal/modules/run_main.js:71:12)
at internal/run_main_module.js:17:47
遵循我的代码:
const crypto = require('crypto');
var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
var burl = "https://api.binance.com";
var endPoint = "/api/v3/account";
var dataQueryString = "timestamp=" + Date.Now();
var keys = {
"APIkey" :'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',"SECRETkey" : 'BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB'
}
var signature = crypto.createHmac('sha256',keys['SECRETkey']).update(dataQueryString).digest('hex');
var url = burl + endPoint + '?' + dataQueryString + '&signature=' + signature;
var ourRequest = new XMLHttpRequest();
ourRequest.open('GET',url,true);
ourRequest.setRequestHeader('X-MBX-APIKEY',keys['APIkey']);
let arrayCleaned = ourRequest.responseText.balances.map(ele => {
return {
"asset" : ele.asset,"free" : ele.free
}
})
console.log(arrayCleaned);
ourRequest.send();
在此先感谢大家的帮助。
解决方法
我猜您必须是AJAX的新手,因为您缺少2个重要事实
- AJAX需要时间
- AJAX响应始终是字符串
考虑您的代码段
var ourRequest = new XMLHttpRequest();
ourRequest.open('GET',url,true);
// ^---- doesn't actually send any request https://stackoverflow.com/q/29362977/6160662
ourRequest.setRequestHeader('X-MBX-APIKEY',keys['APIkey']);
let arrayCleaned = ourRequest.responseText.balances.map(ele => { //Line 4
return {
"asset" : ele.asset,"free" : ele.free
}
})
console.log(arrayCleaned);
ourRequest.send(); //Line 11
如您所见,您正在第11行发送ajax请求,但是您试图在第4行处理(预期)数据!因此出现错误Cannot read property 'map' of undefined at Object
接下来的事情是ourRequest.responseText
是将服务器响应保存在 string 中的属性,它没有任何map属性。因此,您需要使用JSON.parse()
所以这应该很好
var ourRequest = new XMLHttpRequest();
ourRequest.open('GET',true);
ourRequest.setRequestHeader('X-MBX-APIKEY',keys['APIkey']);
var arrayCleaned = [];
ourRequest.onload = function () {
// Convert data string to an object
var data = JSON.parse(ourRequest.responseText); // string -->to Object
arrayCleaned = data.balances.map(ele => {
return {
"asset" : ele.asset,"free" : ele.free
}
})
console.log(arrayCleaned);
};
ourRequest.send();
,
您是否尝试过使用CCXT连接到币安API?
您可以执行以下操作:
;(async () => {
const binance = ccxt.binance ({'apiKey': 'YOURAPIKEY','secret': 'YOURSECRET'})
const balance = await binance.fetchBalance ()
const free = balance['free']
console.log (free)
}) ()
,
我不知道我是否理解您的问题,但我创建了自己的脚本来使用 python 跟踪我的投资组合。 这可能会有所帮助:
from binance.client import Client
def editar_df_binance(lista):
df = pd.DataFrame(lista)
df["free"] = df["free"].astype(float) #Convertimos las columnas a valores float
df["locked"] = df["locked"].astype(float) #Convertimos las columnas a valores float
filtro1 = df["free"] > 0
filtro2 = df["locked"] > 0
df = df[filtro1 | filtro2]
df["Fecha"] = hoy
df = df.rename(columns={"asset": "Moneda","free": "Saldo","locked": "Bloqueado"}).sort_values(by="Saldo",ascending=False) #Renombramos y ordenamos
df["Moneda"] = df["Moneda"].apply(editar_moneda_binance) #Vamos a corregir el nombre de las monedas de earn que aparecen con "LD"
df = df[["Fecha","Moneda","Saldo","Bloqueado"]]
return df
def editar_moneda_binance(moneda):
if moneda.startswith("LD"):
return moneda.replace("LD","")
return moneda
if __name__ == '__main__':
###############Balance Binance################### (Falta la parte de earn)
api_key = os.environ.get('binance_api')
api_secret = os.environ.get('binance_secret')
client = Client(api_key,api_secret)
diccionario = client.get_account()["balances"] #Obtener valores de balance
df_binance = editar_df_binance(diccionario)
然后我用数据框创建一个excel文件。 请注意不显示 Binance Earn。
,我已经尝试了上面的解决方案,但是遇到了同样的错误。 这里的代码
const crypto = require('crypto');
var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
var burl = "https://api.binance.com";
var endPoint = "/api/v3/account";
var dataQueryString = "timestamp=" + Date.now();
var keys = {
"APIkey" :'AAAAAAAAAAA',"SECRETkey" : 'BBBBBBBBBBB'
}
var signature = crypto.createHmac('sha256',keys['SECRETkey']).update(dataQueryString).digest('hex');
var url = burl + endPoint + '?' + dataQueryString + '&signature=' + signature;
var ourRequest = new XMLHttpRequest();
ourRequest.open('GET',true);
ourRequest.setRequestHeader('X-MBX-APIKEY',keys['APIkey']);
var arrayCleaned = [];
ourRequest.onload = function(){
//Convert data string string to an object
var data = JSON.parse(ourRequest.responseText); // string --> to Object
arrayCleaned = data.balances.map(ele => {
return {
"asset" : ele.asset,"free" : ele.free
}
})
console.log(arrayCleaned);
};
ourRequest.send();