1. 程式人生 > 其它 >獲取託管者傳送http請求報文的解決方案

獲取託管者傳送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請求報文: