vb.net капча с использованием WebBowser и WebClient

Мне нужно войти на страницу, которая использует изображение с картинки, что я делаю:

1- Загрузите изображение капчи с помощью WebClient в память.

2- Сделайте распознавание изображения и извлеките код.

3- Разместите данные для входа и код с помощью веб-браузера.

Пример:

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

Я думаю, что веб-браузеру требуется другое изображение с картинки перед входом в систему, и я получаю неправильную кодовую ошибку. Это работало несколько месяцев назад, поэтому я думаю, что они изменили сайт. Как я могу решить эту проблему? Мне может понадобиться передать файлы cookie, заголовки, запросы и т. д. WebClient в WebBrowser, но я не знаю, как общаться между ними.


person SmT    schedule 10.09.2012    source источник
comment
Ваша проблема в том, что вы пытаетесь взломать код, который отправил вам CAPTCHA. Код сервера вам неизвестен и, скорее всего, предназначен для таких программ автоматизации, как ваша. Попробуйте запросить API у владельца сайта, иначе у вас всегда будет такая проблема, если ваша автоматизация будет обнаружена.   -  person Sheng Jiang 蒋晟    schedule 11.09.2012


Ответы (1)


Я нашел это (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 и выполнить распознавание текста, не запрашивая новую страницу.

person SmT    schedule 26.09.2012