网页抓取客户端证书问题 WinHttp - excel VBA

问题描述

因此,我正在尝试使用 vba 和 WinHttp 库抓取以下公共站点

https://auctions.seecao.com/DAILY_AUCTION_LIST

在单击“显示数据”按钮时检查了网络流量,我想出了我的代码

Sub test()
Dim border As String
Dim req As New WinHttpRequest
Dim url As String
Dim reqBodyObj As Object,respObj As Object,auction As Object
Dim reqBodyStr As String
Dim deliveryDay As Date
url = "https://auctions.seecao.com/api/DailyAuction/GetDailyAuctionList"
deliveryDay = Date
border = "ALME"
Set reqBodyObj = JsonConverter.ParseJson("{""parameters"":{""dayFrom"":""2021-04-01"",""dayTill"":""2021-04-01"",""auctionState"":[0,3,4,5,6,7,9]}}")
reqBodyObj("parameters")("dayFrom") = Format(deliveryDay + 1,"yyyy-mm-dd")
reqBodyObj("parameters")("dayTill") = Format(deliveryDay + 1,"yyyy-mm-dd")
reqBodyStr = JsonConverter.ConvertToJson(reqBodyObj)

With req
    .Open "POST",url,False
    .setRequestHeader "Content-Type","application/json"
    .Option(WinHttpRequestOption_SslErrorIgnoreFlags) = 256 '=0x0100 =ignore "UnkNown certification authority (CA) or untrusted root" error refer to: https://docs.microsoft.com/en-us/windows/win32/winhttp/winhttprequestoption
    .send reqBodyStr
    Debug.Print .responseText
    Set respObj = JsonConverter.ParseJson(.responseText)
End With

For Each auction In respObj("dailyAuctionListData")("rows")
    If auction("columns")("auctionName") Like border & "*" Then
        Debug.Print auction("columns")("id")
    End If
Next auction
End Sub

可能值得注意的是,当您第一次通过浏览器访问该站点时,您会收到一条警告,指出该服务器的证书不受信任,您必须添加一个例外才能访问它:

enter image description here

为了克服这个问题,我使用这个 .Option(WinHttpRequestOption_SslErrorIgnoreFlags) = 256 来忽略错误

一切正常大约一个月。但是今天我开始收到以下错误

运行时错误“-2147012711 (80072f99)”:没有可用的凭据 在客户端证书中。

所以我想网站开始请求客户端证书?

通过浏览器请求数据可以正常工作,不需要任何凭据,并且在后台发送的 POST 请求似乎与以前相同。通过浏览器的开发者工具编辑和重新发送请求也没有任何问题。

所以我的问题是,这里发生了什么?该站点是否要求提供客户端证书?

如果是这样,Firefox 在后台使用哪个客户端证书?

对于这些情况,浏览器是否使用某种认证书?

为什么我在运行代码时要求提供凭据,而访问页面时显然不需要凭据?

最后,当我尝试像这样指定随机证书时:

.SetClientCertificate "NameOfCertificate"

正在发送请求,我收到以下响应:

<html>
<head><title>400 The SSL certificate error</title></head>
<body>
<center><h1>400 Bad Request</h1></center>
<center>The SSL certificate error</center>
<hr><center>Nginx/1.18.0</center>
</body>
</html>

请记住,这是一个所有人都可以访问的公共网站。无需订阅

编辑

禁用 SSL 证书验证后,同样的请求与 Postman 一起工作正常。有没有办法在 VBA 中模仿这种行为?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)