在不使用 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 hplogo
从 https://www.google.com 获取 google 徽标。
我也测试了上面的代码,通过浏览 https://demos.captcha.com/demos/features/captcha-demo.aspx 并通过 c_captchademo_samplecaptcha_CaptchaImage
找到验证码图像作为验证码图像的 id。
我知道这个问题听起来很熟悉,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
hplogo
从 https://www.google.com 获取 google 徽标。我也测试了上面的代码,通过浏览 https://demos.captcha.com/demos/features/captcha-demo.aspx 并通过
c_captchademo_samplecaptcha_CaptchaImage
找到验证码图像作为验证码图像的 id。