獲取託管者傳送http請求報文的解決方案
在測試、除錯策略程式碼時、實盤執行機器人時經常有遇到交易所介面報錯的情況,此時去查詢交易所介面API文件,查詢相關報錯資訊,諮詢交易所API技術客服時總是需要提供報錯時的請求報文,用來分析報錯原因。這個時候看不到報文資訊就無從下手找問題,本篇文章我們一起來探討兩種解決方案。
1、使用Python的scapy庫抓包打印出傳送的請求報文
首先安裝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"}
。
這樣就可以觀察請求報文了,分析介面請求遇到報錯的原因。
2、本地監聽請求
第二種方法,不需要建立機器人,使用蘋果電腦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請求報文: