找回密码
 加入
搜索
查看: 7503|回复: 7

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

  [复制链接]
发表于 2012-12-14 11:49:46 | 显示全部楼层 |阅读模式
本帖最后由 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[0])
        If FileExists("soure1.txt") Then FileDelete("soure1.txt")
        FileWrite("soure1.txt", $rContext[0])
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
发表于 2012-12-14 13:44:16 | 显示全部楼层
这个问题我曾经也遇到过,呵呵,你注意看你的网址中有一段数据是包含了Url编码的
 楼主| 发表于 2012-12-14 13:50:54 | 显示全部楼层
回复 2# 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[2]
        Local $Port = $ConnectURL[3]
        Local $ObjectFile = $ConnectURL[6] & $ConnectURL[7]

        Local $sFlags = Default
        If $ConnectURL[1] = 2 Then $sFlags = $WINHTTP_FLAG_SECURE ;=====判断是否使用SSL连接
这是_WinHTTP_GetRespond的一段代码
你仔细查看一下_WinHttpCrackUrl函数,_WinHTTP_GetRespond调用的参数为$ICU_DECODE,所以才会出现上述的问题
解决办法是要么自己再在_WinHTTP_GetRespond函数中添加一个参数设置_WinHttpCrackUr参数为$ICU_ESCAPE,但是我试过好像没用。
另一种方法也是在_WinHTTP_GetRespond函数中添加一段带代码,加一段函数把$ICU_DECODE后的文本再转成Url编码。
发表于 2012-12-14 15:14:28 | 显示全部楼层
加UserAgent试试
 楼主| 发表于 2012-12-14 16:05:54 | 显示全部楼层
回复 4# qinylj


    谢谢你!让我明白不是我函数调用错误引起!
按你的指导,我又修改WinHttpCrackUr参数为$ICU_ESCAPE,加入MsgBox(0,"",$ObjectFile) 看到url链接是未转换的%B4%BA%B7%E7%B2%BB%B8这个格式,就像你说的运行还是取不到正确源码,对WinHTTP_GetRespond函数我要看懂还得慢慢琢磨,谢谢你热心指导!
发表于 2012-12-16 09:22:34 | 显示全部楼层
回复 6# fastidium

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


使用时+512即可。
 楼主| 发表于 2012-12-17 09:49:01 | 显示全部楼层
回复 7# republican


    谢谢前辈大佬,我正在学习ie相关操作,谢谢提供_WinHTTP_GetRespond 函数!
另外,我怎么把帖子改为已解决呢?
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-11-18 07:45 , Processed in 0.077190 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表