在不使用 SRC 的情况下从 Web 浏览器控件获取验证码图像

Get Captcha Image from Web Browser control without using SRC

我知道这个问题听起来很熟悉,google 上有很多标题相同的帖子,但请相信我,这是不同的。

编辑 : VS2008(技术问题无法升级)

问题

如何在不使用 SRC 的情况下从 Web 浏览器 获取 Captcha 图像

你为什么不使用 SRC?

这是我试图从中获取我的验证码图像的网站 https://services.gst.gov.in/services/login
(一旦您在用户名中键入任何内容,就会出现 capta 图像)

现在,如果您右键单击 Captcha Image 并转到检查元素,您将看到验证码的 SRC 是: -

https://services.gst.gov.in/services/captcha?rnd=0.5313315062651027

并且每当您尝试转到 link 时,它都会为您提供一个与之前不同的验证码。这就是为什么我不能使用下面的代码,因为它显示的验证码与现在 WebBrowser 中显示的验证码不同。

HtmlElement element = webBrowser1.Document.GetElementById("imgCaptcha");
string src = element.GetAttribute("src");
pictureBox1.Load(element.GetAttribute("src"));

可以使用createControlRange to create a controlRange of non-text elements. Then find the image tag, for example by using id, then add the image tag to the control range and call it's execCommand方法执行Copy命令,最后从剪贴板中获取图片:

.NET 3.5

添加对 MSHTML 的引用。您可以在 COM 参考下通过 Microsoft HTML Object Library 找到它,然后添加 using mshtml;。那么:

IHTMLElement2 body = (IHTMLElement2)webBrowser1.Document.Body.DomElement;
IHTMLControlRange controlRange = (IHTMLControlRange)body.createControlRange();
IHTMLControlElement element = (IHTMLControlElement)webBrowser1.Document
    .GetElementById("imgCaptcha").DomElement;
controlRange.add(element);
controlRange.execCommand("Copy", false, null);
pictureBox1.Image = (Bitmap)Clipboard.GetDataObject().GetData(DataFormats.Bitmap); 

.NET >= 4.0

不需要加引用,可以利用dynamic:

dynamic body = webBrowser1.Document.Body.DomElement;
dynamic controlRange = body.createControlRange();
dynamic element = webBrowser1.Document.GetElementById("imgCaptcha").DomElement;
controlRange.add(element);
controlRange.execCommand("Copy", false, null);
pictureBox1.Image = (Bitmap)Clipboard.GetDataObject().GetData(DataFormats.Bitmap);

注:

  • 运行 文档完成时的代码,例如在 DocumentCompleted 事件中。

  • 您可能还想在代码中添加 null 检查。

  • 我使用上面的代码通过 id hplogohttps://www.google.com 获取 google 徽标。

  • 我也测试了上面的代码,通过浏览 https://demos.captcha.com/demos/features/captcha-demo.aspx 并通过 c_captchademo_samplecaptcha_CaptchaImage 找到验证码图像作为验证码图像的 id。