使用 VBA 从 XMLHTTP 请求捕获 POST 请求响应和重定向的 URL
Catch the POST Request Response and the Redirected URL from XMLHTTP request with VBA
我正在尝试使用以下代码使用 XMLHTTP 捕获对 POST 请求的响应
Dim XMLPage As New MSXML2.XMLHTTP60
Dim HTMLDoc As New MSHTML.HTMLDocument
Dim htmlEle1 As MSHTML.IHTMLElement
Dim htmlEle2 As MSHTML.IHTMLElement
Dim URL As String
Dim elemValue As String
URL = "https://www.informadb.pt/pt/pesquisa/?search=500004064"
XMLPage.Open "GET", URL, False
XMLPage.send
HTMLDoc.body.innerHTML = XMLPage.responseText
For Each htmlEle1 In HTMLDoc.getElementsByTagName("div")
Debug.Print htmlEle1.className
If htmlEle1.className = "styles__SCFileModuleFooter-e6rbca-1 kUUNkj" Then
elemValue = Trim(htmlEle1.innerText)
If InStr(UCase$(elemValue), "CONSTITU") > 0 Then
'Found Value
Exit For
End If
End If
Next htmlEle1
问题是我找不到类名“styles__SCFileModuleFooter-e6rbca-1 kUUNkj”,因为我注意到当我在 URL 的搜索框中手动插入值 (500004064) 时: https://www.informadb.pt/pt/pesquisa/, the Web Page generates addicinal traffic and turns up at an end point URL : https://www.informadb.pt/pt/pesquisa/empresa/?Duns=453060832,可以在请求响应文本中找到该类名。
我的目标是使用 First URL 检索 Duns 编号“453060832”,以便能够访问 EndPoint URL 的 ResponseText 中的信息。为了捕获 Duns Number,我需要找到一种方法来获取端点 URL,或者尝试获取下面的 POST 请求响应,并使用 JSON 解析器获取该值:
{'TotalResults': 1,
'NumberOfPages': 1,
'Results': [{'Duns': '453060832',
'Vat': '500004064',
'Name': 'A PANIFICADORA CENTRAL EBORENSE, S.A.',
'Address': 'BAIRRO DE NOSSA SENHORA DO CARMO,',
'Locality': 'ÉVORA',
'OfficeType': 'HeadOffice',
'FoundIn': None,
'Score': 231.72766,
'PageUrl': '/pt/pesquisa/empresa/?Duns=453060832'}]}
我无法使用 XMLHTTP 浏览器请求捕获实际发生的情况,这似乎是以下步骤:
-
网页产生额外的流量
额外的流量是 API POST XHR 请求
returns 搜索结果为 JSON。该请求转到
https://www.informadb.pt/Umbraco/Api/Search/Companies 并包括
post body
参数中的 500004064 标识符
基于 API 结果,浏览器在以下 URI 处结束
https://www.informadb.pt/pt/pesquisa/empresa/?Duns=453060832
有人可以帮助我吗,我必须使用 VBA 来完成。
提前致谢。
一个小例子,如何使用 VBA 将数据 POST 传送到您的网站,以及如何使用 bare-bones 字符串处理从结果中提取数据,如我上面的评论所述.
Function GetVatId(dunsNumber As String) As String
With New MSXML2.XMLHTTP60
.open "POST", "https://www.informadb.pt/Umbraco/Api/Search/Companies", False
.setRequestHeader "Content-Type", "application/json"
.send "{""Page"":0,""PageSize"":5,""SearchTerm"":""" & dunsNumber & """,""Filters"":[{""Key"":""districtFilter"",""Name"":""Distrito"",""Values"":[]},{""Key"":""legalFormFilter"",""Name"":""Forma Jurídica"",""Values"":[]}],""Culture"":""pt""}"
If .status = 200 Then
MsgBox "Response: " & .responseText, vbInformation
GetVatId = Mid(.responseText, InStr(.responseText, """Vat"":""") + 7, 9)
Else
MsgBox "Repsonse status " & .status, vbExclamation
End If
End With
End Function
用法:
Dim vatId As String
vatId = GetVatId("453060832") ' => "500004064"
要获得更强大的解决方案,您应该使用 JSON 解析器和序列化器,例如 https://github.com/VBA-tools/VBA-JSON.
我正在尝试使用以下代码使用 XMLHTTP 捕获对 POST 请求的响应
Dim XMLPage As New MSXML2.XMLHTTP60
Dim HTMLDoc As New MSHTML.HTMLDocument
Dim htmlEle1 As MSHTML.IHTMLElement
Dim htmlEle2 As MSHTML.IHTMLElement
Dim URL As String
Dim elemValue As String
URL = "https://www.informadb.pt/pt/pesquisa/?search=500004064"
XMLPage.Open "GET", URL, False
XMLPage.send
HTMLDoc.body.innerHTML = XMLPage.responseText
For Each htmlEle1 In HTMLDoc.getElementsByTagName("div")
Debug.Print htmlEle1.className
If htmlEle1.className = "styles__SCFileModuleFooter-e6rbca-1 kUUNkj" Then
elemValue = Trim(htmlEle1.innerText)
If InStr(UCase$(elemValue), "CONSTITU") > 0 Then
'Found Value
Exit For
End If
End If
Next htmlEle1
问题是我找不到类名“styles__SCFileModuleFooter-e6rbca-1 kUUNkj”,因为我注意到当我在 URL 的搜索框中手动插入值 (500004064) 时: https://www.informadb.pt/pt/pesquisa/, the Web Page generates addicinal traffic and turns up at an end point URL : https://www.informadb.pt/pt/pesquisa/empresa/?Duns=453060832,可以在请求响应文本中找到该类名。
我的目标是使用 First URL 检索 Duns 编号“453060832”,以便能够访问 EndPoint URL 的 ResponseText 中的信息。为了捕获 Duns Number,我需要找到一种方法来获取端点 URL,或者尝试获取下面的 POST 请求响应,并使用 JSON 解析器获取该值:
{'TotalResults': 1,
'NumberOfPages': 1,
'Results': [{'Duns': '453060832',
'Vat': '500004064',
'Name': 'A PANIFICADORA CENTRAL EBORENSE, S.A.',
'Address': 'BAIRRO DE NOSSA SENHORA DO CARMO,',
'Locality': 'ÉVORA',
'OfficeType': 'HeadOffice',
'FoundIn': None,
'Score': 231.72766,
'PageUrl': '/pt/pesquisa/empresa/?Duns=453060832'}]}
我无法使用 XMLHTTP 浏览器请求捕获实际发生的情况,这似乎是以下步骤:
网页产生额外的流量
额外的流量是 API POST XHR 请求 returns 搜索结果为 JSON。该请求转到 https://www.informadb.pt/Umbraco/Api/Search/Companies 并包括 post body
参数中的 500004064 标识符基于 API 结果,浏览器在以下 URI 处结束 https://www.informadb.pt/pt/pesquisa/empresa/?Duns=453060832
有人可以帮助我吗,我必须使用 VBA 来完成。 提前致谢。
一个小例子,如何使用 VBA 将数据 POST 传送到您的网站,以及如何使用 bare-bones 字符串处理从结果中提取数据,如我上面的评论所述.
Function GetVatId(dunsNumber As String) As String
With New MSXML2.XMLHTTP60
.open "POST", "https://www.informadb.pt/Umbraco/Api/Search/Companies", False
.setRequestHeader "Content-Type", "application/json"
.send "{""Page"":0,""PageSize"":5,""SearchTerm"":""" & dunsNumber & """,""Filters"":[{""Key"":""districtFilter"",""Name"":""Distrito"",""Values"":[]},{""Key"":""legalFormFilter"",""Name"":""Forma Jurídica"",""Values"":[]}],""Culture"":""pt""}"
If .status = 200 Then
MsgBox "Response: " & .responseText, vbInformation
GetVatId = Mid(.responseText, InStr(.responseText, """Vat"":""") + 7, 9)
Else
MsgBox "Repsonse status " & .status, vbExclamation
End If
End With
End Function
用法:
Dim vatId As String
vatId = GetVatId("453060832") ' => "500004064"
要获得更强大的解决方案,您应该使用 JSON 解析器和序列化器,例如 https://github.com/VBA-tools/VBA-JSON.