首页 新闻 会员 周边 捐助

C# 获取动态验证码?

0
悬赏园豆:100 [待解决问题]

如何获取动态验证码(比如登录验证码,每次访问码值都是不一样的)。本来想从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、用图片验证还有一个问题,验证码有时候显示失败,就导致后面所有的工作都没效了。

 

小白快跑的主页 小白快跑 | 初学一级 | 园豆:109
提问于:2014-05-11 00:28
< >
分享
所有回答(5)
0

验证码肯定是保存在服务器的,跟会话关联。一般情况下,如果开发网站的人不是新手的话,

你想要自动验证,只能解析验证码图片

吴瑞祥 | 园豆:29449 (高人七级) | 2014-05-11 08:21

意思就是没有很好的可行方法?

支持(0) 反对(0) 小白快跑 | 园豆:109 (初学一级) | 2014-05-11 21:55
0

你是很多人访问的大型网站吗

我觉得你这个方法可以啊

男人要爽 | 园豆:6 (初学一级) | 2014-05-11 10:26
0
        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;
        }

这是我以前破解验证码用到的获取图片的代码

刘宏玺 | 园豆:14020 (专家六级) | 2014-05-11 12:43

嗯,这个上题目中的方法实现的效果是一致的,都是从Image的DomElement到来Image.

支持(0) 反对(0) 小白快跑 | 园豆:109 (初学一级) | 2014-05-11 21:55

@小白快跑: 验证码显示失败就模拟点击刷新验证码啊,知道存在验证码了再提交服务器不就得了!

支持(0) 反对(0) 刘宏玺 | 园豆:14020 (专家六级) | 2014-05-12 10:00

@博客¥: 我的问题其实是如何不用WebBrowser和mshtml.dll这个方式。

支持(0) 反对(0) 小白快跑 | 园豆:109 (初学一级) | 2014-05-12 10:06

@小白快跑: 那就得看看他的验证码的值是不是保存在客户端了,如果保存在客户端的话就要想办法解密了。
然后就可以直接提交了,一些大型的网站为了效率是不用session的

支持(0) 反对(0) 刘宏玺 | 园豆:14020 (专家六级) | 2014-05-12 10:09

@小白快跑: 我的问题其实是如何不用WebBrowser和mshtml.dll这个方式。

通过模拟请求验证码图片地址获取验证码图片。

然后做下一步处理。

支持(0) 反对(0) 喵喵喵猫 | 园豆:1742 (小虾三级) | 2014-05-14 09:25
0

我记得c#中可以通过drawing生成验证码,不用WebBrowser和mshtml.dll

fixbug11 | 园豆:10 (初学一级) | 2014-05-13 17:51

不是生成验证码, 是获取别人生成的验证码。

支持(0) 反对(0) 小白快跑 | 园豆:109 (初学一级) | 2014-05-21 10:39
0

验证码不用纠结,直接使用验证码破解插件 基本上能实现 百分之九九

落幕残情 | 园豆:34 (初学一级) | 2014-05-13 18:30

其实我的问题是如何获取验证码,不是验证码识别。^_^

支持(0) 反对(0) 小白快跑 | 园豆:109 (初学一级) | 2014-05-21 10:40

@小白快跑: 读取远程 的验证码???

直接使用HttpWebRequest获取图片的文件流呀  跟获取网页源码一样 然后把文件流转换成 图片就是啦

支持(0) 反对(0) 落幕残情 | 园豆:34 (初学一级) | 2014-07-02 11:06
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册