在测试、调试策略代码时、实盘运行机器人时经常有遇到交易所接口报错的情况,此时去查询交易所接口API文档,查询相关报错信息,咨询交易所API技术客服时总是需要提供报错时的请求报文,用来分析报错原因。
这个时候看不到报文信息就无从下手找问题,本篇文章我们一起来探讨两种解决方案。
首先安装scapy
模块
pip3 install scapy
然后创建一个python策略:
from scapy.all import *
def Method_print(packet):
ret = "\n".join(packet.sprintf("{Raw:%Raw.load%}").split(r"\r\n"))
Log(ret)
sniff(
iface='eth0',
prn=Method_print,
lfilter=lambda p: "GET" in str(p) or "POST" in str(p),
filter="tcp")
然后创建一个使用该策略的机器人,该机器人就会抓取所属托管者的服务器发出的http包(https的抓不到对此有一些处理)。
运行起来这个抓包机器人,然后就可以用调试工具发送请求,让机器人抓包了。在调试工具中我们写入发送请求的代码。
function main(){
// 要把基地址设置为其它http协议的地址,如果不设置交易所的地址一般都是https,这样是抓不到包的
exchange.SetBase("http://www.baidu.com")
// POST 请求
exchange.IO("api", "POST", "/api/swap/v3/order", "aaa=111&bbb=222")
// GET 请求
exchange.SetContractType("swap")
exchange.GetTicker()
}
抓包机器人打印的信息:
我们可以复制出来看一下报文: GET请求的报文:
GET
/api/swap/v3/instruments/BTC-USD-SWAP/ticker
HTTP/1.1
Host: www.baidu.com
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36 Accept-Encoding: gzip
Host: www.baidu.com
是我们为了能抓到包改的,可以忽略,正确的应该是Host: www.okex.com
可以看到请求报文中的链接为:/api/swap/v3/instruments/BTC-USD-SWAP/ticker
,是要请求BTC本位的永续合约行情数据。
POST请求报文:
POST
/api/swap/v3/order
HTTP/1.1
Host: www.baidu.com
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36
Content-Length: 25
Content-Type: application/json; charset=UTF-8
Ok-Access-Key: d487230f-ccccc-aaaaa-bbbbb-268fef99cfe4
Ok-Access-Passphrase: abc123
Ok-Access-Sign: h1x6f80rhhkELobJcO1rFyMgUUshOlmgjRBHD+pLvG0=
Ok-Access-Timestamp: 2020-09-23T08:43:49.906Z Accept-Encoding: gzip
{"aaa":"111","bbb":"222"}
可以看到请求路径为:/api/swap/v3/order
。
验证的Access key : d487230f-ccccc-aaaaa-bbbbb-268fef99cfe4
(演示用,并非真KEY)
本次请求的签名:h1x6f80rhhkELobJcO1rFyMgUUshOlmgjRBHD+pLvG0=
API KEY 秘钥Passphrase:abc123
(演示用)
请求的Body数据:{"aaa":"111","bbb":"222"}
。
这样就可以观察请求报文了,分析接口请求遇到报错的原因。
第二种方法,不需要创建机器人,使用苹果电脑Mac自带的Netcat
: https://baike.baidu.com/item/Netcat/9952751?fr=aladdin 。监听请求,并打印报文。
在终端,使用命令nc -l 8080
,运行起来Netcat。
如图:
同样我们在本机部署一个托管者,然后在调试工具中,使用如下代码发送请求。
function main(){
exchange.SetBase("http://127.0.0.1:8080") // 这里把基地址改为本机,端口8080,Netcat 就可以监听到请求了
// POST 请求
exchange.IO("api", "POST", "/api/swap/v3/order", "aaa=111&bbb=222")
// GET 请求
exchange.SetContractType("swap")
exchange.GetTicker()
}
终端上打印出来的POST请求报文:
终端上打印出来的GET请求报文: