|
楼主 |
发表于 2012-7-28 15:21
|
显示全部楼层
本帖最后由 liucqa 于 2014-5-27 22:27 编辑
请看下面的代码,原贴在这里:http://club.excelhome.net/forum. ... =811229&pid=5541000
承蒙xmyjk大神许可,俺直接用他的例子讲解,顺便在此表示感谢。
Sub Test()
Dim tmp() As String, P As Long, arr() As String, xmlhttp As Object, I As Long, t As Single, COOKIE As String
Set xmlhttp = CreateObject("WinHttp.WinHttpRequest.5.1")
With xmlhttp
.Option(6) = 0
.Open "GET", "http://211.167.229.177/cicpa/public/publicindex.jsp", False
.SEND
COOKIE = Split(.getResponseHeader("Set-Cookie"), ";")(0) '第一次调用获取Cookie
End With
With xmlhttp
.Open "POST", "http://211.167.229.177/cicpa/QueryOfficeAction.do", False
.Option(6) = 1
.setRequestHeader "Referer", "http://211.167.229.177/cicpa/public/stockOffice.jsp" '设置正确的Referer
.setRequestHeader "Cookie", COOKIE '设置有效Cookie
.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
.setRequestHeader "Connection", "keep-alive"
.SEND "method=queryOffices&isStock=&pageNum=1&ascGuid=00000000000000000000000000000000&offName=&offCode=&cpaNum=1" '第二次获取数据
With CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}") 'DataObject对象,数据放入剪贴板,记事本观察数据
.SetText xmlhttp.responsetext
.PutInClipboard
End With
End With
Set xmlhttp = Nothing
End Sub
通常来说,如果要解决某些Cookie的防盗链问题,必须要在提交数据之前先获取一个有效的Cookie,因此采用两次WinHTTP调用是最常见的方式。
第一次调用winhttp获得有效Cookie,第二次调用利用前面获得的有效Cookie+自己生成的部分Cookie,以及Referer,构成提交参数,即可通过网站识别。
对某些简单网站来说,如果前后两个URL的Cookie没有什么变化的话,不需要人为构造Cookie。
如何知道网站是否需要伪造Cookie和Referer才能获取数据呢?这个简单,你只要去掉cookie和Referer试一下就行了。
如何知道我获取的Cookie和Referer是有效的呢?这个需要用抓包工具看一下
实际上,在上例中,我们可以将蓝色语句去掉,依然也能获得正确的数据。为什么呢?
这是因为此网站比较简单,在两次调用之间,网站并没有发送其他Cookie到客户端,因此第一次获取的有效Cookie一直保留在Winhttp内部,发送提交请求的时候,默认就一并提交了。
所以,这个简单的例子算不上是伪造Cookie,只能算是获取有效Cookie罢了。
此例中的Referer也可以换成 "http://211.167.229.177/cicpa/",同样能得到正确的结果。
|
|