You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

VBA中WinHTTP请求超时失败的原因及解决方法

VBA WinHttpRequest 请求超时的解决方案

问题背景

我在使用VBA的WinHttpRequest类向目标HTTP服务器发送GET请求时,遇到了请求还没执行到.Send步骤就直接超时失败的问题。之前用类似的代码对接其他服务器完全正常,这次我已经通过Chrome开发者工具核对了所有请求头,甚至尝试直接复制浏览器的请求(带/不带Cookie)都没有效果。

我的目标是通过这个宏登录网站获取信息并写入Excel工作表,已知目标URL会有跳转,但需要先访问原站点获取Cookie。

我的测试代码

Dim WHTTP As New WinHttp.WinHttpRequest
With WHTTP
    .Open "GET", "https://contactcenter-prd.prosodie.com/prweb/sso", False
    .SetRequestHeader "Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8"
    .SetRequestHeader "Accept-Encoding", "gzip, deflate, br"
    .SetRequestHeader "Accept-Language", "pt-BR,pt;q=0.9,en-US;q=0.8,en;q=0.7"
    .SetRequestHeader "Connection", "keep-alive"
    '.SetRequestHeader "Cookie", "JSESSIONID=337C72E2DBCC1080C674033FFC51EBFA.contactcenter; Pega-RULES=" & Chr(34) & "{atn}e3ByfVkzNDBlc3NYRlBYdWFRT2dkRFRjekU5LytjNm51MEMwazI4YmJqVDNvaFlUTE1LQUN3T1p6SUVYMEd5dlUxaHRSWEVINFpJTWVhY1YKdCtpRkQwZjJLdz09" & Chr(34) & "; BWROUTEID=s2ac70d938fbd5ee39c5b1b93ac33d7b.1"
    .SetRequestHeader "Host", "contactcenter-prd.prosodie.com"
    .SetRequestHeader "Upgrade-Insecure-Requests", "1"
    '.SetRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36" ' From Chrome
    .SetRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" ' Some guy said it would work (it didn't)
    '.SetTimeouts 1200000, 1200000, 1200000, 1200000
    .Send
End With

解决方法

经过排查,发现问题出在代理设置上!只需要在请求中添加代理配置,使用WinHttpRequest.SetProxy方法即可解决超时问题:

.Open之后、.Send之前添加这行代码(替换myProxy为你的实际代理地址,格式如"proxy.example.com:8080"):

.SetProxy 2, myProxy

完整的修正后代码示例:

Dim WHTTP As New WinHttp.WinHttpRequest
Dim myProxy As String
myProxy = "your-proxy-address:port" ' 替换为实际代理地址和端口

With WHTTP
    .Open "GET", "https://contactcenter-prd.prosodie.com/prweb/sso", False
    ' 添加代理配置
    .SetProxy 2, myProxy
    ' 其他请求头设置
    .SetRequestHeader "Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8"
    .SetRequestHeader "Accept-Encoding", "gzip, deflate, br"
    .SetRequestHeader "Accept-Language", "pt-BR,pt;q=0.9,en-US;q=0.8,en;q=0.7"
    .SetRequestHeader "Connection", "keep-alive"
    .SetRequestHeader "Host", "contactcenter-prd.prosodie.com"
    .SetRequestHeader "Upgrade-Insecure-Requests", "1"
    .SetRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36"
    .Send
End With

这里简单解释下.SetProxy的参数:

  • 第一个参数2代表使用指定的代理服务器(对应HTTPREQUEST_PROXYSETTING_PROXY常量的数值)
  • 第二个参数是你的代理地址和端口,按照"代理服务器地址:端口号"的格式填写即可

内容的提问来源于stack exchange,提问作者Julio Hintze

火山引擎 最新活动