Passing arguments to Gdax API via VBA HTTP Post - vba

I got a problem in vba while trying to interact with GDAX API.
I get this error: {"message":"Requires product_id"}
I cant pass my product_id in the orders "POST" in WinHttp.WinHttpRequest.5.1 Nothing seems to work:
I tried adding ?product_id=BTC-EUR after the URL as Methodoptions(this works for GET Statements)
i tried adding "product_id=BTC-EUR" after the send
I tried using JsonString = "{""size"": ""0.01"",""price"": ""0.100"",""side"": ""buy"",""product_id"": ""BTC-USD""}" this as postdata
Does anyone know, how to pass those arguments?
This is the code im working with, that works well for all other authenticated statements not passing parameters.
TradeApiSite = "https://api-public.sandbox.gdax.com"
SignMsg = NonceUnique & UCase(HTTPMethod) & "/" & Method & MethodOptions
APIsign = Base64Encode(ComputeHash_C("SHA256", SignMsg, Base64Decode(secretkey), "RAW"))
' Instantiate a WinHttpRequest object and open it
Set objHTTP = CreateObject("WinHttp.WinHttpRequest.5.1")
objHTTP.Open UCase(HTTPMethod), TradeApiSite & "/" & Method & MethodOptions, False
objHTTP.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
objHTTP.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
objHTTP.setRequestHeader "CB-ACCESS-KEY", apikey
objHTTP.setRequestHeader "CB-ACCESS-SIGN", APIsign
objHTTP.setRequestHeader "CB-ACCESS-TIMESTAMP", NonceUnique
objHTTP.setRequestHeader "CB-ACCESS-PASSPHRASE", passphrase
objHTTP.Send '(postdata)

Figured it out after look a bit deeper at how danpaquin/gdax-python does authentication over here https://github.com/danpaquin/gdax-python/blob/master/gdax/gdax_auth.py
You want to send the JSON string as the post data like you described
Content-Type header should be set to application/json
The post data needs to appended to the pre-hash (in your case SignMsg)
Step 2 is important because with out it, GDAX doesn't seem to read your post data - so you get Requires product_id error. If you do step 2 without step 3, you will get invalid signature error

Related

Runtime error while sending Rest request via VBA

I send Rest request to HTTP server via VBA script looking like this:
HTTP.Open "PUT", rUrl, True
HTTP.SetRequestHeader "Host", rHost
HTTP.SetRequestHeader "Authorization", "Bearer " + rToken
HTTP.SetRequestHeader "Content-Length", Len(rBody)
HTTP.send rBody
Everything works fine on Windows 10 (64bit), but I get a runtime error on Windows 7 (64bit) at the line HTTP.send rBody:
Do you know what could cause this error?

Add images via Shopware 6 API / VBA by URL

