fastidium 发表于 2012-12-14 11:49:46

请教,我用WinHTTP_GetRespond函数get 不能正确返回网页源码[已解决]

本帖最后由 fastidium 于 2012-12-17 09:51 编辑

我的源码:#include <WinHTTP_GetRespond.au3>

one()
Sleep(100)
two()

Func one()
        $MyOpen = _WinHttpOpen()
        $url = "http://searchb.dangdang.com/index.php?key1=%B4%BA%B7%E7%B2%BB%B8%C4&key4=&key2=%D1%F4%CC%A8%D2%BB%D3%E7&key3=&category_path=01.00.00.00.00.00&medium=01"
        ConsoleWrite($url & @CRLF)
        $rContext = _WinHTTP_GetRespond($MyOpen, $url, 2, 80000)
        ;ConsoleWrite($rContext)
        If FileExists("soure1.txt") Then FileDelete("soure1.txt")
        FileWrite("soure1.txt", $rContext)
EndFunc   ;==>one

Func two()
        $oHTTP = ObjCreate("microsoft.xmlhttp")
        Local $url1 = "http://searchb.dangdang.com/index.php?key1=%B4%BA%B7%E7%B2%BB%B8%C4&key4=&key2=%D1%F4%CC%A8%D2%BB%D3%E7&key3=&category_path=01.00.00.00.00.00&medium=01"
        ConsoleWrite($url1 & @CRLF)
        $oHTTP.open("get", $url1, False)
        $oHTTP.send()
        $source1 = $oHTTP.responsetext
        ;MsgBox(0,0,$source1)
        If FileExists("soure2.txt") Then FileDelete("soure2.txt")
        FileWrite("soure2.txt", $source1)
EndFunc   ;==>two
对ie操作我一直很迷茫,学习没有头绪,上面这两个源码也是从论坛修改的,用 ObjCreate这个能正确返回源码,为什么用WinHTTP_GetRespond这个不能正确返回源码呢?求各位老大指教啊,先谢谢了!
key1 key4 由转码工具得到:MsgBox(0,"",UrlEnc("春风不改"))
MsgBox(0,"",UrlEnc("阳台一隅"))

Func UrlEnc($Sz_url)
      Local $str=StringTrimLeft(StringToBinary($Sz_url,1),2)
      Local $ret
      For $i=1 to StringLen($str) Step 2
                $ret &='%' & StringMid($str,$i,2)
      Next
      Return $ret
EndFunc

qinylj 发表于 2012-12-14 13:44:16

这个问题我曾经也遇到过,呵呵,你注意看你的网址中有一段数据是包含了Url编码的

fastidium 发表于 2012-12-14 13:50:54

回复 2# qinylj


    能详细讲讲么,我有点儿小白,不懂啊,请教,谢谢你

qinylj 发表于 2012-12-14 13:52:39

        ; ==== 拆分网址 ====
        $ConnectURL = _WinHttpCrackUrl($ConnectURL, $ICU_DECODE)
        If @error Or Not IsArray($ConnectURL) Then Return SetError(1, 0, _GetLastError_Winhttp())
       
        ; ==== 重新定义变量,方便阅读 ====
        Local $ServerHost = $ConnectURL
        Local $Port = $ConnectURL
        Local $ObjectFile = $ConnectURL & $ConnectURL

        Local $sFlags = Default
        If $ConnectURL = 2 Then $sFlags = $WINHTTP_FLAG_SECURE ;=====判断是否使用SSL连接这是_WinHTTP_GetRespond的一段代码
你仔细查看一下_WinHttpCrackUrl函数,_WinHTTP_GetRespond调用的参数为$ICU_DECODE,所以才会出现上述的问题
解决办法是要么自己再在_WinHTTP_GetRespond函数中添加一个参数设置_WinHttpCrackUr参数为$ICU_ESCAPE,但是我试过好像没用。
另一种方法也是在_WinHTTP_GetRespond函数中添加一段带代码,加一段函数把$ICU_DECODE后的文本再转成Url编码。

komaau3 发表于 2012-12-14 15:14:28

加UserAgent试试

fastidium 发表于 2012-12-14 16:05:54

回复 4# qinylj


    谢谢你!让我明白不是我函数调用错误引起!
按你的指导,我又修改WinHttpCrackUr参数为$ICU_ESCAPE,加入MsgBox(0,"",$ObjectFile) 看到url链接是未转换的%B4%BA%B7%E7%B2%BB%B8这个格式,就像你说的运行还是取不到正确源码,对WinHTTP_GetRespond函数我要看懂还得慢慢琢磨,谢谢你热心指导!

republican 发表于 2012-12-16 09:22:34

回复 6# fastidium

这是winhttpCrackURL的问题,与Getrespond无关,喜欢的换用WinInetCrackURL就没问题的。
或者参照下列代码改一下就可以了:
        ; ==== 重新定义变量,方便阅读 ====
        Local $ServerHost = $ConnectURL
        Local $Port=$ConnectURL
        Local $ObjectFile=$ConnectURL&$ConnectURL
        If $Mode = 1 Then
                Local $ObjectFiletmp=StringRegExp($sConnectURL,'//.*?(/.*)',3)
                If Not @error Then $ObjectFile = $ObjectFiletmp
        EndIf
        Local $sFlags = Default
        If $ConnectURL = 2 Then $sFlags = $WINHTTP_FLAG_SECURE        ;=====判断是否使用SSL连接

使用时+512即可。

fastidium 发表于 2012-12-17 09:49:01

回复 7# republican


    谢谢前辈大佬,我正在学习ie相关操作,谢谢提供_WinHTTP_GetRespond 函数!
另外,我怎么把帖子改为已解决呢?
页: [1]
查看完整版本: 请教,我用WinHTTP_GetRespond函数get 不能正确返回网页源码[已解决]