winhttp 请求仅在 fiddler 用作代理时有效

winhttp request only works when fiddler used as a proxy

我以前从未 运行 参与过这个。我正在尝试登录一个以下载文件为最终目标的网站。为了下载文档,我需要一个通过 winhttp 获得的安全 cookie。这个网站很复杂,涉及很多 302 重定向,但最后我得到了我的最终 cookie。然而,用于下载文档的 Url 是由服务器即时创建的,它看起来必须与 cookie 匹配,所以我必须使用 winhttp 获取最后一页并为我的 URL 解析它。我所有的其他要求(其中 12 个)都很好。这是一个 Get 请求,如果我从 Acesss 运行 它得到 4000 个字节而不是 17600 个字节。如果我 运行 fiddler 作为代理所以我可以检查我的请求它有效!但只能通过 fidler 作为代理。关闭代理并失败。这不是彻底的失败。如果我更改 cookie,我会得到 160 个字节,它会告诉我“重新登录”。这个最终请求的基础是:

Set WinHttpReq = CreateObject("WINHTTP.WinHTTPRequest.5.1")
    WinHttpReq.Open "GET", Trim(strRedirectURL), False            'get request
    WinHttpReq.Option(6) = False           'lets 302 codes come back. we then handle
    WinHttpReq.setRequestHeader "Host", "servicing1.foragentsonly.com"
    WinHttpReq.setRequestHeader "Connection", "keep-alive"
    WinHttpReq.setRequestHeader "Upgrade-Insecure-Requests", "1"
    WinHttpReq.setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36"
    WinHttpReq.setRequestHeader "Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9"
    WinHttpReq.setRequestHeader "Sec-Fetch-Site", "same-site"
    WinHttpReq.setRequestHeader "Sec-Fetch-Mode", "navigate"
    WinHttpReq.setRequestHeader "Sec-Fetch-User", "?1"
    WinHttpReq.setRequestHeader "Sec-Fetch-Dest", "document"
    WinHttpReq.setRequestHeader "Referer", "https://www.foraonly.com/managepolicies/policyactivity/processeddateresults/newbusinessprocesseddate/"  
    WinHttpReq.setRequestHeader "Accept-Encoding", "gzip, deflate, br"
    WinHttpReq.setRequestHeader "Accept-Language", "en-US,en;q=0.9"
    WinHttpReq.setRequestHeader "Cookie", strStepTwelveCookie
    WinHttpReq.Send

我在 302 重定向后发送了这个请求。不幸的是,当我将 fiddler 置于代理模式时,它会工作,因此我无法检查差异请求。看着它们,它们看起来是一样的,因为它“有效”,所以它们应该是一样的。关闭代理,代码失败,但提琴手没有捕获我的请求,所以我无法比较。我也尝试过不使用 Set 代码行,但我发现我的 cookie 被重复发送了?任何关于我应该看什么的想法将不胜感激。谢谢。

编辑:当我 运行 这个过程通过 Chrome 开发工具时,我想要的弹出网页,开发工具告诉我它的 4030 字节。所以可能我的 winthhp 请求没有失败。我在这个弹出网页上看到了一些 js 函数,我认为其中之一会加载包含内容的页面。如果我是对的,我不知道如何用 winhttp 模拟这种行为。

在您的请求中添加 header

Accept-Encoding: gzip, deflate, br

这意味着允许服务器发送使用 gzipdeflate(zip) 压缩的回复。

据我了解 WINHTTP.WinHTTPRequest.5.1 它不支持压缩响应的自动解压。因此,如果您不使用 Fiddler,您会看到压缩的响应。

但是当您使用 Fiddler 作为代理时,请求会被 Fiddler 解压缩,然后转发到您的 WINHTTP.WinHTTPRequest.5.1。在这种情况下,您的脚本正在获得由 Fiddler 解压缩的响应 body,它当然更大并且包含您期望的数据。