我知道这个问题听起来很熟悉,并且在Google上有很多标题相同的帖子,但请相信我与众不同。
编辑器:VS2008(由于某些技术困难而无法升级)
如何在不使用 SRC 的情况下从 Web浏览器获取验证码图像?
这是我试图从中获取我的 Captcha图片的网站
https://services.gst.gov.in/services/login
(一旦在“用户名”中输入任何内容,Capta图像就会出现)
现在,如果您右键点击验证码图片并转到检查元素,您将看到验证码的 SRC 为:-
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"));
答案 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来找到上述验证码图像。