微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决网页抓取客户端证书问题 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 举报,一经查实,本站将立刻删除。