avatar of 发明者量化-小小梦 发明者量化-小小梦
フォロー ダイレクトメッセージ
4
フォロー
1271
フォロワー

ホストによるhttpリクエストメッセージの送信のソリューションを取得する

作成日:: 2020-09-23 16:24:42, 更新日:: 2023-09-27 19:37:55
comments   0
hits   1510

ホストによるhttpリクエストメッセージの送信のソリューションを取得する

ホストによるhttpリクエストメッセージの送信のソリューションを取得する

戦略コードをテストおよびデバッグするとき、または実際の取引でロボットを実行するときに、取引所インターフェースによって報告されるエラーに遭遇することがよくあります。このとき、取引所インターフェースAPIドキュメントと関連するエラー情報を照会する必要があります。取引所APIテクニカルカスタマーサービスに相談するときエラーが報告されたときは、エラーの原因を分析するために使用されるリクエスト メッセージを常に提供する必要があります。

この時点で、メッセージ情報が表示されない場合は、どこから問題を見つければよいかわかりません。この記事では、2 つの解決策について説明します。

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()
}

パケット キャプチャ ロボットによって印刷された情報: ホストによるhttpリクエストメッセージの送信のソリューションを取得する

それをコピーしてメッセージを見てみましょう: 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。 検証用のアクセスキー:d487230f-ccccc-aaaaa-bbbbb-268fef99cfe4 (デモンストレーション目的のみ、実際のキーではありません) このリクエストの署名:h1x6f80rhhkELobJcO1rFyMgUUshOlmgjRBHD+pLvG0= API キー パスフレーズ:abc123 (デモンストレーション用) リクエスト本文データ:{"aaa":"111","bbb":"222"}

この方法では、要求メッセージを観察し、インターフェース要求でエラーが発生した理由を分析できます。

2. 現地監視要請

2番目の方法ではロボットを作成する必要はありません。組み込みのNetcat : https://baike.baidu.com/item/Netcat/9952751?fr=aladdin .要求を監視し、メッセージを出力します。

ターミナルで次のコマンドを使用しますnc -l 8080、Netcat を実行します。

図に示すように: ホストによるhttpリクエストメッセージの送信のソリューションを取得する

同様に、ローカル マシンにホストをデプロイし、次のコードを使用してデバッグ ツールで要求を送信します。

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 要求メッセージ: ホストによるhttpリクエストメッセージの送信のソリューションを取得する

端末に表示される GET リクエスト メッセージ: ホストによるhttpリクエストメッセージの送信のソリューションを取得する