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 기술 고객 서비스에 문의할 때 오류가 보고되면 항상 요청 메시지를 제공해야 하며, 이는 오류의 원인을 분석하는 데 사용됩니다.

이때 메시지 정보를 볼 수 없다면 어디서부터 문제를 찾아야 할지 알 수 없습니다. 이 글에서는 두 가지 해결책에 대해 논의하겠습니다.

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 (데모 목적으로만 사용되며 실제 KEY는 아닙니다) 이 요청의 서명:h1x6f80rhhkELobJcO1rFyMgUUshOlmgjRBHD+pLvG0= API 키 암호문구:abc123 (데모용) 요청 본문 데이터:{"aaa":"111","bbb":"222"}

이런 방식으로 요청 메시지를 관찰하고 인터페이스 요청에서 오류가 발생한 이유를 분석할 수 있습니다.

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 요청 메시지 전송 솔루션 얻기