网页验证码识别实例VB.NET2019(一)

mac2025-12-04  7

  最近闲来无事,用vb.net做一个网页自动登录的小程序,里面需要输入验证码。涉及到验证码图片识别的问题,查了很多资料,参考了兄弟猿的一些资料,终于有了一个满意的结果。验证码识别率100%。一是怕忘记,方便自己以后查用,二是与大家分享,互勉提高,特记录在此。希望能有更有效的方法去实现验证码图片的识别。

   1、获取网页验证码图片

  获取网页图片验证码的方法很多,可以通过验证码图片标签元素中的src地址下载,也可以通过execCommand 方法直接获取已经显示在网页中的图片。本例采用后面的方法获取验证码图片对象。   访问网页文档对象采用HTMLDocument接口。(Ihtmldocument2是比较常用的网页文档对象,是 IHTMLDocument的一个高版本实现,它扩展基本的 IHTMLDocument COM 接口并定义某些新功能,如 IFrame 和 ExecVerb 等。详细了解可参见[关于MSHTML、IHTMLDocument、Ihtmldocument2-5的区别及 document.execCommand方法详解]。)(https://blog.csdn.net/mengxiangde/article/details/102817401)。   利用execCommand(“Copy”, False, Nothing)方法把网页验证码图片拷贝到剪贴板。 这里遇到了一个问题,自IE8浏览器后,发现每一次复制粘贴都会弹出一个小窗口,提示“确认允许此网页访问“剪贴板”吗”,点确定后,才可以粘贴,这实在太麻烦了,严重影响做事效率。故决定用定时器控件监控小窗口的弹出,如发现弹出,则自动点击确认。但是又遇到了一个问题,就是vs2019控件工具箱中的timer计时器实际上是单线程的,当执行到execCommand命令时,线程挂起,等待用户点击小窗口确认。而timer控件也挂起停止,无法执行timer事件的处理小窗口代码。一通百度,告诉我计时器控件有三种,其中vs2019控件工具箱中的timer计时器是与form主程序一个线程的。而System.Timers.Timer命名控件中的timer计时器可以多线程执行,不会挂起。System.Timers.Timer计时器是通过timer的elapsed事件来处理计时器响应事件。问题又来了,怎么也找不到elapsed事件,又一通百度,不断试验,费了九牛二虎之力,终于找到解决办法(没办法啊,我是假程序员,是通过百度学会了vb6,又通过百度从vb6转到了vb.net)。   一句代码解决了问题。原来得用withevent去创建timer:

Friend WithEvents ClipboadTimer As System.Timers.Timer = New Timers.Timer

timer计时器elapsed事件代码:

Private Sub ClipboadTimer_Elapsed(sender As Object, e As Timers.ElapsedEventArgs) Handles ClipboadTimer.Elapsed Dim hwnd As Integer hwnd = FindWindow(Nothing, "Internet Explorer")'获取弹出小窗口的句柄 If hwnd <> IntPtr.Zero Then Dim btnhwnd As IntPtr = FindWindowEx(hwnd, IntPtr.Zero, "Button", "允许访问(&A)")'获取小窗口允许访问按钮的句柄 If btnhwnd <> IntPtr.Zero Then '发送点击消息给按钮 SendMessage(btnhwnd, WM_CLICK, 0, 0) '先移上去 SendMessage(btnhwnd, WM_CLICK, 0, 0) '再点击 ' CloseWebAlertWindow.Enabled = False '关闭这个定时器 End If End If End Sub

具体代码如下:

Dim objdoc As mshtml.HTMLDocument = obj.Document Dim body As mshtml.HTMLBody = objdoc.body Dim range As mshtml.IHTMLControlRange = body.createControlRange ' Img = webbrower1.Document.All(ImgName).DomElement '将Document转换为IHTMLDocument2格式 range.add(objdoc.getElementById("img"))'元素ID=“img” '---设置并启动剪贴板监控计时器---------------------- ClipboadTimer.Interval = 1000 ClipboadTimer.Enabled = True ClipboadTimer.AutoReset = True ClipboadTimer.Start() range.execCommand("Copy", False, Nothing) '将range拷贝到剪切板 '----停止计时器-------------------------------- ClipboadTimer.Stop() ClipboadTimer.Enabled = False Dim RegImg As Image = Clipboard.GetImage '获取剪切板内的图片 Dim vci As New VerificationCodeIdentify Dim CharString As String = vci.VerificationCodeIdentify(RegImg)'验证码识别函数,后面会有介绍。
最新回复(0)