html5中文学习网

您的位置: 首页 > 网站及特效实例 > jquery特效 » 正文

WebBrowser截取网页上的验证码图片_编程语言综合

[ ] 已经帮助:人解决问题

   引言m3qHTML5中文学习网 - HTML5先行者学习网

  最近和一位朋友探讨获取WebBrowser访问的网页中验证图片的方法,起先想到的就是通过WebClient直接去下载当前页面中引用的验证码图片,但继而想到这会涉及一些问题:一是验证码可能会在每次请求时都发生变化,二是将WebClient与WebBrowser的Cookies甚至Session关联起来是件很难的事。m3qHTML5中文学习网 - HTML5先行者学习网

  而后就想到了可以放弃WebBrowser,始终使用WebRequest进行较为底层的访问,以避免多次获取验证码产生变化导致不一致的情况,不过这种办法操作起来还是比较复杂的。m3qHTML5中文学习网 - HTML5先行者学习网

  然后又想到这种变通的方法——抓图。只需要直接通过WebBrowser截图,并将验证码以外的部分裁剪掉,就可以了。m3qHTML5中文学习网 - HTML5先行者学习网

  思路m3qHTML5中文学习网 - HTML5先行者学习网

  首先要分析一下那位朋友要获取的验证图片元素特征:m3qHTML5中文学习网 - HTML5先行者学习网

  网址:http://www.jcard.cn/Charge/UCardDirectCharge.aspx?category=AAWYVVWYKV&product=AAWYVVWYKV010CVm3qHTML5中文学习网 - HTML5先行者学习网

WebBrowser截取网页上的验证码图片  三联

  这里很简单,我们只要找到src属性为“RandomImage.aspx”结尾的图片,就找到我们所需的这个元素了。m3qHTML5中文学习网 - HTML5先行者学习网

  找到这个元素之后,为了方便确定其位置,并确保其不会超出WebBrowser可视范围,我们要为它赋予一个内联样式,使之处于页面的绝对左上角,并设置z-index为9999,以避免被其他元素覆盖,这个样式即为:m3qHTML5中文学习网 - HTML5先行者学习网

  "position: absolute; z-index: 9999; top: 0px; left: 0px"m3qHTML5中文学习网 - HTML5先行者学习网

  这之后就可以通过WebBrowser的DrawToBitmap方法截图了,截图的宽和高可通过上述元素的ClientRectangle属性取得。m3qHTML5中文学习网 - HTML5先行者学习网

  实现m3qHTML5中文学习网 - HTML5先行者学习网

  那么现在建立一个WinForm项目来做测试,设计如下界面:m3qHTML5中文学习网 - HTML5先行者学习网

image

  然后为按钮编写事件处理函数:m3qHTML5中文学习网 - HTML5先行者学习网

  privatevoid button1_Click(object sender, EventArgs e)m3qHTML5中文学习网 - HTML5先行者学习网

  {m3qHTML5中文学习网 - HTML5先行者学习网

  var wb =newWebBrowser();m3qHTML5中文学习网 - HTML5先行者学习网

  wb.Navigate("http://www.jcard.cn/Charge/UCardDirectCharge.aspx?category=AAWYVVWYKV&product=AAWYVVWYKV010CV");m3qHTML5中文学习网 - HTML5先行者学习网

  //等待加载完毕m3qHTML5中文学习网 - HTML5先行者学习网

  while (wb.ReadyStatem3qHTML5中文学习网 - HTML5先行者学习网

  //遍历寻找验证图像所在元素m3qHTML5中文学习网 - HTML5先行者学习网

  foreach (HtmlElement f in wb.Document.Images)m3qHTML5中文学习网 - HTML5先行者学习网

  {m3qHTML5中文学习网 - HTML5先行者学习网

  if (f.GetAttribute("src").ToLower().EndsWith("randomimage.aspx"))m3qHTML5中文学习网 - HTML5先行者学习网

  {m3qHTML5中文学习网 - HTML5先行者学习网

  //将元素绝对定位到页面左上角m3qHTML5中文学习网 - HTML5先行者学习网

  f.Style ="position: absolute; z-index: 9999; top: 0px; left: 0px";m3qHTML5中文学习网 - HTML5先行者学习网

  //抓图m3qHTML5中文学习网 - HTML5先行者学习网

  var b =newBitmap(f.ClientRectangle.Width, f.ClientRectangle.Height);m3qHTML5中文学习网 - HTML5先行者学习网

  wb.DrawToBitmap(b, newRectangle(newPoint(), f.ClientRectangle.Size));m3qHTML5中文学习网 - HTML5先行者学习网

  pictureBox1.Image = b;m3qHTML5中文学习网 - HTML5先行者学习网

  break;m3qHTML5中文学习网 - HTML5先行者学习网

  }m3qHTML5中文学习网 - HTML5先行者学习网

  }m3qHTML5中文学习网 - HTML5先行者学习网

  }m3qHTML5中文学习网 - HTML5先行者学习网

  编译并运行以测试:m3qHTML5中文学习网 - HTML5先行者学习网

image

  点击按钮,稍等片刻,即可在PictureBox中显示出完整的验证码图片了。m3qHTML5中文学习网 - HTML5先行者学习网

  提示m3qHTML5中文学习网 - HTML5先行者学习网

  WebBrowser的DrawToBitmap方法是隐藏的,不受智能感知提示支持,我不知道为什么会这样,但我知道DrawToBitmap方法确实存在问题,就是截图出来全白现象,据我观察,发生这种现象和是否显示WebBrowser控件有关,只要在窗体上显示了WebBrowser控件,截图出来就是全白,而如果不将WebBrowser加载到窗体,截图就是正常的,具体原因不明,只能再次感叹WebBrowser这个强大的控件编写的也太粗滥了。m3qHTML5中文学习网 - HTML5先行者学习网

(责任编辑:)
推荐书籍
推荐资讯
关于HTML5先行者 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 人才招聘 - 帮助