API Binance获得免费余额

问题描述

我是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"
  ]
}

我只想要自由结余,因此我尝试使用MAP方法,但出现此错误

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个重要事实

  1. AJAX需要时间
  2. 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();

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...