![]() |
#2
约定的童话2021-09-10 19:28
'方 法:工程 - 引用-Microsoft WinHTTP Services, version 5.1
'说 明:WinHttp可以伪造HTTP协议头,伪装成真正的浏览器来访问网页,从而得到更真实的数据,比XmlHTTP相比更加灵活一些(一般用XmlHTTP不行的话,WinHttp决对能搞定) '注 意:每个网站的协议头都不一样,这得看抓包数据结果来决定该设置哪些协议头,有些网站不能加"User-Agent"这个文件头,否则不会返回结果 Private Sub Command1_Click() '模拟GET Dim WinHttp As WinHttp.WinHttpRequest '声明一个对象 Set WinHttp = CreateObject("WinHttp.WinHttpRequest.5.1") WinHttp.Open "GET", "http://www.baidu.com/", True WinHttp.SetTimeouts 30000, 30000, 30000, 30000 '设置超时时间 WinHttp.Option(WinHttpRequestOption_SslErrorIgnoreFlags) = &H3300 '忽略错误 '------------------------------------------------------------------------ WinHttp.SetRequestHeader "Accept-Language", "zh-cn" WinHttp.SetRequestHeader "Content-Type", "application/x-www-form-urlencoded" '------------------------------------------------------------------------设置文件头(具体协议头该设置啥这得看抓包结果) WinHttp.Send '发送 WinHttp.WaitForResponse '异步发送 While WinHttp.Status <> 200 DoEvents Wend Text1.Text = BytesToBstr(WinHttp.ResponseBody, "UTF-8") '返回HTML(同样可用WinHttp.ResponseText返回HTML) Text2.Text = WinHttp.GetAllResponseHeaders '返回所有协议头 Set WinHttp = Nothing End Sub Private Sub Command2_Click() '模拟POST Dim ShuJu As String Dim WinHttp As WinHttp.WinHttpRequest '声明一个对象 Set WinHttp = CreateObject("WinHttp.WinHttpRequest.5.1") ShuJu = "name=abc,pass=123456" '设置POST数据 WinHttp.Open "POST", "http://www.baidu.com/xxx", True WinHttp.SetTimeouts 30000, 30000, 30000, 30000 '设置超时时间 WinHttp.Option(WinHttpRequestOption_SslErrorIgnoreFlags) = &H3300 '忽略错误 '------------------------------------------------------------------------ WinHttp.SetRequestHeader "Content-Length", Len(ShuJu) WinHttp.SetRequestHeader "Accept-Language", "zh-cn" WinHttp.SetRequestHeader "Content-Type", "application/x-www-form-urlencoded" '------------------------------------------------------------------------设置文件头(具体协议头该设置啥这得看抓包结果) WinHttp.Send ShuJu '发送 WinHttp.WaitForResponse '异步发送 While WinHttp.Status <> 200 DoEvents Wend Text1.Text = BytesToBstr(WinHttp.ResponseBody, "UTF-8") '返回HTML(同样可用WinHttp.ResponseText返回HTML) Text2.Text = WinHttp.GetAllResponseHeaders '返回所有协议头 Set WinHttp = Nothing End Sub Public Function BytesToBstr(strBody, CodeBase) '编码转换("UTF-8"或者"GB2312"或者"GBK") Dim ObjStream Set ObjStream = CreateObject("Adodb.Stream") With ObjStream .Type = 1 .Mode = 3 .Open .Write strBody .Position = 0 .Type = 2 .Charset = CodeBase BytesToBstr = .ReadText .Close End With Set ObjStream = Nothing End Function |
只有本站会员才能查看附件,请 登录
,百度了很久应该是https协议需要双向认证,让提供客户端证书,百度到的方法用这条语句添加,aHttpRequest.SetClientCertificate ("LOCAL_MACHINE\TrustedPeople\")但不知道括号里面的证书路径怎么查看,随便设置的路径也不对;换用Set aHttpRequest = CreateObject("Microsoft.XMLHTTP")来发送请求的时候会提示网址有风险弹框,
点继续后就可以正常访问了,但是用第二个发请求的时候无法携带cookie,请问各位大佬有什么解决办法没?卡这三天了

两种方法:
1、让WinHttpRequest请求时像XMLHTTP请求一样弹出提示框点继续后可以继续进行
2、想办法让XMLHTTP请求可以像WinHttpRequest一样带cookie
很好奇用postman发送请求时就没有这些提示,java用httpclient发送请求也没有,不知道这两个是如何跳过这些验证的,
[此贴子已经被作者于2021-9-10 16:24编辑过]