I try to use the Shopware 6 API to migrate things to a new shop from an existing Access Database using VBA with WinHttp.WinHttpRequest.5.1. Everything works fine except the media transfer.
My approach:
Create a media object in shopware in the right mediafolder
POST /api/v3/media
payload: "{""mediaFolderId"":""" & folderID & """,""id"":""ec90cae2cc84c37b6b7a0cb9fe5c4548""}"
works fine!
Upload the new image (testfile.png) via url
POST /api/v3/_action/media/ec90cae2cc84c37b6b7a0cb9fe5c4548/upload?extension=png&fileName=testfile
payload: "{""url"":"" & MediaUrl & "." & MediaUrlExt & ""}"
response 204 (no error),
A media file is created, but the content of the file is not the PNG image but the payload string.
the VBA code:
Set objHTTP = CreateObject("WinHttp.WinHttpRequest.5.1")
AuthURL = url & "/api/v2/_action/media/" & newMediaID & "/upload?extension=" & FileExtFromUrl(MediaUrl) & "&fileName=" & FileNameFromUrl(MediaUrl) & "&_response=true"
objHTTP.Open "POST", AuthURL, False
objHTTP.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
objHTTP.setRequestHeader "Content-type", "application/json"
objHTTP.setRequestHeader "Accept", "application/json"
objHTTP.setRequestHeader "Authorization", "Bearer " & Token
Debug.Print AuthURL
payload = "{""url"":""https://" & FTPUrl & ftpKategorieOrdner & "/" & MediaUrl & """}"
Debug.Print payload
objHTTP.send (payload)
strResult = objHTTP.responseText
Debug.Print strResult
Debug.Print "uploadMedia " & objHTTP.Status; " - " + objHTTP.StatusText
maybe creating the thumbnail is the problem? dev.log:
[2021-05-18 15:13:22] messenger.INFO: Sending message Shopware\Core\Content\Media\Message\GenerateThumbnailsMessage with Enqueue\MessengerAdapter\QueueInteropTransport {"message":"[object] (Shopware\\Core\\Content\\Media\\Message\\GenerateThumbnailsMessage: {})","class":"Shopware\\Core\\Content\\Media\\Message\\GenerateThumbnailsMessage","sender":"Enqueue\\MessengerAdapter\\QueueInteropTransport"} []
[2021-05-18 15:13:23] php.INFO: User Deprecated: The "Symfony\Component\Debug\DebugClassLoader" class is deprecated since Symfony 4.4, use "Symfony\Component\ErrorHandler\DebugClassLoader" instead. {"exception":"[object] (ErrorException(code: 0): User Deprecated: The \"Symfony\\Component\\Debug\\DebugClassLoader\" class is deprecated since Symfony 4.4, use \"Symfony\\Component\\ErrorHandler\\DebugClassLoader\" instead. at ./vendor/symfony/debug/DebugClassLoader.php:16)"} []
What's wrong?
This should work - the admin panel uses the same endpoint for uploading a image via URL and for uploading the binary data.
The only difference I can spot is the content type of the request.
Unfortunately you did not mention which content type you are setting and I believe that is the problem.
Only if the content type is application/json, the file is fetched from the URL.
Make sure in the 2nd request to set the header
Content-Type: application/json
EDIT As per x-post in https://forum.shopware.com/t/bilder-upload-ueber-api-url/87850/4 it was found that VBA sends
content-type: "application/json; Charset=UTF-8"
So a possible patch for the Shopware core is
124: if (strpos($contentType,'application/json') !== false))

Twilio SMS API call not recognizing mediaurls

My goal is to send a text message in VBA with Twilio's API by using WinHttpRequest and a POST call.
I put together a custom call using the WinHttpRequest for a basic SMS message and that worked. I can send text messages just fine.
But then I tried adding the MediaURL to the data, and it ignored the URL (no image attached to SMS). I confirmed the URL was valid by testing it in the Visual Studio project and it was able to send just fine.
I went back and tried sending a test image on twilio's servers and it works. I copied the same image to a server and it won't work.
WORKS
HTTPReq.send ("Body=Hi Brent, Hello From Me!&From=+1XXXXXXXXXX&To=+1XXXXXXXXX&MediaUrl=https://demo.twilio.com/owl.png")
DOESN'T WORK
HTTPReq.send ("Body=Hi Brent, Hello From ME!&From=+1XXXXXXXXXX&To=+1XXXXXXXXXX&MediaURL=https://smarttanktester.com/wp-content/uploads/2018/10/owl.png")
(Phone numbers removed).
I tested with a few more images from their site and they work.
So it appears that URLs external to their server are being ignored. My guess is that I have something configured wrong from my end.
Here is my code.
TargetURL = "https://api.twilio.com/2010-04-01/Accounts/XXX/Messages"
Set HTTPReq = CreateObject("WinHttp.WinHttpRequest.5.1")
HTTPReq.Open "POST", TargetURL, False
HTTPReq.setRequestHeader "Accept", "application/json"
temp = "Basic " & EncodeBase64
HTTPReq.setRequestHeader "Authorization", temp
HTTPReq.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
HTTPReq.send ("Body=Hi Brent, Hello From Me!&From=+1XXXXXXXXXX&To=+1XXXXXXXXXX&MediaURL=https://smarttanktester.com/wp-content/uploads/2018/10/owl.png")
Any help is greatly appreciated.

WinHTTP Request fails (timeout). Why?

