找回密码
 加入
搜索
查看: 4630|回复: 6

[IE类操作] 从已打开网页提取图片并加载到GUI上的诸多疑问(已解决)

[复制链接]
发表于 2011-9-29 17:51:58 | 显示全部楼层 |阅读模式
本帖最后由 komaau3 于 2011-11-3 23:54 编辑

麻烦大家可以测试以下两段代码
第一段
#include <IE.au3>
$oIE=_IECreate("http://reg.163.com/reg/reg2.jsp?",1)
$oImg = _IEGetObjById ($oIE, "random_img");根据ID找到图片对象
MsgBox(0,0,ObjName($oImg))
$oPic = $oIE.Document.body.createControlRange()
$oPic.Add($oImg)
$oPic.execCommand("Copy")
$file = ClipGet()
MsgBox(0,0,$file)

测试环境 windows7+IE9  ,结果ObjName说明是disphtmlimg,是一个网页图片对象,$oPic.Add($oImg)出错,导致以下代码失效
测试环境 windows7+IE8  ,结果ObjName说明是disphtmlimg,是一个网页图片对象,$oPic.Add($oImg)未出错,ClipGet()得到图片缓存路径
测试环境 XP或03+IE8或6 ,结果ObjName说明是disphtmlimg,是一个网页图片对象,$oPic.Add($oImg)未出错,ClipGet()得到空

再看第二段代码,注意IE地址
#include <IE.au3>
$oIE=_IECreate("http://www.baidu.com",1)
$oImg = _IEImgGetCollection ($oIE, 0);//根据获取索引找到图片对象(第一张)
MsgBox(0,0,ObjName($oImg))
$oPic = $oIE.Document.body.createControlRange()
$oPic.Add($oImg)
$oPic.execCommand("Copy")
$file = ClipGet()
MsgBox(0,0,$file)

测试环境 windows7+IE9  ,结果ObjName说明是disphtmlimg,是一个网页图片对象,$oPic.Add($oImg)未出错,ClipGet()得到图片缓存路径
测试环境 windows7+IE8  ,结果ObjName说明是disphtmlimg,是一个网页图片对象,$oPic.Add($oImg)未出错,ClipGet()得到图片缓存路径
测试环境 XP或03+IE8或6 ,结果ObjName说明是disphtmlimg,是一个网页图片对象,$oPic.Add($oImg)未出错,ClipGet()得到空

从以上测试可以看出:
1、无论是_IEGetObjById获取的对象或_IEImgGetCollection指定索引后获得的对象都是相同的(disphtmlimg),因此导致$oPic.Add($oImg)出错的原因可以排除添加对象类型不正确
2、IE9与IE8或IE6的区别,IE8或6无论在什么系统下$oPic.Add($oImg)都不会出错,而IE9却报错,因此排除系统版本的问题
3、我们放入剪切板的同为图片对象,但ClipGet()的结果却不同,因此window7和XP或2003系统的剪切板存在差异,无疑window7的要智能些

疑问:
1注意两段代码中的网址,区别在于www和reg开头,用专业术语我也不知道这叫什么差别,总之IE9下www开头的网址运行代码都不会出错,而非www的(目前只测试了reg开头的)却报错,为什么呢,可是IE9有什么特殊的缓存机制?遍历缓存并没有发现验证码图片,那么验证码是存在什么数据里呢,IE8或6没测试,希望有心人测试下!
2、数据放入剪切板,window7下直接ClipGet()就可以获取路径,但Xp或03下怎么取出具体文件呢?
3、除了以上代码可以从已打开网页提取图片,还有其他办法吗?

求高手解答 ,非常感激 !!!!
 楼主| 发表于 2011-10-26 09:40:23 | 显示全部楼层
此贴悲剧乎,吾何等难过and伤心......
 楼主| 发表于 2011-10-26 09:40:28 | 显示全部楼层
此贴悲剧乎,吾何等难过and伤心......
发表于 2011-10-26 09:58:03 | 显示全部楼层
Func getpic()
        $iVerifyPic = _IEImgGetCollection($oIE, 2)
        _GDIPlus_Startup()
        $iVerifyPics = $oIE.Document.body.createControlRange()
        $iVerifyPics.add($iVerifyPic)
        $iVerifyPics.Select()
        $iVerifyPics.execCommand('Copy')
        Sleep(500)
        _ClipBoard_Open(0)
        $iVerifyPics = _ClipBoard_GetDataEx($CF_BITMAP)
        $iVerifyPics = _GDIPlus_BitmapCreateFromHBITMAP($iVerifyPics)
        _ClipBoard_Close()
        FileDelete(@TempDir & "\VerifyPic.bmp")
        _GDIPlus_ImageSaveToFile($iVerifyPics, @TempDir & "\VerifyPic.bmp")
        ;$Img = GUICtrlCreatePic(@TempDir & "\VerifyPic.bmp", 400, 420, _GDIPlus_ImageGetWidth($iVerifyPics), _GDIPlus_ImageGetHeight($iVerifyPics))
        GUICtrlSetImage($Img, @TempDir & "\VerifyPic.bmp", -1, 2)
        _GDIPlus_BitmapDispose($iVerifyPics)
        _GDIPlus_Shutdown()
EndFunc 
以前做过 163 邮箱注册,那时是这样做(坛里找的),你可以试试
 楼主| 发表于 2011-10-26 18:36:46 | 显示全部楼层
回复 4# xzxnovice
非常感谢LS,您的代码解决了剪切板数据获取的问题,

 _ClipBoard_Open(0)
$iVerifyPics = _ClipBoard_GetDataEx($CF_BITMAP)
$iVerifyPics = _GDIPlus_BitmapCreateFromHBITMAP($iVerifyPics)
_ClipBoard_Close()
_GDIPlus_ImageSaveToFile($iVerifyPics, @TempDir & "\VerifyPic.bmp")

但是IE9的安全问题没法搞定,因此问题还是没解决,请问基于IE管理还有别的办法来获取验证码吗?
发表于 2011-10-26 18:46:28 | 显示全部楼层
回复 5# komaau3


    我在windows 7+ ie9 上运行这段代码没问题,不知道你指什么安全问题?
 楼主| 发表于 2011-11-3 23:53:33 | 显示全部楼层
回复 6# xzxnovice
唉。。。。惭愧啊  看到你的回复了,但三天没敢给您回复,原来我的代码少了这句 ,$iVerifyPics.Select(),少了选择操作,就出问题了,现在看来这一大堆提问
着实非常搞笑,庸人自扰啊,呵呵。以后还是尽量少提问,自己多琢磨琢磨再说吧,态度一定会端正、严谨。。。发自肺腑的自我反省,抱歉几天没及时给您回复,对您的帮助表示再次 感谢!!!!!
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-6 03:16 , Processed in 0.075993 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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