使用 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 浏览器请求捕获实际发生的情况,这似乎是以下步骤:

  1. 导航至https://www.informadb.pt/pt/pesquisa/?search=500004064

  2. 网页产生额外的流量

  3. 额外的流量是 API POST XHR 请求 returns 搜索结果为 JSON。该请求转到 https://www.informadb.pt/Umbraco/Api/Search/Companies 并包括 post body

    参数中的 500004064 标识符
  4. 基于 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.