| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 9536 人关注过本帖, 1 人收藏
标题:如何获取webBrowser控件中的图片?
只看楼主 加入收藏
暗香
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2008-10-11
收藏(1)
 问题点数:0 回复次数:8 
如何获取webBrowser控件中的图片?
如何获取webBrowser控件中的图片?
譬如百度注册页面https://passport.baidu.com/?reg的这种图片,因为想做一个百度的自动注册工具,使用webBrowser空间,并将其Navigate属性设置为https://passport.baidu.com/?reg,再页面完全加载之后,获取其DocumentText值,发现其图片的地址一直都为https://passport.baidu.com/?verifypic,而且每刷新一次就会改变一次,鉴于验证码识别的难度,基本放弃程序识别,我想将其显示出来,由操作员识别并输入,
    为了现实此图片(为避免其他因素干扰,我将WebBrowser控件的Visable属性为false),我在程序中加入PictureBox控件,将其ImageLocation属性指向为https://passport.baidu.com/?verifypic,这时候问题产生了,改控件显示的图片是重新生成的,和webBrowser种的那个图片是不同的!此路是不是行不通啊?
    后来我又考虑到既然浏览器打开过这个页面,页面中的内容应该在本机临时文件夹存储,可以从本机读取图片路径,进行加载,为了验证这个想法,我将IE临时文件夹清空,重新打开注册页面,却发现IE的临时文件夹中没有这个验证码的图!这是怎么回事?能显示出来,应该说此图在我电脑中存在呀,为什么我用软件检测自己的系统文件夹,却看不到此文件的创建?
    希望高手帮忙解决一下啊

[[it] 本帖最后由 暗香 于 2008-10-11 23:06 编辑 [/it]]
搜索更多相关主题的帖子: webBrowser 控件 获取 
2008-10-11 23:00
暗香
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2008-10-11
收藏
得分:0 
补充一下,如果我在打开的页面,对着图片点右键“图片另存为”,可以得到和在网页中显示相同的图片~
有没有高手能在本地把此图在本机自动重建出来,只要能再PictureBox中再现算满足要求呀
2008-10-11 23:15
hellson
Rank: 2
来 自:北京
等 级:新手上路
威 望:4
帖 子:195
专家分:0
注 册:2008-9-1
收藏
得分:0 
程序代码:
        private object GetElement(IHTMLDocument2 doc, string obj)
        {
            object element = doc.all.item(obj, null);
            object e = null;
            IHTMLDocument2 tmpDoc = null;
            if (element == null) //如果在当前页面的TopLevel中没有找到该元素,则到FRAME中找
            {
                for (int i = 0; i < doc.frames.length; i++)
                {
                    object oFrameIndex = i;
                    tmpDoc = (IHTMLDocument2)((IHTMLWindow2)doc.frames.item(ref oFrameIndex)).document;
                    e = GetElement(tmpDoc, obj);
                    if (e == null)
                        continue;
                    else
                        break;
                }
            }
            else
            {
                return element;
            }
            return e;
        }


程序代码:
            Image myImage = new Bitmap(60, 20);//你图片大小,我这个是某网页游戏的
            IHTMLDocument2 doc = (IHTMLDocument2)webb.Document;//你浏览器的Document对象
            IHTMLControlElement img = (IHTMLControlElement)GetElement(doc, "img1");
            //img1 是你在网页代码中找到的图片id 就是id=什么后边那个
            object oFrameIndex = 2;//假设你找到了图片在第2个frame中
            IHTMLDocument2 tmpDoc = (IHTMLDocument2)((IHTMLWindow2)doc.frames.item(ref oFrameIndex)).document;// 取第2个frame的Document对象
             HTMLBody body = (HTMLBody)tmpDoc.body;
            IHTMLControlRange rang = (IHTMLControlRange)body.createControlRange();
            rang.add(img);
            rang.execCommand("Copy", false, null);
            myImage = Clipboard.GetImage();//之后就不用说了吧

春了夏了秋冬了,来了来了又来了
相信我的帖子打开都很快,看我头像就知道了
2008-10-14 10:00
hellson
Rank: 2
来 自:北京
等 级:新手上路
威 望:4
帖 子:195
专家分:0
注 册:2008-9-1
收藏
得分:0 
程序代码:
            Bitmap myBitmap = new Bitmap(myImage);
            RectangleF cloneRect1 = new RectangleF(0, 0, 18, 20);
            RectangleF cloneRect2 = new RectangleF(18, 0, 13, 20);
            RectangleF cloneRect3 = new RectangleF(31, 0, 14, 20);
            RectangleF cloneRect4 = new RectangleF(45, 0, 15, 20);
            PixelFormat format = myBitmap.PixelFormat;
            Bitmap[] bmps = new Bitmap[4];
            bmps[0] = myBitmap.Clone(cloneRect1, format);
            bmps[1] = myBitmap.Clone(cloneRect2, format);
            bmps[2] = myBitmap.Clone(cloneRect3, format);
            bmps[3] = myBitmap.Clone(cloneRect4, format);


之后规则的验证码可以切成4份,然后数总点数或者判断特征点 或者特征区域
比如说我知道了只有6和9点阵总数一样那么特殊判断他们

