使用MSXML2.XMLHTTP调用含Cloudflare域名时遇“请启用Cookie”错误求助
解决Cloudflare拦截VBScript HTTP请求的问题
问题原因
Cloudflare基础防护会校验请求是否来自真实浏览器,你的原代码使用MSXML2.XMLHTTP时,默认未启用完整Cookie支持,且请求头过于简单,被判定为非合法请求,触发"please enable cookies"提示。
解决方案
1. 替换为支持Cookie容器的HTTP对象
MSXML2.XMLHTTP的Cookie处理能力有限,改用WinHttp.WinHttpRequest.5.1或MSXML2.ServerXMLHTTP.6.0,二者原生支持Cookie存储,可满足Cloudflare的Cookie检测要求。
2. 添加浏览器级请求头
模拟真实浏览器的请求头信息,避免被识别为爬虫,核心头包括User-Agent、Accept、Accept-Language等。
3. 处理初始验证逻辑
部分场景下,第一次请求会返回Cloudflare验证页面,需先发起请求获取cf_clearance Cookie,再携带该Cookie请求目标URL;若需JavaScript验证,则需用浏览器自动化方案。
代码示例
方案1:使用WinHttp.WinHttpRequest.5.1
Set objWeb = CreateObject("WinHttp.WinHttpRequest.5.1") ' 启用重定向与Cookie支持 objWeb.Option(6) = True objWeb.Option(12) = True ' 模拟Chrome浏览器请求头 objWeb.SetRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" objWeb.SetRequestHeader "Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8" objWeb.SetRequestHeader "Accept-Language", "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3" ' 首次请求获取Cookie objWeb.Open "GET", URL, False objWeb.Send ' 二次请求目标URL(自动携带Cookie) objWeb.Open "GET", URL, False objWeb.Send strXML = objWeb.ResponseText WScript.Echo strXML
方案2:使用MSXML2.ServerXMLHTTP.6.0
Set objWeb = CreateObject("MSXML2.ServerXMLHTTP.6.0") ' 启用Cookie支持并设置请求头 objWeb.SetOption 2, 13056 objWeb.SetRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" objWeb.SetRequestHeader "Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8" objWeb.SetRequestHeader "Accept-Language", "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3" objWeb.Open "GET", URL, False objWeb.Send strXML = objWeb.ResponseText WScript.Echo strXML
方案3:IE自动化(应对JS验证场景)
若Cloudflare要求JavaScript验证,上述方案失效时,可模拟浏览器操作:
Set ie = CreateObject("InternetExplorer.Application") ie.Visible = False ' 设置为True可查看浏览器窗口 ie.Navigate URL ' 等待页面加载完成 Do While ie.Busy Or ie.ReadyState <> 4 WScript.Sleep 100 Loop ' 获取返回文本 strXML = ie.Document.Body.InnerText ie.Quit Set ie = Nothing WScript.Echo strXML
注意事项
- Cloudflare防护规则会动态更新,若当前方案失效,需调整请求头或升级模拟逻辑;
- 高频请求可能触发验证码验证,需控制请求频率。
内容的提问来源于stack exchange,提问作者Felipe Tejeda
相关产品推荐
相关产品推荐

