如何获取动态验证码(比如登录验证码,每次访问码值都是不一样的)。本来想从cookie上入手但是,每次访问虽然码值不一样,但是后来发现它们的cookie一样的。这个道路就行不通了。
目前知道一个解决方案,就是通过WebBrowser获取然后显示的html,1、种方法直接截图;2、将图片元素的DomElement作为参数,方法如下。但是这种方法效率太低..,求高效的方法。
结合mshtml.dll.
能用HttpWebRequest和HttpWebResponse的最好。
[ComImport, InterfaceType((short)1), Guid("3050F669-98B5-11CF-BB82-00AA00BDCE0B")]
private interface IHTMLElementRenderFixed
{
void DrawToDC(IntPtr hdc);
void SetDocumentPrinter(string bstrPrinterName, IntPtr hdc);
}
public Bitmap GetImage(object obj)
{
IHTMLImgElement img = (IHTMLImgElement)obj;
IHTMLElementRenderFixed render = (IHTMLElementRenderFixed)img;
Bitmap bmp = new Bitmap(img.width, img.height);
Graphics g = Graphics.FromImage(bmp);
IntPtr hdc = g.GetHdc();
render.DrawToDC(hdc);
g.ReleaseHdc(hdc);
return bmp;
}
1、用图片验证还有一个问题,验证码有时候显示失败,就导致后面所有的工作都没效了。
验证码肯定是保存在服务器的,跟会话关联。一般情况下,如果开发网站的人不是新手的话,
你想要自动验证,只能解析验证码图片
意思就是没有很好的可行方法?
你是很多人访问的大型网站吗
我觉得你这个方法可以啊
private Image GetWebImage(WebBrowser WebCtl, HtmlElement ImgeTag) { HTMLDocument doc = (HTMLDocument)WebCtl.Document.DomDocument; HTMLBody body = (HTMLBody)doc.body; IHTMLControlRange rang = (IHTMLControlRange)body.createControlRange(); IHTMLControlElement Img = (IHTMLControlElement)ImgeTag.DomElement; //图片地址 Image oldImage = Clipboard.GetImage(); rang.add(Img); rang.execCommand("Copy", false, null); //拷贝到内存 Image numImage = Clipboard.GetImage(); try { Clipboard.SetImage(oldImage); } catch { } return numImage; }
这是我以前破解验证码用到的获取图片的代码
嗯,这个上题目中的方法实现的效果是一致的,都是从Image的DomElement到来Image.
@小白快跑: 验证码显示失败就模拟点击刷新验证码啊,知道存在验证码了再提交服务器不就得了!
@博客¥: 我的问题其实是如何不用WebBrowser和mshtml.dll这个方式。
@小白快跑: 那就得看看他的验证码的值是不是保存在客户端了,如果保存在客户端的话就要想办法解密了。
然后就可以直接提交了,一些大型的网站为了效率是不用session的
@小白快跑: 我的问题其实是如何不用WebBrowser和mshtml.dll这个方式。
通过模拟请求验证码图片地址获取验证码图片。
然后做下一步处理。
我记得c#中可以通过drawing生成验证码,不用WebBrowser和mshtml.dll
不是生成验证码, 是获取别人生成的验证码。
验证码不用纠结,直接使用验证码破解插件 基本上能实现 百分之九九
其实我的问题是如何获取验证码,不是验证码识别。^_^
@小白快跑: 读取远程 的验证码???
直接使用HttpWebRequest获取图片的文件流呀 跟获取网页源码一样 然后把文件流转换成 图片就是啦