0

我需要登录一个使用验证码图像的页面,我要做的是:

1- 使用 WebClient 将验证码图像下载到内存中。

2- 对图像进行 OCR 并提取代码。

3- 使用 WebBrowser 发布登录详细信息和代码。

例子:

WebBrowser1.Navigate("URL", "", paramInByte, "Content-Type:application/x-www-form-urlencoded")

我认为 WebBrowser 在登录前需要另一个验证码图像,我得到错误的代码错误。几个月前它还在工作,所以我认为他们改变了网站。我该如何解决这个问题?我可能需要将 WebClient 的 cookie、标头、查询等传递给 WebBrowser,但我不知道如何在它们之间进行通信。

4

1 回答 1

0

我找到了这个(w 是 WebBrowser 对象);

首先,我将 WebBrowser 大小设置为验证码图像大小,因为下面的代码将占据 WebBrowser 中的可见部分,但 WebBrowser 本身不必是可见的。

'scroll to the picture, so we have a WebBrowser object just like a picture box
For Each i As HtmlElement In w.Document.GetElementsByTagName("img")
    If i.GetAttribute("src").Contains("here string to identify captcha image") Then
        i.ScrollIntoView(True)
    End If
Next

'Create bitmap
Dim bmp As New Bitmap(w.Width, w.Height, Imaging.PixelFormat.Format32bppArgb)
Dim g As System.Drawing.Graphics = System.Drawing.Graphics.FromImage(bmp)
Dim hdc As IntPtr = g.GetHdc

'Do the Drawing
Dim pUnk As IntPtr = System.Runtime.InteropServices.Marshal.GetIUnknownForObject(w.ActiveXInstance)
OLE32.OleDraw(pUnk, 1, hdc, New Rectangle(0, 0, w.Width, w.Height))
System.Runtime.InteropServices.Marshal.Release(pUnk)

'Release DC and dispose
g.ReleaseHdc(hdc)
g.Dispose()

还应声明 OLE32 类

Public Class OLE32
    Public Declare Function OleDraw Lib "ole32.dll" (ByVal pUnk As IntPtr, ByVal dwAspect As Integer, ByVal hdcDraw As IntPtr, ByRef lprcBounds As Rectangle) As Integer
End Class

这样我就可以将控件内容作为 bmp 并进行 OCR 而无需请求新页面。

于 2012-09-26T09:07:23.687 回答