怎么获取网站的动态验证码图片?

J2EE 码拜 10年前 (2015-08-12) 2746次浏览
 

想获取当我准备要登录百度注册的时候,获得验证码图片,

本来想用HttpURLConnection.openConnection这个方法,获取那个验证码的,

但是在百度注册的时候,那个验证码,每次刷新网页,那串验证码图片的网址都不一样的。

所以说HttpURLConnection.openConnection这个方法是失效的(或者说自己不会用)。

https://passport.baidu.com/v2/?reg&fr=old&tpl=al&u=http://open.baidu.com/?reg=pass

现在的话,我只能在它加载完网页之后,才能正确读取当前真正的验证码,

那我有什么办法,在它不加载完网页之前,就获取我准备将要要登录百度注册网站的验证码图片?

其实不是很懂它,验证码的生成原理,就我猜的有两种,

1.在它完全加载完那个网站之后 -> 验证码图片才会触发-> 正确生成 -> 显示出来。

2.先发一个信号给那个网站,-> 生成验证码 -> 加载整个网站之后 -> 把生成的验证码显示出来。

不知道还会不会有其它方法,如果是发信号的话,那我应该有什么技巧或者方法,可以

或者这个信号。

说得有点乱,不过应该能看得懂吧?

#1

30分

你不用纠结页面有没有加载完,验证码是和会话session挂钩的,session是和cookie挂钩的,你只要获取cookie就可以了随意获取当前会话有效的验证码图片
#2

回复1楼:

那我要获得这个验证码的cookie,该怎么办?

#3

回复2楼:

拿cookie,请求的时候把cookie带上。

不要问我怎么拿cookie。

#4
楼上说的都对

补充一点 cookie是用http header发送的,往来都(可以)有。

#5

10分

浏览器模拟,抓包工具看看。
#6

回复3楼:

是这样拿吗?昨天百度了一天:

                    

                    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                    

                    // 设置 URL 请求的方法
                    

                    conn.setRequestMethod("GET");
                    

                    String cookie = conn.getHeaderField("set-cookie");
                    

                    System.out.println("cookie : " + cookie);
                    

                    

但是出现的是这个,不是图片的连接地址吖。


 cookie : PASSID=gvXk8V; expires=Thu, 20-Jun-2013 00:42:08 GMT; path=/; domain=passport.baidu.com; httponly

难道是我拿的方式不正确?

我是用百度注册那个网站测试的:https://passport.baidu.com/v2/?reg&fr=old&tpl=al&u=http://open.baidu.com/?reg=pass

我知道你不喜欢伸手党,但是现在我真的不知道怎么下手来解决这个问题,怎么百度,怎么搜索也不知道,

#7

回复4楼:

你说的是这样吗:

                    

                    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                    

                    // 设置 URL 请求的方法
                    

                    conn.setRequestMethod("GET");
                    

                    String cookie = conn.getHeaderField("set-cookie");
                    

                    System.out.println("cookie : " + cookie);
                    

但是打印出来的,不是验证码的图片的连接地址啊。


 cookie : PASSID=gvXk8V; expires=Thu, 20-Jun-2013 00:42:08 GMT; path=/; domain=passport.baidu.com; httponly

昨天搜索了一天,都还不是很能理解你说的意思,都不知道关键词是不是没有打对。

#8
下个httpwatch 观察下验证码后面带的那一串字符时怎么来的

这个还是很好解决的

#9
抓到图片,如何识别呢,再加个图片识别?
#10
sorry, 我理解错了你的问题,我以为你是想要保持会话,结果你不是。

我刚才看了一下baidu的交互流程,有点复杂。没有研究完全,有兴趣你可以自己研究一下。

https://passport.baidu.com/cgi-bin/genimage?captchaservice636364325a56754534414a7a4944416c764d7a3538474c4839654e4a78564434357176417565714736756d6346466a6c636b65722f77526c42383037667843536341786f5069396a31376341683264624e37362f70436d586239385553734a6a674153465a4d6e7350694c51522b74746746674765627a4262365549356367656267433830784b3858426b6e6173713467555770386d586f55637536372f345052656666645a7a47317a384871502b4e30554e755a694c57387a4442645570746a444d7466652f67546a424953732f52786279383241455749535a44617a52726b64453136574d3547363431494a7055426c5634695041787a426b2f3351786e4766567158354b6e532b5a71416d61696245796b2f6b7769325246647a4a774d3449746e

这是百度获取验证码的链接,参数captchaservice后面那一长串是百度服务器动态生成的,这就是为什么你每次刷新页面验证码都不一样的原因。

https://passport.baidu.com/v2/?reggetcodestr&token=6f384f575823212d16315309df7070a6&tpl=al&apiver=v3&tt=1403242386354&app=&callback=bd__cbs__1feny9

通过这个链接可以请求到上面那个captchaservice后面的参数,但是这个请求中的参数token什么的具体怎么来的我就没仔细看了。

百度在这个前端的交互不是一般的复杂,虽然web公网不安全,但是要研究透这些交互协议,很要花一些时间。

#11
网站的大部分验证码都是图片做的。后台存在session中,如果要动态识别验证码的话,也很简单。就是把请求连接中的验证码图片保存下来,使用图片识别技术,就可以知道图片上是什么验证码了。这个对于简单的,颜色单一,不算复杂,非动态的,还是小菜。对于动态的,就比较难了。不过谷歌已经表过态,对于目前的验证码,基本上可以99.9%的破解。谷歌也在积极的开发更安全的,下一代验证码技术。
#12

回复11楼:

谢谢回复,其实我不需要用图片识别技术的。

但是你说的,我有一点不是很明白,就是




把请求连接中的验证码图片保存下来


你是怎么可以把验证码的图片保存下来?

你怎么获得这个验证码的图片?

就拿百度注册这个来说:

https://passport.baidu.com/v2/?reg

你用程序怎么实现?

#13

回复10楼:

您好,如果我能准确获得你这个

https://passport.baidu.com/v2/?reggetcodestr&token=6f384f575823212d16315309df7070a6&tpl=al&apiver=v3&tt=1403242386354&app=&callback=bd__cbs__1feny9

地址的话,那我整体的流程到底是怎么样的?

搞了那么久,我连流程都还不懂,

拿https://passport.baidu.com/v2/?reg来实现的话:

第一步是不是:

Url url = new Url(“https://passport.baidu.com/v2/?reg”);

HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 

用了前几楼的前辈所介绍的httpwatch的工具,研究了一个下午,也刚好跟上你的脚步,也是研究到

https://passport.baidu.com/v2/?reggetcodestr&token=6f384f575823212d16315309df7070a6&tpl=al&apiver=v3&tt=1403242386354&app=&callback=bd__cbs__1feny9

这里,就不知道怎么办了,

不过现在我更不明白的整个流程是怎么样的。


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明怎么获取网站的动态验证码图片?
喜欢 (0)
[1034331897@qq.com]
分享 (0)