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

时间:2018-08-09 04:03:16

标签: c# .net winforms webbrowser-control captcha

我知道这个问题听起来很熟悉,并且在Google上有很多标题相同的帖子,但请相信我与众不同。

编辑器:VS2008(由于某些技术困难而无法升级)

问题

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

您为什么不使用SRC?

这是我试图从中获取我的 Captcha图片的网站 https://services.gst.gov.in/services/login
(一旦在“用户名”中输入任何内容,Capta图像就会出现)

现在,如果您右键点击验证码图片并转到检查元素,您将看到验证码的 SRC 为:-

enter image description here

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

,每当您尝试转到该链接时,它都会为您提供一个与上一个不同的验证码。这就是为什么我不能使用以下代码的原因,因为它显示的验证码与当前 WebBrowser 中显示的验证码不同。

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

1 个答案:

答案 0 :(得分:1)

您可以使用createControlRange来创建controlRange的非文本元素。然后找到图像标签,例如通过使用id,然后将图像标签添加到控制范围并调用其execCommand方法来执行Copy命令,最后从剪贴板:

.NET 3.5

添加对MSHTML的引用。您可以通过Microsoft HTML Object Library引用下的COM找到它,然后添加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 hplogo的{​​{3}}获取了Google徽标。

  • 我还通过浏览https://www.google.com并通过c_captchademo_samplecaptcha_CaptchaImage查找验证码图像的ID来找到上述验证码图像。