分类 程序猿 下的文章

gatecoin API 报错:{"responseStatus":{"errorCode":"1023","message":"Not logged in"}}

话说这个意思是,没登陆!
API是不需要登录的,这个我很确定,只要key就OK了啊
所以找key的问题,会不会是key或者sign没传递过去?
而且如果通过HBUILDER发送请求过去,返回的居然是404!网页没找到???
通过chrome查看返回的header,里边是401错误,网页没授权,应该是一致的原因。

怀疑可能是api_key设置问题,删除重新设置一个新的

报错变了:
You are not authorized. (你未被授权)

未被授权,那么故障应该出在以下几个地方:
1,APIKEY是否正确
2、PUBLIC_KEY是否成功传递
3、加密方法是否正确

最后终于发现,加密方法的问题,官方文档中,在POST前面多给了一个空格:
2345截图20171025105650.png

对于GET方式获取balance,不需要传递application/json,所以最后的加密字符串是:
gethttps://api.gatecoin.com/balance/balances1508900157.6588507
注意没有任何空格

币安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了!

python3中urllib模块使用笔记

urllib模块属于python Internet模块中比较常用的模块,主要是用于HTTP协议和FTP协议,其他常见的internet模块还有httplib、xmllib、ftplib等很多。是我们做网络爬虫首选工具。在python2中,有两个:urllib和urllib2,到了python3中,两者合并为urllib,并且很多的方法都发生了变化。

1、urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None) # 包装请求内容

参数释义

url:目标网址
data:Post提交的数据,根据官方文档说明,这个参数默认为None,当不为空时,使用POST替代GET方法发送数据给服务器。
headers:参数值应为一个字典,由于许多服务器禁止脚本访问,只支持普通的浏览器访问,所以要通过headers的值来模拟浏览器访问。
origin_req_hos和unverifiable是用于正确处理cookie的,不做深入研究,可参考官方文档:

origin_req_host should be the request-host of the origin transaction, as defined by RFC 2965. It defaults to http.cookiejar.request_host(self). This is the host name or IP address of the original request that was initiated by the user. For example, if the request is for an image in an HTML document, this should be the request-host of the request for the page containing the image.

unverifiable should indicate whether the request is unverifiable, as defined by RFC 2965. It defaults to False. An unverifiable request is one whose URL the user did not have the option to approve. For example, if the request is for an image in an HTML document, and the user had no option to approve the automatic fetching of the image, this should be true.

method是指明请求方法的字段。官方文档:

method should be a string that indicates the HTTP request method that will be used (e.g. 'HEAD'). If provided, its value is stored in the method attribute and is used by get_method(). Subclasses may indicate a default method by setting the method attribute in the class itself.

单独看这个命令的演示没有实际意义,请结合urlopen一起看。

2、urllib.request.urlopen(req) # 获取指定页面,返回bytes类型,需要用decode('utf-8')解码,转换为str类型

from urllib import request
url = 'http://www.lagou.com/zhaopin/Python/?labelWords=label'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) '
                  'Chrome/45.0.2454.85 Safari/537.36 115Browser/6.0.3',
    'Referer': 'http://www.lagou.com/zhaopin/Python/?labelWords=label',
    'Connection': 'keep-alive'
}
req = request.Request(url, headers=headers) # 包装好头部信息
page = request.urlopen(req).read() # 打开url,并使用read方法读取内容
page = page.decode('utf-8') # 将返回的内容(bytes)转换为人类阅读的utf-8格式
print(page) # 打印结果

运行的效果:

2345截图20170626063016.png

3、urllib.parse URL解析组件

该模块的主要作用是将各种URL转换为标准的URL字符串。

包含urlparse和quote两大类。

暂时只说一下我遇到的quote大类中的urlencode。

这个urlencode作用是将请求的数据(一般为字典)转换为ascii格式,这样会避免报错。

from urllib import parse
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) '
                  'Chrome/45.0.2454.85 Safari/537.36 115Browser/6.0.3',
    'Referer': 'http://www.lagou.com/zhaopin/Python/?labelWords=label',
    'Connection': 'keep-alive'
}
h = parse.urlencode(headers)
print(h)

运行结果:

2345截图20170626071501.png

python3中time库使用笔记

python3里很多库的使用都和python2里不同了,所以做了个系列笔记,当工作中碰到了某个库,就记录在这里。

time库主要有用来对时间进行操作。

1、time.time() 获取当前时间戳(1970纪元后经过的浮点秒数)

import time
print(time.time())
输出:
1498428559.7719462

Python基础语法和常用工具笔记

本文记录的是在使用python过程中遇到的基本语法和常用函数、动作

1、global 定义全局变量

相对于局部变量而言,global的作用是,在函数内定义一个全局变量,这样在函数内对该变量的操作,在全局都有意义。为什么不直接在函数外直接进行定义呢?原则上可以,但不建议这么做,因为那样可能导致我们在阅读代码时,不知道某个变量是如何来的,作用是什么。而在函数内,通过global xxx的形式,能方便的知道该变量的来龙去脉。

def func():
    global x  # 定义全局变量x,作用域为全局
    x = 1     # 将x的值设置为1
func()  # 执行一下func,使全局变量生效
print(x) # 打印x的值(注意除了在函数func内,我们未在其他地方定义过x)

执行结果:1

您可以尝试去掉global,将会得到一个报错,说x未被定义:NameError: name 'x' is not defined

2、int(flo) 将浮点转换为整数

flo = 3.14
print(int(flo))

输出:3

实例1:获取时间戳

import time
print(time.time()) # 这里返回的是一个类似1498428421.5438452的浮点型时间戳
print(int(time.time())) # 这里将返回的浮点型数字转换为整数时间戳