【问题标题】:winhttp request only works when fiddler used as a proxywinhttp 请求仅在 fiddler 用作代理时有效
【发布时间】:2020-08-12 21:14:39
【问题描述】:

我以前从未遇到过这种情况。我正在尝试登录一个以下载文档为最终目标的网站。为了下载文档,我需要一个通过 winhttp 获得的安全 cookie。这个网站很复杂,涉及许多 302 重定向,但最后我得到了我的最终 cookie。然而,下载文档的 URL 是由服务器动态创建的,它看起来必须与 cookie 匹配,所以我必须使用 winhttp 获取最后一页并解析我的 URL。我所有的其他请求(其中 12 个)都很好。这是一个 Get 请求,如果我从 Acesss 运行它,我会得到 4000 个字节而不是 17600 个字节。如果我将 fiddler 作为代理运行,那么我可以检查我的请求它是否有效!但只能通过提琴手作为代理。关闭代理并失败。这不是彻底的失败。如果我更改 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 重定向后发送此请求。不幸的是,由于提琴手在我将其置于代理模式时工作,我无法检查差异请求。看着他们,他们似乎是一样的,他们应该因为它“工作”。关闭代理,代码失败,但提琴手没有捕获我的请求,所以我无法比较。我也尝试过不使用 Set 代码行,但我发现我的 cookie 被重复发送?关于我应该看什么的任何想法将不胜感激。谢谢。

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

【问题讨论】:

  • 在请求头中你声称你支持gzipdeflatecompression。您确定 WinHTTPRequest 真的支持解压缩压缩响应吗?在 Fiddler 之间,Fiddler 可能会为您解压缩响应,以便 WinHTTPRequest 可以处理它。
  • 罗伯特,感谢您的回复。我没有想到这一点。当我完成这项工作时,我会将我看到的所有在 fiddler 中捕获的标题都放入并弹出它们。我将在星期一将其删除,看看是否能解决问题。这是我完成整个工作的最后一步,所以我希望!
  • 罗伯特完全正确。在我考虑之后,我无法“打印”我得到的 4K 响应。有道理它对我来说是压缩的。我从这个请求中删除了WinHttpReq.setRequestHeader "Accept-Encoding", "gzip, deflate, br",它运行良好。有趣的注释提琴手确实显示了该请求标头,因此我不能总是在不质疑的情况下使用他们的信息,并且之前的 12 个调用没有遇到这个问题(大多数很小,但一个很大)。

标签: vba fiddler winhttprequest


【解决方案1】:

在您的请求中添加标题

Accept-Encoding: gzip, deflate, br

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

从我读到的关于WINHTTP.WinHTTPRequest.5.1 的内容来看,它不支持压缩响应的自动解压缩。因此,如果您不使用 Fiddler,您会看到压缩响应。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-31
    • 1970-01-01
    • 2014-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多