程序代码:
        private int count(Bitmap bmp)
        {
            int[] a = { 74, 57, 58, 59, 68, 61, 78, 44, 82, 78 };
            Color color = new Color();
            int num = 0;
            for (int i = 0; i < bmp.Height; i++)
            {
                for (int j = 0; j < bmp.Width; j++)
                {
                    color = bmp.GetPixel(j, i);
                    int gray = (color.R + color.G + color.B) / 3;
                    if (gray < 150)
                        num++;
                }

            }

            for (int n = 0; n < 10; n++)
            {
                if (a[n] == num && n != 6)
                    return n;
                else if (a[n] == num && n == 6)
                    return find6or9(bmp);
            }

            return 0;
        }

春了夏了秋冬了,来了来了又来了
相信我的帖子打开都很快,看我头像就知道了
2008-10-14 10:05
hellson
Rank: 2
来 自:北京
等 级:新手上路
威 望:4
帖 子:195
专家分:0
注 册:2008-9-1
收藏
得分:0 
程序代码:
最后说下一般不用webbrowser控件,使用HTTPWEBREQUEST 最爽

                        r e q u e s t   =   ( H t t p W e b R e q u e s t ) H t t p W e b R e q u e s t . C r e a t e ( r e q u e s t U r i ) ; //你图片地址,反正它不变

 
                         r e q u e s t . M e t h o d   =   " G E T " ; 

 
                         r e q u e s t . A c c e p t   =   " * / * " ; 

 
                         r e q u e s t . R e f e r e r   =   " h t t p : / / XXXX/ l o g i n . j s p " ; 

 
                         r e q u e s t . C o o k i e C o n t a i n e r   =   c c ; //自己new一个

 
                         r e q u e s t . C o n t e n t L e n g t h   =   0 ; 

 
                         r e s p o n s e   =   ( H t t p W e b R e s p o n s e ) r e q u e s t . G e t R e s p o n s e ( ) ; 

   S t r e a m   i n S t r e a m   =   r e s p o n s e . G e t R e s p o n s e S t r e a m ( ) ; 

 
                         I m a g e   i m g   =   n e w   B i t m a p ( i n S t r e a m ) ; 

 
                         b y t e A r r a y   =   E n c o d i n g . U T F 8 . G e t B y t e s ( l o g i n s t r   +   o c r ( i m g ) ) ; //l o g i n s t r 就是你抓取到的登陆串,比如name=???&pwd=UYGUGIOHIOUH,如果是md5的是死的你也写死吧,图片识别的o c r 程序同上

 
                         r e q u e s t U r i   =   n e w   U r i ( " h t t p : / /XXX/ l o g i n S u b m i t . a c t i o n " ) ; //提交的地址,都能找到吧

 
                         r e q u e s t   =   ( H t t p W e b R e q u e s t ) H t t p W e b R e q u e s t . C r e a t e ( r e q u e s t U r i ) ; 

 
                         r e q u e s t . M e t h o d   =   " P O S T " ; 

 
                         r e q u e s t . A c c e p t   =   " * / * " ; 

 
                         r e q u e s t . R e f e r e r   =   " h t t p : / / XXXX / l o g i n . j s p " ; 

 
                         r e q u e s t . C o n t e n t T y p e   =   " a p p l i c a t i o n / x - w w w - f o r m - u r l e n c o d e d " ; 

 
                         r e q u e s t . C o o k i e C o n t a i n e r   =   c c ; //同一个cookies

 
                         r e q u e s t . G e t R e q u e s t S t r e a m ( ) . W r i t e ( b y t e A r r a y ,   0 ,   b y t e A r r a y . L e n g t h ) ; 

 
                         r e q u e s t . G e t R e q u e s t S t r e a m ( ) . C l o s e ( ) ; 

 
                         r e s p o n s e   =   ( H t t p W e b R e s p o n s e ) r e q u e s t . G e t R e s p o n s e ( ) ; // 成功登陆

收到的鲜花
  • skyzoneskyzone2008-10-14 12:25 送鲜花  3朵   附言:好文章

春了夏了秋冬了,来了来了又来了
相信我的帖子打开都很快,看我头像就知道了
2008-10-14 10:15
skyzoneskyzone
Rank: 1
等 级:新手上路
威 望:1
帖 子:137
专家分:0
注 册:2008-10-6
收藏
得分:0 
楼上的这是你写的吗?我觉得你绝对是个高手哦,能不能发份完整的实例给我?(使用HTTPWEBREQUEST)谢谢。
skyzoneskyzone@
2008-10-14 12:28
machao514
Rank: 1
等 级:新手上路
帖 子:48
专家分:0
注 册:2007-4-14
收藏
得分:0 
兄台,我在玩webBrowser!
碰到点小问题哦,就是分析html代码的时候读出form的个数,我用正则表达式的!

 string Pattern = @"<form[\s|\S|]*</form>";
结果他默认找最长的匹配,也就是不管怎么样都只有一个最开始的<form>和最后的</form>

能帮帮我吗?
2008-10-14 12:51
暗香
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2008-10-11
收藏
得分:0 
很感谢大家的忙帮啊,我研究研究
有成果的话一定放上来~
2008-10-14 13:31
暗香
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2008-10-11
收藏
得分:0 
IHTMLDocument2
需要引用什么命名空间啊?
貌似是个接口?
但是提示说缺少命名空间~
2008-10-14 13:36
快速回复:如何获取webBrowser控件中的图片?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.031444 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved