«Подпись недействительна» при получении данных API (VBA-Excel) - PullRequest
1 голос
/ 01 июня 2019

У меня есть проблема, когда я пытаюсь получить некоторые данные в Excel через код VBA. В качестве основы я использовал следующее: https://github.com/BitMEX/api-connectors/tree/master/official-http/vba и это работает, я смог обновить его в соответствии с моими потребностями и разместить заказ (testnet)

Я сейчас пытаюсь получить книгу, но в ответ я всегда получаю «Подпись недействительна». Не могли бы вы помочь понять, что я делаю не так?

Данные, которые я хочу получить, следующие: https://testnet.bitmex.com/api/explorer/#!/OrderBook/OrderBook_getL2

В качестве хэш-функции я использую функцию HexHash, доступную по ссылке, приведенной выше (и она работает для инструкции 'Post', но не может заставить ее работать для инструкции 'GET'.

Заранее спасибо

Ниже рабочий код (функция POST):

Sub placeorder()
Dim Json, httpObject As Object
Dim nonce As Double
Dim verb, apiKey, apiSecret, signature, symbol, price, qty, url, postdata, replytext, nonceStr As String

' Set monotonically (w time) increasing nonce
nonce = DateDiff("s", "1/1/1970", Now)

' Set api key and secret
apiKey = "aaa"
apiSecret = "bbb"

' Build query
symbol = "XBTUSD"
price = 8000
qty = 1

verb = "POST"
url = "/api/v1/order"
postdata = "symbol=" & symbol & "&price=" & price & "&quantity=" & qty

' Stringize nonce
nonceStr = nonce

' Compute signature using hexhash script
signature = HexHash.HexHash(verb + url + nonceStr + postdata, apiSecret, "SHA256")

' Set up HTTP req with headers
Set httpObject = CreateObject("MSXML2.XMLHTTP")
httpObject.Open "POST", "https://testnet.bitmex.com" & url, False
httpObject.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
httpObject.setRequestHeader "api-nonce", nonceStr
httpObject.setRequestHeader "api-key", apiKey
httpObject.setRequestHeader "api-signature", signature
httpObject.Send (postdata)

' Catch response
replytext = httpObject.ResponseText

end sub()

Сильфон нерабочего кода (функция GET):

Sub getorderbook2()
Dim Json, httpObject As Object
Dim nonce As Double
Dim verb, apiKey, apiSecret, signature, symbol, url, getdata, replytext, 
depth As String
Dim nonceStr As String

' Set monotonically (w time) increasing nonce
nonce = DateDiff("s", "1/1/1970", Now)

' Set api key and secret
apiKey = "aaa"
apiSecret = "bbb"

' Build query
symbol = "XBTUSD"
depth = 3

verb = "GET"
url = "/api/v1/orderBook/L2"
getdata = "symbol=" & symbol & "&depth=" & depth

' Stringize nonce
nonceStr = nonce

' Compute signature using hexhash script
signature = HexHash.HexHash(verb + url + nonceStr + getdata, apiSecret, "SHA256")

' Set up HTTP req with headers
Set httpObject = CreateObject("MSXML2.XMLHTTP")
httpObject.Open "GET", "https://testnet.bitmex.com" & url, False
httpObject.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
httpObject.setRequestHeader "api-nonce", nonceStr
httpObject.setRequestHeader "api-key", apiKey
httpObject.setRequestHeader "api-signature", signature
httpObject.Send (getdata)

' Catch response
replytext = httpObject.ResponseText
end sub ()

Во втором разделе я всегда получаю сообщение об ошибке «Подпись недействительна»

1 Ответ

1 голос
/ 02 июня 2019

Переключение между GET и POST требует больше, чем просто изменение глагола в запросе. GET-запрос должен содержать данные как часть строки URL, поэтому попробуйте:

url = url & "?" & getdata
getdata = ""
httpObject.Open "GET", "https://testnet.bitmex.com" & url, False

Вам также нужно изменить эту строку с:

httpObject.Send (getdata)

до:

httpObject.Send

Способ создания значения api-signature также различен для запросов GET к этому API - подробности см. здесь . Предлагаемые изменения должны привести к созданию правильной подписи. Если вам нужно URL-кодировать данные в VBA, тогда этот ответ может помочь.

Другие вопросы:

  • Dim a, b As String эквивалентно Dim a As Variant, b As String. Чтобы объявить несколько строковых переменных, вам нужно написать Dim a As String, b As String
  • CreateObject("MSXML2.XMLHTTP") доступ к более старой версии 3.0 MSXML2. Для доступа к самой последней версии 6.0 вам нужно CreateObject("MSXML2.XMLHTTP.6.0")
...