币安API接口报错:{'code': -1104, 'msg': "Not all sent parameters were not read; read '1' parameter(s) but was sent '6'."}

在创建订单时,报错:{'code': -1104, 'msg': "Not all sent parameters were not read; read '1' parameter(s) but was sent '6'."}

大概意思是说:不是所有的参数都不能读,我们读到了1个,但给了我们6个。 参数不能读?

已确认,get方法可以成功获取余额,说明加密方法和get方法是正确的。现在的问题,就出在配置的参数上。

看一下代码:

params = {
        'symbol': market+'BTC',
        'side': sides,
        'type': 'LIMIT',
        'timeInForce': 'GTC',
        'quantity': volume,
        'price': price,
    }

还有API文档中的说明:
2345截图20171022203905.png

是哪里出错了呢?

测试给7个参数,系统报错:
{'code': -1101, 'msg': "Too many parameters; expected '6' and received '7'."}

太多的参数,我们要6个,你给了我们7个。

就是要6个,也给了6个,为什么说只读到了1个呢?

当把params删减到只有1个参数时,报错变成了:
{'code': -1102, 'msg': "Mandatory parameter 'timestamp' was not sent, was empty/null, or malformed."}
强制的参数为给定?
如果加上timestamp,就至少要7个参数了,那就太多了啊!

试错:在URL中加一个参数‘&timestamp=1’,而没有在params里加。

报错:
{'code': -1101, 'msg': "Too many parameters; expected '6' and received '7'."}

也就是说,params里的参数可能是正确的,但URL的参数只能读取到1个

尝试在URL中删掉其他参数,保留sysbol,增加timestamp和signature,终于有个新的报错了:
timestamp错误。
给正确的timestamp,报sign错误。
好了,我再给你算一下sign

有这样几种可能性:
1、params
2、params+timestamp
3、params+symbol+timestamp
4、symbol+timestamp(经过测试,这种可以通过)

接下来报错:
{'code': -1102, 'msg': "Param 'origClientOrderId' or 'orderId' must be sent, but both were empty/null!"}

origClientOrderId是原来的客户订单号,orderid是订单号,妈蛋,API中根本没提过这两个东西啊!
再说了,我是创建订单,订单号我怎么会知道呢????

这时候就只能胡来了,在params中加入这一项试试,无效,报错依旧,看来应该是在URL中

随便填了个,报错,说是orderid不存在。

难道这是个查询订单接口??
仔细看了一遍,是new order啊

官方的response里是这样的:

{
      "symbol":"LTCBTC",
      "orderId": 1,
      "clientOrderId": "myOrder1" // Will be newClientOrderId
      "transactTime": 1499827319559
    }

这不是返回的里边才有了吗??????

尝试胡乱加入这几个orderid

{'code': -2013, 'msg': 'Order does not exist.'}

废话,当然不存在,因为压根我还没创建!

又看了一遍文档,原来order下面有很多操作,根据参数不同,操作不一样,那么我现在的参数较少,很可能认为是我cancel order或者query order了

那么如何才能让程序知道我是要create order呢?

原来,POST=创建,get=查询,delete=删除。方法不同,操作不同,这思路也是够奇葩的了。

我使用的是get方法,所以他以为我要查询,跟我要ID。

我要换成post方法。

换成post方法后,永远都是一个报错:

{'code': -2015, 'msg': 'Invalid read-key, API-key, and/or IP.'}

尝试了一下获取余额,依旧成功,确认不是IP问题。那就一定是APIKEY的问题了。

APIKEY已经通过headers传递过去了呀,为什么不认呢?在get方法下就行啊。

于是换了一个post方法,问题依旧。

看来不是我的POST有问题,问题出在API-KEY的身上。

尝试在URL中加入apikey传递

错误依旧,这样也不行。

首先确定,API-KEY的传递方式,一定是headers,官方API有写:

2345截图20171022215830.png

再者,数据的发送方式常见的就这两种,POST、GET

连GET方法下都是通过headers传递,那么POST下不是吗?难道POST下用params?

尝试在params中增加'X-MBX-APIKEY':key,无用,报错依旧。

问题的症结就在于:headers没有被成功传递给服务器。

排除对端问题,那么还有什么可能性呢???????

post的方法?换了也一样

字符错误?直接复制了,还这样。

当我删掉params的传递,报错:Mandatory parameter 'symbol' was not sent, was empty/null, or malformed

不过没什么意义,这样就等于get了。

参考:
https://github.com/djask/binancetools/blob/master/binancebuyer.py

一样解决不了,不知道为什么了,
可能是服务器有问题了,明天再试吧。
或者是问题根本不是出在API-KEY上,服务器给了错误的提示?

想到一个测试方法:
自己在WEB服务器端写一个页面,接受python提交的POST数据,看能不能返回APIKEY

经测试,可以正常返回,应该没问题。

最后把问题集中在是不是又是IP地址的问题,我是使用了代理,万一代理不起作用了呢?于是把本地IP地址也加入到白名单里边,就这么OK了!

标签: none

添加新评论