So, I'm trying to send a request to a http server from VBA using the WinHttpRequest class.
I've already made a similar code which sends requests to another server, and it worked. This one won't even go through the ".Send". It fails (timeout).
I've checked every RequestHeader at Google Chrome devtools and tried to replicate the web request, but failed (with and without the cookies).
Any ideas?
The code:
Dim WHTTP As New WinHttp.WinHttpRequest
With WHTTP
.Open "GET", "https://contactcenter-prd.prosodie.com/prweb/sso", False
.SetRequestHeader "Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8"
.SetRequestHeader "Accept-Encoding", "gzip, deflate, br"
.SetRequestHeader "Accept-Language", "pt-BR,pt;q=0.9,en-US;q=0.8,en;q=0.7"
.SetRequestHeader "Connection", "keep-alive"
'.SetRequestHeader "Cookie", "JSESSIONID=337C72E2DBCC1080C674033FFC51EBFA.contactcenter; Pega-RULES=" & Chr(34) & "{atn}e3ByfVkzNDBlc3NYRlBYdWFRT2dkRFRjekU5LytjNm51MEMwazI4YmJqVDNvaFlUTE1LQUN3T1p6SUVYMEd5dlUxaHRSWEVINFpJTWVhY1YKdCtpRkQwZjJLdz09" & Chr(34) & "; BWROUTEID=s2ac70d938fbd5ee39c5b1b93ac33d7b.1"
.SetRequestHeader "Host", "contactcenter-prd.prosodie.com"
.SetRequestHeader "Upgrade-Insecure-Requests", "1"
'.SetRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36" ' From Chrome
.SetRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" ' Some guy said it would work (it didn't)
'.SetTimeouts 1200000, 1200000, 1200000, 1200000
.Send
End With
EDIT:
The purpose of the macro is to enter the website, get some info, put the info into a worksheet and exit the website.
I'm aware that the URL redirects to another, but (I think) I have to go to the first website to get some cookies.
EDIT 2:
Problem solved.
I had to setup a proxy to use the website.
.SetProxy 2, myProxy did the trick!
The problem was solved by using .SetProxy 2, proxy.

Can't replicate successful HTTP Request in VBA; Returns 403 Error when made in VBA, but not cURL

This curl request works and gives a 200 response code when made through the windows command line:
curl -v -u user:pass -X GET https://www.website.com/path
When I try to make the same request in VBA, though, I get a 403 error and the response appears empty. I'm using this code:
Set objHTTP = CreateObject("WinHttp.WinHttpRequest.5.1")
objHTTP.Open "GET", "https://www.website.com/path", False
objHTTP.SetCredentials "user", "pass", 0
objHTTP.Send
I've made sure the reference to the WinHttpRequest 5.1 library was set via Tools>>References, but I'm no great shakes at VBA and don't know what else I might be doing wrong to recreate the successful curl request in VBA. C# WebRequest but not cURL Gives Error 403 seems to have a similar problem, but the answerer says curl also gives a 403, which isn't the case for me - and in any event, there doesn't seem to be a version of HttpClient for VBA, at least according to the documentation and this other question: VBA using HttpClient to connect to an external REST API.
I use an alternative in Access without any issues.
Dim WinHttp_ As Object
Set WinHttp_ = CreateObject("MSXML2.XMLHTTP")
WinHttp_.Open "GET", <url>, False, <user>, <password>
WinHttp_.Send
If WinHttp_.Status = 200 Then
'do whatever you need through WinHttp_.ResponseBody or WinHttp_.responseText
End If
Set WinHttp_ = Nothing
You may need to check the WinHttp_.ReadyState before checking the WinHttp_.Status.
https://msdn.microsoft.com/en-us/library/hh772834(v=vs.85).aspx
I was able to resolve my issue by switching to MSXML2 and encoding the authorization header in base 64. Not sure why this was necessary, but I'm leaving this here in case some other poor lost soul ends up with the same problem.
Set objHTTP = CreateObject("MSXML2.ServerXMLHTTP")
With objHTTP
.Open "GET", URL, False
.setRequestHeader "Authorization", "Basic " + Base64Encode("user:pass")
.setRequestHeader "Content-Type", "application/json"
.Send Body
End With