【已解决】请问如何为Microsoft.XMLHTTP添加超时设置
本帖最后由 renxiaoyao 于 2010-4-16 00:44 编辑MSXML2.ServerXMLHTTP是有setTimeouts的,但Microsoft.XMLHTTP没有
有没有其它办法可以给这个函数加个超时设置呢?谢谢!Func _XmlHttp($URL)
$nHTTP = ObjCreate ( "Microsoft.XMLHTTP" )
$nHTTP.Open ( "get" , $URL , false )
$nHTTP.setRequestHeader("Cache-Control", "no-cache")
$nHTTP.setRequestHeader("Accept-Language", "zh-cn")
$nHTTP.setRequestHeader ("Content-Type", "application/x-www-form-urlencoded");表示客户端提交给服务器文本内容的编码方式
$nHTTP.setRequestHeader ("Cache-Control", "no-cache");返回消息中的Cache用于指定网页缓存
$nHTTP.setRequestHeader ("Connection", "Keep-Alive");数据传递完并不立即关闭连接
$nHTTP.send ()
$nReturnWebS = BinaryToString ( $nHTTP.responseBody,4 )
Return $nReturnWebS
$nHTTP.Nothing
EndFunc
这个函数若使用MSXML2.ServerXMLHTTP,返回空白
所以还得用Microsoft.XMLHTTP,但它又没有超时设置 没研究过,帮你顶下 记得winhttp.winhttprequest组件好像可以设置超时 $oHTTP = ObjCreate("winhttp.winhttprequest.5.1")
$oHTTP.SetTimeouts(15000, 15000, 15000, 15000) ;设置超时
$oHTTP.setProxy (2, "222.92.117.241:80");设置代理
$oHTTP.Open("GET", "http://www.ip138.com/ip2city.asp", False)
$oHTTP.setRequestHeader("Cache-Control", "no-cache")
$oHTTP.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")
$oHTTP.Send('') 谢谢各位!
我发现把"get"改成"GET",MSXML2.ServerXMLHTTP也不返回空值了
但是,winhttp.winhttprequest.5.1和MSXML2.ServerXMLHTTP遭遇了同样的问题
我明明已经登陆了那个网站,如果用Microsoft.XMLHTTP能返回我要的结果
但用其它两个返回的却是未登录的页面:face (9):
为什么呢 本帖最后由 renxiaoyao 于 2010-4-15 23:46 编辑
抓了一下包,貌似Microsoft.XMLHTTP自动帮我把cookie也发出去,所以能抓到我要的东西
好神奇,我是在_IECreateEmbedded()创建的对象里面登陆,然后Microsoft.XMLHTTP抓取某一个页面的
哪位大大能帮我解释下吗?:face (8): 这个应该是父进程继承的关系吧 本帖最后由 renxiaoyao 于 2010-4-16 00:44 编辑
这个应该是父进程继承的关系吧
maker 发表于 2010-4-16 00:29 http://www.autoitx.com/images/common/back.gif
:face (37): 哦,谢谢!Microsoft.XMLHTTP比较特别吗,哈
一楼问题自己迂回解决了:先Ping一下主机,不通就返回超时,通了才去抓页面 哦,谢谢!Microsoft.XMLHTTP比较特别吗,哈
一楼问题自己迂回解决了:先Ping一下主机, ...
renxiaoyao 发表于 2010-4-16 00:41 http://www.autoitx.com/images/common/back.gif
ping 最好还加个 InetGetInfo 候补…… ping通直接过,ping不通就用InetGetInfo上 ping 最好还加个 InetGetInfo 候补…… ping通直接过,ping不通就用InetGetInfo上
afan 发表于 2010-4-16 00:46 http://www.autoitx.com/images/common/back.gif
:face (37): 谢谢afan大大,这样么?Func _XmlHttp($URL, $Timeouts = 5000, $SleepTime = 1000) ;页面下载
;超时返回 "error",否则返回ResponseBody
$Host_Test = StringRegExp($URL, "http://(.*?)/", 3)
If Not @error Then
$Host = $Host_Test
Else
$Host = StringReplace($URL, "http://", "")
EndIf ;获取主机名
If Ping($Host, $Timeouts) <=0 Then
$InetGet_Test = InetGet($URL, "InetGet.tmp", 1, 1)
Sleep($SleepTime)
If InetGetInfo($InetGet_Test, 0) = 0 Then
InetClose($InetGet_Test)
Return "error"
Else
InetClose($InetGet_Test)
FileDelete("InetGet.tmp")
EndIf
EndIf ;检测是否能连上
$oHTTP = ObjCreate("Microsoft.XMLHttp")
$oHTTP.Open ( "GET" , $URL , False )
$oHTTP.SetRequestHeader("Referer", "http://"&$Host&"/")
$oHTTP.SetRequestHeader("Accept-Language", "zh-cn")
$oHTTP.SetRequestHeader("Connection", "Keep-Alive");数据传递完并不立即关闭连接
$oHTTP.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded");表示客户端提交给服务器文本内容的编码方式
$oHTTP.SetRequestHeader("Cache-Control", "no-cache");返回消息中的Cache用于指定网页缓存
$oHTTP.Send ()
$oReturnWebS = BinaryToString ( $oHTTP.ResponseBody )
Return $oReturnWebS
$oHTTP.Nothing
EndFunc 谢谢afan大大,这样么?
renxiaoyao 发表于 2010-4-16 01:50 http://www.autoitx.com/images/common/back.gif
应该可以了 :face (17):无时不在的afan大大!
再次感谢诸位! 回复 13# renxiaoyao
呵呵~
另外,Sleep($SleepTime) 其实可以加入循环读取,因为可能50ms或更短就能结束判断了~ 本帖最后由 renxiaoyao 于 2010-4-16 02:50 编辑
回复renxiaoyao
呵呵~
另外,Sleep($SleepTime) 其实可以加入循环读取,因为可能50ms或更短 ...
afan 发表于 2010-4-16 01:59 http://www.autoitx.com/images/common/back.gif
:face (17): afan大大是速度和精力的代名词!Func _GetHost($URL);获取主机名
$Host_Test = StringRegExp($URL, "http://(.*?)/", 3)
If Not @error Then
$Host = $Host_Test
Else
$Host = StringReplace($URL, "http://", "")
EndIf
Return $Host
EndFunc
Func _IsTimeout($URL, $Timeouts) ;检测是否能连上
If Ping(_GetHost($URL), $Timeouts/2) <=0 Then
$InetGet_Test = InetGet($URL, "InetGet.tmp", 1, 1)
For $i = 1 To Ceiling($Timeouts/100) ;$Timeouts/2/50
Sleep(50)
If InetGetInfo($InetGet_Test, 0) > 0 Then
InetClose($InetGet_Test)
FileDelete("InetGet.tmp")
Return "OK"
EndIf
Next
InetClose($InetGet_Test)
Return "error"
EndIf
Return "OK"
EndFunc
Func _XmlHttp($URL, $Timeouts = 5000) ;页面下载
;超时返回 "error",否则返回ResponseBody
If _IsTimeout($URL, $Timeouts) = "error" Then
Return "error"
EndIf
$oHTTP = ObjCreate("Microsoft.XMLHttp")
$oHTTP.Open ( "GET" , $URL , False )
$oHTTP.SetRequestHeader("Referer", "http://"&_GetHost($URL)&"/")
……
页:
[1]
2