【问题标题】:how to get captcha image if src use java function?如果 src 使用 java 函数,如何获取验证码图像?
【发布时间】:2015-07-13 13:55:07
【问题描述】:

如何从this website 抓取验证码 验证码图片。

我尝试了 MSHTML,但这个网站使用 java 脚本函数在它的 src 中显示检索验证码。请尝试回答我如何实现这一目标。

Imports MahApps.Metro.Controls
Imports System.Net
Imports System.Windows.Forms


Class MainWindow
    Inherits MetroWindow

    Private Sub MetroWindow_Loaded(sender As Object, e As RoutedEventArgs)
        wb.Navigate("https://www.irctc.co.in/eticketing/loginHome.jsf")
        AddHandler wb.LoadCompleted, AddressOf wb_Loaded
    End Sub
    Private Sub btngo_Click(sender As Object, e As RoutedEventArgs) Handles btngo.Click
        Dim htmldoc As MSHTML.IHTMLDocument2 = wb.Document
        Dim usrtxtdoc As MSHTML.IHTMLElement = htmldoc.all.item("j_username", 0)
        Dim usrpwddoc As MSHTML.IHTMLElement = htmldoc.all.item("j_password", 0)
        Dim captchadoc As MSHTML.IHTMLElement = htmldoc.all.item("j_captcha", 0)
        usrtxtdoc.innerText = txtusrname.Text
        usrpwddoc.innerText = txtpwd.Text
        captchadoc.innerText = txtcaptcha.Text
    End Sub

    Private Sub wb_Loaded(sender As Object, e As System.Windows.Navigation.NavigationEventArgs)
        MsgBox("Loaded")
        Dim htmldoc As MSHTML.IHTMLDocument2 = wb.Document
        Dim htmldoc2 As MSHTML.HTMLDocument = wb.Document
        Dim captchaimg As MSHTML.HTMLImg = htmldoc.all.item("cimage", 0)
        Dim bitmap As New BitmapImage
        bitmap.BeginInit()
        bitmap.UriSource = New Uri(wb.FindResource("captchaImage"))
        bitmap.EndInit()
        imgcaptcha.Source = bitmap
    End Sub

    Private Sub wb_Navigated(sender As Object, e As NavigationEventArgs) Handles wb.Navigated
        lblwbstatus.Content = "Load Completed"
    End Sub

    Private Sub wb_Navigating(sender As Object, e As NavigatingCancelEventArgs) Handles wb.Navigating
        lblwbstatus.Content = "Navigating Please wait"
    End Sub

    Private Sub lblwbstatus_MouseDoubleClick(sender As Object, e As MouseButtonEventArgs) Handles lblwbstatus.MouseDoubleClick
        wb.Refresh()
    End Sub
End Class

你可以从this link下载源码

【问题讨论】:

  • 我是新的 stackoverflow,所以请不要给我的问题打分感谢您编辑了我的问题,请不要给我打分,我真的需要解决方案
  • 没有 jhonkiller,我是说当这个 CAPTCHA 被加载到 webbrowser 控件中时,它调用 java 函数来获取图像但是当你再次使用 SRC 调用这个 CAPTCHA 函数时,正如你在评论中所说的那样,它称为 CAPTCHA java单独运行并生成新的 captch 图像。我需要某种方法,以便我可以检索加载到 DOM 文档中的验证码图像
  • 那是因为验证码存储在会话变量中。当您请求图像 URL 时,会话会刷新。让我想想是否有办法。你的最终目标是什么?

标签: vb.net captcha


【解决方案1】:

通常你会这样做:

    Dim htmldoc As mshtml.IHTMLDocument2 = wb.Document.DomDocument
    Dim captchaimg As mshtml.HTMLImg = htmldoc.all.item("cimage", 0)
    Dim imgRange As IHTMLControlRange = htmldoc.body.createControlRange()
    For Each img As IHTMLImgElement In htmldoc.images
        If img.nameProp = "captchaImage" Then
            imgRange.add(img)
            imgRange.execCommand("Copy", False, Nothing)
            Using bmp As Bitmap = Clipboard.GetDataObject().GetData(DataFormats.Bitmap)
                bmp.Save("c:\test.bmp")
            End Using
        End If
    Next

但是,由于 Internet Explorer 问题,该图像有一个 Alpha 通道,它不会被复制到剪贴板(您可以在此处阅读Copying image from page results in black image)。

其他方法是检查 Internet Explorer 缓存,但由于 HTTP 标头,该图像不会被缓存,所以你运气不好。

【讨论】:

  • 谢谢兄弟我会试试这个并回复你的答案
  • 还有其他库可以做到这一点吗?像其他一些 HTML 敏捷包?
  • 你的最终目标是什么?提供登录工具?
  • 是的,我想在不显示 webbrowser 控制的情况下提供登录和订票功能,我想问你一些事情。有什么方法可以获取 webbrowser 控件的屏幕截图,以便我可以捕获 captch 的屏幕截图,感谢您的帮助
【解决方案2】:

上面的代码工作得很好,考虑到: 1- 项目类型- 如您的网页目标示例(“IMG”)。 2-图像专有名称示例:CaptchaImg.jpg 写为 CaptchaImg.jpg 3-添加对(mshtml)的引用并将mshtml导入您的项目 4-右键单击项目上的引用->单击添加引用-> -->浏览按钮单击-选择或导航到---> C:\Windows\assembly\GAC\Microsoft.mshtml\7.0.3300.0__b03f5f7f11d50a3a\Microsoft.mshtml.dll ----> 确定按钮单击 --- 这会将 Microsoft.mshtml.dll 添加到您的参考中 finallt 以 (Imports mshtml) 的形式导入您的项目。 5- 将目录 bmp.Save("c:\test.bmp")---> 更改为例如 bmp.Save("c:\test\test.bmp") 为安全和管理权特权。

【讨论】:

    猜你喜欢
    • 2016-04-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多