There are a couple of similar questions here, but the answers don't seem to go quite far enough to solve my issue. I'm using the code provided by "asmitu" (thank you!) but it's getting a response of "Error:Invalid Token".
Const Url = "https://api2.ghin.com/api/v1/public/login.json?"
Const Link = "https://api2.ghin.com/api/v1/followed_golfers/"
Dim Http As New XMLHTTP60, ghinNum$, lastName$
ghinNum = "valid-ghin-number"
lastName = "valid-password"
With Http
.Open "GET", Url & "ghinNumber=" & ghinNum & "&lastName=" & lastName & "&remember_me=false", False
.setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36"
.setRequestHeader "Referer", "https://www.ghin.com/login"
.send
.Open "GET", Link & ghinNum & ".json", False
.send
End With
MsgBox Http.responseText
This site has some info on the API -
https://app.swaggerhub.com/apis-docs/GHIN/Admin/1.0#/User%20APIs/post_users_login__format_
But I can't figure how to capture a valid token from the first API call above to use to pass to the API for the second call to the API under the same GHIN number and password. If someone has gotten this to work, can you help a brother out, please? Thank you.
I reached out to the USGA GHIN folk and, surprisingly and thankfully, got an answer. Not the answer I wanted but there you go. Basically, they said: "they have a requirement that your software supports 10 clubs or 1,400 golfers." So that lets me out.
Related
I am trying - since days - to get an FEDAuth cookie from my SharePoint Online Server via VBA.
As a guide i use https://allthatjs.com/2012/03/28/remote-authentication-in-sharepoint-online/
From STS i get the response and the BinarySecurityToken.
With this token i build my POST-request to https://yourdomain.sharepoint.com/_forms/default.aspx?wa=wsignin1.0
The response (status 200) is every time an access deny-page without any cookie.
Here ist the VBA-code for this request:
Private Function GetAuthCookies(token, tendant, hostnameServer As String) As String
'implemented here: (->)
'1. Send SAML Request including username, password to Microsoft Online {STS}
'2. recieve Response including security token
'3. -> send secutity Token to SharePoint Online
'4. -> recieve authentication token
'5. send the request including athentication token... thats it!
Dim Request As Object
Dim RequestStr, Cookie As String
Dim DomainURL As String
Set Request = CreateObject("WinHttp.WinHttpRequest.5.1")
DomainURL = "https://" & tendant & ".sharepoint.com/_forms/default.aspx?wa=wsignin1.0"
RequestStr = "t=" & token
Request.Open "POST", DomainURL, False
Request.setRequestHeader "Host", hostnameServer
Request.setRequestHeader "User-Agent", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)"
'Request.setRequestHeader "Content-Type", "text/html; charset=UTF-8"
Request.setRequestHeader "Content-Type", "text/html"
Request.setRequestHeader "Content-Length", CStr(Len(RequestStr))
Request.send (RequestStr)
Debug.Print RequestStr
Debug.Print Request.Status
Debug.Print Len(RequestStr)
If Request.Status = 200 Then
GetAuthCookies = Request.responseText
Debug.Print Request.responseText
'extract cookies tbd after positive response
End If
End Function
The RequestStr looks like:
t=EwDwAk6hBwAU... ...HwYSZL5gNgI=&p=
and hostnameServer looks like:
tendant & ".sharepoint.com"
If i go to my server via browser, i see the same behavior for the root-page (access deny page). But on the subsites e.g /sites/CA-AZ/ i have my access and in my browser i see the FEDAuth-cookie when i examine the website via edge browser.
I think the basic issue is: no access on the root-site - maybe i have to add something to identify my "point of interest" in the POST-request (/sites/CA-AZ/) ?
For the solutions i am resticted to VBA in Excel - company restrictions for my issues.
Thanks for support :-)
I am trying a make an HTTP post request in VBA but getting an empty response.
Here is my code:
Sub User()
On Error Resume Next
Dim HTTPreq As WinHttpRequest
Set HTTPreq = New WinHttpRequest
URL = "https://www.transfermarkt.com/site/DropDownWettbewerbe"
HTTPreq.Open "POST", URL, False
HTTPreq.setRequestHeader "user-agent", "Mozilla/5.0 (Windows NT 6.3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 UBrowser/7.0.185.1002 Safari/537.36"
HTTPreq.send "land_id=189"
MsgBox (HTTPreq.responseText)
End Sub
I have done the same thing in Python and get the expected response:
<pre><option value="">Competition</option><option value="GB1">Premier League</option><option value="GB2">Championship</option><option value="GB3">League One</option><option value="GB4">League Two</option><option value="CNAT">National League</option><option value="GB21">Premier League 2</option><option value="GB18">U18 Premier League</option><option value="GBFL">EFL Trophy</option><option value="FAC">FA Cup</option><option value="CGB">EFL Cup</option><option value="GBCS">Community Shield</option><option value="FAYC">FA Youth Cup</option>.
Not sure where I am wrong doing this in VBA.
You need to specify content-type header, the below code works fine for me:
Sub User()
With CreateObject("WinHttp.WinHttpRequest.5.1")
.Open "POST", "https://www.transfermarkt.com/site/DropDownWettbewerbe", False
.SetRequestHeader "content-type", "application/x-www-form-urlencoded; charset=UTF-8"
.SetRequestHeader "user-agent", "user-agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64)"
.Send "land_id=3"
MsgBox .ResponseText
End With
End Sub
You may find out the necessary headers from a browser developer tools network tab:
I've written a very tiny script in vba using POST request. However, when I run it, I get nothing as result except for a blank message. I've tried to fill in the request parameter accordingly. Perhaps, I can't notice which should be included in the parameter. The page I'm dealing with contains several images in it's right panel. When an image is clicked the request about which i'm talking here is sent to the server and brings back the result and displays new information concerning its' flavor under it. My goal is to parse all the flavors connected to each images. Anyways, I'm trying to attach all the things necessary to find out what i'm missing. Thanks in advance.
This is what I got from chrome developer tools to prepare the POST request:
"https://www.dropbox.com/s/zjn0ahixhu58miq/RequestStatus.txt?dl=0"
Here is what I'm trying with:
Sub PostReq()
Dim http As New XMLHTTP60, html As New HTMLDocument
Dim ArgumentStr As String
ArgumentStr = "opt=flavor&opt1=207&opt2=47&ip=105"
With http
.Open "POST", "https://www.optigura.com/product/ajax/details.php", False
.setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36"
.setRequestHeader "Content-type", "application/x-www-form-urlencoded"
.setRequestHeader "Accept", "application/json, text/javascript, */*; q=0.01"
.send ArgumentStr
html.body.innerHTML = .responseText
End With
MsgBox http.responseText
End Sub
This is the original link to the webpage:
"https://www.optigura.com/uk/product/gold-standard-100-whey/"
Your code sets a request header like so:
.setRequestHeader "Content-type", "application/x-www-form-urlencoded"
so the script is going to expect the argument string to be URL encoded (which it isn't).
Try either encoding the string, or send the request using "GET" instead.
Finally, I've made it. To receive the required response it is necessary to send a GET request first then again send a POST request using the response from that get request. Here is the working one:
Sub httpPost()
Dim http As New XMLHTTP60, html As New HTMLDocument
Dim ArgumentStr As String
ArgumentStr = "opt=flavor&opt1=207&opt2=47&ip=105"
With http
.Open "GET", "https://www.optigura.com/uk/product/gold-standard-100-whey/", False
.send
End With
With http
.Open "POST", "https://www.optigura.com/product/ajax/details.php", False
.setRequestHeader "X-Requested-With", "XMLHttpRequest"
.setRequestHeader "Content-type", "application/x-www-form-urlencoded"
.setRequestHeader "Accept", "application/json, text/javascript, */*; q=0.01"
.send ArgumentStr
html.body.innerHTML = .responseText
End With
MsgBox http.responseText
End Sub
I'm working on a VBA code using xmlHTTP, and I have a problem that I couldn't figure out its reason..
The problem is:
while the loop is running it keeps consuming an increasing amount of memory, so I tried to find the part that causes this issue, and I came up with this part:
For i = 1 To 100
url = "https://www.google.co.in/search?q=" & "hello" & "&rnd=" & WorksheetFunction.RandBetween(1, 10000)
Set XMLHTTP = CreateObject("MSXML2.serverXMLHTTP")
XMLHTTP.Open "GET", url, False
XMLHTTP.setRequestHeader "Content-Type", "text/xml"
XMLHTTP.setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 6.1; rv:25.0) Gecko/20100101 Firefox/25.0"
XMLHTTP.send
Set html = CreateObject("htmlfile")
html.body.innerHTML = XMLHTTP.responsetext
DoEvents
Next i
I tried everything I can think of (tried to set objects to nothing -inside & outside the loop-, and tried to save the excel file from inside the 'for loop') but I couldn't solve the problem.
I tried the following 3 lines and they are NOT fixing anything:
XMLHTTP.abort
Set XMLHTTP = Nothing
Set html = Nothing
Note #1: the problem occurs even when these 11 lines of code are the only code to be executed!
Note #2: The memory won't be freed even after the procedure is completed!
Attached a screenshot of memory usage while the program is running:
Please advise.. thank you
The fix for the issue that Benoit refers to above started rolling out to Office 2016 customers earlier this week. If you don't have the update yet, go to File > Account > Update Options > Update Now.
Anneliese from the Office team
Using google chrome i fill in a form and upon pressing the submit button a spreadhsheet automatically starts downloading. I have identified the POST sent to the server but somehow when i send the same request from my script the response is not a file but the original web form. Please see below the request as shown in Chrome :
Remote Address: ****** -- Request URL:* --
Request Method: POST -- Status Code: 200 OK --**
Request Headers
-Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
-Accept-Encoding:gzip,deflate,sdch
-Accept-Language:en-GB,en-US;q=0.8,en;q=0.6
-Cache-Control:max-age=0
-Connection:keep-alive
-Content-Length:207
-Content-Type:application/x-www-form-urlencoded
-Cookie:JSESSIONID=*******; ssoLang=en
-Host:*******
-Origin:******
-Referer:*******
-User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.114 Safari/537.36
Query String Parameters
Form Data : REQUEST
Response Headers
-Content-Disposition: filename="xxx.xlsx"
-Content-Type:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
-Date:Sat, 31 May 2014 14:28:25 GMT
-Server:Apache-Coyote/1.1
-Transfer-Encoding:chunked
The response headers I am getting are different :
-Cache-Control: no-cache, no-store
-Date: Sat, 31 May 2014 14:55:38 GMT
-Pragma: no-cache Transfer-Encoding: chunked
-Content-Type: text/html;charset=UTF-8 Expires: Thu, 01 Jan 1970 00:00:00 GMT
-Server: Apache-Coyote/1.1
The script i attempted to do the above is below, can anybody please point out what is wrong here ?
Sub Download_File()
Dim localFile As String, URL As String, request As String
localFile = ThisWorkbook.Path & "\test.xlsx"
URL = ****SENSITIVE***
Dim XMLreq As Object
Set XMLreq = CreateObject("MSXML2.XMLHTTP")
request = ****REQUEST*****
Dim fileNum As Integer, bytes() As Byte
With XMLreq
.Open "POST", URL, False
.setRequestHeader "Host", ****SENSITIVE***
.setRequestHeader "Connection", "keep-alive"
.setRequestHeader "Content-Length", "207"
.setRequestHeader "Cache-Control", "max-age=0"
.setRequestHeader "Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"
.setRequestHeader "Origin", ****SENSITIVE***
.setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.114 Safari/537.36"
.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
.setRequestHeader "Referer", ****SENSITIVE***
.setRequestHeader "Accept-Encoding", "gzip,deflate,sdch"
.setRequestHeader "Accept-Language", "en-GB,en-US;q=0.8,en;q=0.6"
.setRequestHeader "Cookie", "JSESSIONID=****SENSITIVE***; ssoLang=en"
.send (Escape(request))
While .readyState <> 4: DoEvents: Wend
If .Status = 200 Then
Debug.Print .getAllResponseHeaders
fileNum = FreeFile
Open localFile For Binary Access Write As #fileNum
bytes = .responseBody
Put #fileNum, , bytes
Close #fileNum
Else
MsgBox "XMLhttp POST error " & .statusText & vbCrLf & "Status = " & .Status & vbCrLf & "URL = " & URL
End If
End With
End Sub
Private Function Escape(ByVal URL As String) As String
Dim i As Integer, BadChars As String
BadChars = "<>%=&!##£$^()+{[}]|\;:'"",/?"
For i = 1 To Len(BadChars)
URL = Replace(URL, Mid(BadChars, i, 1), "%" & Hex(Asc(Mid(BadChars, i, 1))))
Next i
URL = Replace(URL, " ", "+")
Escape = URL
End Function
This is not a complete answer but more like a comment. I do not have enough reputation to leave a comment.
The response looks like you are redirected to the web form when some checks or authentication fails. Did you check the JSESSIONID cookie? That should be different for each time you logon to the server. Once you manually login and then capture the JSESSIONID cookie (either using Fiddler as Alex mentioned) or by typing javascript:alert(document.cookie); in the browser address bar and pressing enter, you might be able to reuse the same session token.
Also check the content length to ensure that the url-encoded content length matches this value. You can use the composer feature in Fiddler to test POST queries to the server to get the request parameters correct.
BTW, Fiddler installation folder can be copied to a USB stick and used as a portable installation. You might try that as well.
Edit: Looking further, the issue seems to be that the site requires a correct Referer header for sending out the excel file. As unsafe headers like Referer cannot be set for XMLHttp request, this might cause server side authentication failure and it might send you the initial landing page which is the web form here. Check this answer here