【问题标题】:API Binance GET free BalanceAPI Binance 获取免费余额
【发布时间】:2020-12-02 09:57:00
【问题描述】:

我是 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();

提前感谢大家帮助我。

【问题讨论】:

  • responseText 没有属性 balances

标签: javascript node.js api binance


【解决方案1】:

您是否尝试过使用CCXT 连接到币安 API?

您可以执行以下操作:

;(async () => {
    const binance = ccxt.binance ({'apiKey': 'YOURAPIKEY', 'secret': 'YOURSECRET'})
    const balance = await binance.fetchBalance ()
    const free = balance['free']
    console.log (free)
}) ()

【讨论】:

    【解决方案2】:

    我猜您一定是 AJAX 新手,因为您遗漏了 2 个重要事实

    1. AJAX 需要时间
    2. AJAX 响应始终是字符串

    考虑你的 sn-p

    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',url,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();
    

    【讨论】:

    • 非常感谢,非常感谢。是的,我是 AJAX 的新手,希望能很快熟悉它...
    【解决方案3】:

    我不知道我是否理解您的问题,但我创建了自己的脚本来使用 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 的建议。

    【讨论】:

      【解决方案4】:

      我已经尝试了上面的解决方案,但我遇到了同样的错误。 代码在这里

      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',url,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();
      
      

      【讨论】:

      • var data = JSON.parse(ourRequest.responseText); 之后写console.log(data) 检查你在控制台中得到了什么
      • 我明白错误是什么。出于某种奇怪的原因,我必须将系统时钟与币安服务器时钟同步。感谢您的建议,我理解了这一点,实际上它向我显示了一个同步错误。
      • 啊,我明白了,顺便说一句,你能逐字说明你得到了什么回应(掩盖任何可能值得的东西)?
      • { code: -1021, msg: "此请求的时间戳比服务器时间早 1000 毫秒。" }
      • 太好了,它是 JSON,所以你可以做的是在 JSON.parse 之后添加一个 if else 语句,这样我们就不会运行 map(但显示警报用户以便我们可以调试)当我们没有没有收到我们所期望的。 if(!data.balances){/* alert('error'); */ } else { /* map related code */ }
      猜你喜欢
      • 2021-10-28
      • 2015-11-01
      • 2018-01-20
      • 1970-01-01
      • 2018-08-31
      • 2013-07-29
      • 2018-12-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多