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

mimixi666 发布于 2014/06/18 18:01
阅读 7K+
收藏 1

其实我想获取当我准备要登录百度注册的时候,获得验证码图片,
本来想用HttpURLConnection.openConnection这个方法,获取那个验证码的,
但是在百度注册的时候,那个验证码,每次刷新网页,那串验证码图片的网址都不一样的。。
所以说HttpURLConnection.openConnection这个方法是失效的(或者说自己不会用)。。
https://passport.baidu.com/v2/?reg&fr=old&tpl=al&u=http://open.baidu.com/?reg=pass

现在的话,我只能在它加载完网页之后,才能正确读取当前真正的验证码,
那我有什么办法,在它不加载完网页之前,就获取我准备将要要登录百度注册网站的验证码图片?

其实不是很懂它,验证码的生成原理,就我猜的有两种,
1.在它完全加载完那个网站之后 -> 验证码图片才会触发-> 正确生成 -> 显示出来。
2.先发一个信号给那个网站,-> 生成验证码 -> 加载整个网站之后 -> 把生成的验证码显示出来。

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

说得有点乱,不过应该能看得懂吧?
加载中
0
未注册用户
未注册用户
加载验证码图片时会设置一个cookie,后台验证时根据这个cookie判断。只需要获取一次,保存后识别,然后提交上去。别忘了用cookiejar
0
mimixi666
mimixi666

引用来自“未注册用户”的评论

加载验证码图片时会设置一个cookie,后台验证时根据这个cookie判断。只需要获取一次,保存后识别,然后提交上去。别忘了用cookiejar

那我应该要如何才能获取这个验证码的图片?

是不是这样?

HttpURLConnection conn = (HttpURLConnection) url.openConnection();
  conn.setRequestMethod("GET");
  String cookie = conn.getHeaderField("set-cookie");//对应你上面说的:加载验证码图片时会设置一个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

还有那个cookiejar是什么用的?

我百度了一下,发觉它是python的东西,和java有什么关系?

 

未注册用户
未注册用户
没注意你用的什么语言,但是原理是一样的,你f12看下会发现有设置cookie~cookiejar是python的,一个cookie自动管理的东西吧,java里找不到差不多的东西直接手动提取到然后设置算了。
0
唐代de豆腐
唐代de豆腐
我来说说,之前做过这个。

不管你前台你用什么展示,但是后台肯定 是这个逻辑。

先用 HttpURLConnection 得到图片流,注意:将这个对象中的cookie取出来。取出对应的domain,value,过期时间。保存在数据库或是文件当中。当你前台显示图片,并且输入验证友后,你再把之前那个cookie序列成对象,和你的表单一起提交。。

懂了吗?  

0
唐代de豆腐
唐代de豆腐
你已经离成功不远了。自己做试验。
0
寒川
寒川
获取验证码和对应的cookie,将验证码图片拿去处理识别,识别完后与cookie一起提交进行验证码自动识别。
0
mimixi666
mimixi666

引用来自“糖度”的评论

我来说说,之前做过这个。

不管你前台你用什么展示,但是后台肯定 是这个逻辑。

先用 HttpURLConnection 得到图片流,注意:将这个对象中的cookie取出来。取出对应的domain,value,过期时间。保存在数据库或是文件当中。当你前台显示图片,并且输入验证友后,你再把之前那个cookie序列成对象,和你的表单一起提交。。

懂了吗?  

您好,期待你再次关注这个问题。

我现在核心的就是:

1.不是很懂如何利用HttpURLConnection来获取那个验证码的图片流。

2.验证码的流程也不是很懂,他怎么样才会肯发那个验证码给我?

 

还有我返回数据的时候,把之前保存的对应的domain,value,过期时间取出来加上验证码,一起返回才行?还需要其它数据吗??

期待你的回复。。

0
mimixi666
mimixi666

引用来自“寒川”的评论

获取验证码和对应的cookie,将验证码图片拿去处理识别,识别完后与cookie一起提交进行验证码自动识别。

您好,现在我主要碰到的问题是,不知道怎么获取验证码?

不懂在没加载完那个网页之前获取验证码。。

期待你的回复。。

0
mimixi666
mimixi666

引用来自“糖度”的评论

我来说说,之前做过这个。

不管你前台你用什么展示,但是后台肯定 是这个逻辑。

先用 HttpURLConnection 得到图片流,注意:将这个对象中的cookie取出来。取出对应的domain,value,过期时间。保存在数据库或是文件当中。当你前台显示图片,并且输入验证友后,你再把之前那个cookie序列成对象,和你的表单一起提交。。

懂了吗?  

您好,再次打扰一下你,刚刚测试一番,我是用百度网站注册来测试的。https://passport.baidu.com/v2/?reg

发觉得到那个验证码的步骤需要两个步骤:

1.首先要在这个地址

https://passport.baidu.com/v2/api/?getapi&tpl=&apiver=v3&tt=1403600195468&class=reg&app=&callback=bd__cbs__r6os13

找到:

bd__cbs__r6os13({"errInfo":{ "no": "0" }, "data": { "rememberedUserName" : "kaluosi0", "codeString" : "captchaservice3235626146356e6b35355a692b49337457354d6831414d5741356a4d5a5a4566663670724f437336694a7267374844597a61664635596c2b70636a6e4c43626a4c304634584d354c786a726f31667637756662524f636a6e5474484f4b4d376c7053666946712f4a706a502f6e47714a506f436d725531714c795746364d4b32583375372f3067756572744d742b55675076383076657261754f3835757865556a584c7558347a7542664c66394e306d5933305572744a6f764b5a4354794570464164397a795a7939426b4d44754145766c35726c33737749697838696b63383341716834523543466771354a5949415a6f6c6576767a6a487a67354a67466d31744b54504274496c4d4e316e364d393655766332716277566c6539724b6132424a47672b413469", "token" : "5e4987883b49beac2105b39cd2395c10", "cookie" : "1", "usernametype":"1", "spLogin" : "rate", "disable":"", "loginrecord":{ 'email':[ ], 'phone':[ ] } }})

截那个 captchaservice....95c10这段代码。

2.把它并到

这里去,即

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

 

上面那个就是验证码图片的地址,不过每次刷新验证码的地址都不一样,即

https://passport.baidu.com/v2/api/?getapi&tpl=&apiver=v3&tt=1403600195468&class=reg&app=&callback=bd__cbs__r6os13

每次刷新都不一样。

 

但是问题是,在我获得这个验证码的图片之前还有之后我该怎么做?

是不是要请求某些网址,等待返回些信息,然后保存这样的?

流程是怎么样的?

就拿https://passport.baidu.com/v2/?reg这个网址来说。

 

大神,我扣扣980914629,你看到之后,希望你能加加我,我很想学好这个技术,谢谢,不会打扰你太长时间的,麻烦了。。

0
mimixi666
mimixi666

引用来自“糖度”的评论

我来说说,之前做过这个。

不管你前台你用什么展示,但是后台肯定 是这个逻辑。

先用 HttpURLConnection 得到图片流,注意:将这个对象中的cookie取出来。取出对应的domain,value,过期时间。保存在数据库或是文件当中。当你前台显示图片,并且输入验证友后,你再把之前那个cookie序列成对象,和你的表单一起提交。。

懂了吗?  

引用来自“mimixi666”的评论

您好,再次打扰一下你,刚刚测试一番,我是用百度网站注册来测试的。https://passport.baidu.com/v2/?reg

发觉得到那个验证码的步骤需要两个步骤:

1.首先要在这个地址

https://passport.baidu.com/v2/api/?getapi&tpl=&apiver=v3&tt=1403600195468&class=reg&app=&callback=bd__cbs__r6os13

找到:

bd__cbs__r6os13({"errInfo":{ "no": "0" }, "data": { "rememberedUserName" : "kaluosi0", "codeString" : "captchaservice3235626146356e6b35355a692b49337457354d6831414d5741356a4d5a5a4566663670724f437336694a7267374844597a61664635596c2b70636a6e4c43626a4c304634584d354c786a726f31667637756662524f636a6e5474484f4b4d376c7053666946712f4a706a502f6e47714a506f436d725531714c795746364d4b32583375372f3067756572744d742b55675076383076657261754f3835757865556a584c7558347a7542664c66394e306d5933305572744a6f764b5a4354794570464164397a795a7939426b4d44754145766c35726c33737749697838696b63383341716834523543466771354a5949415a6f6c6576767a6a487a67354a67466d31744b54504274496c4d4e316e364d393655766332716277566c6539724b6132424a47672b413469", "token" : "5e4987883b49beac2105b39cd2395c10", "cookie" : "1", "usernametype":"1", "spLogin" : "rate", "disable":"", "loginrecord":{ 'email':[ ], 'phone':[ ] } }})

截那个 captchaservice....95c10这段代码。

2.把它并到

这里去,即

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

 

上面那个就是验证码图片的地址,不过每次刷新验证码的地址都不一样,即

https://passport.baidu.com/v2/api/?getapi&tpl=&apiver=v3&tt=1403600195468&class=reg&app=&callback=bd__cbs__r6os13

每次刷新都不一样。

 

但是问题是,在我获得这个验证码的图片之前还有之后我该怎么做?

是不是要请求某些网址,等待返回些信息,然后保存这样的?

流程是怎么样的?

就拿https://passport.baidu.com/v2/?reg这个网址来说。

 

大神,我扣扣980914629,你看到之后,希望你能加加我,我很想学好这个技术,谢谢,不会打扰你太长时间的,麻烦了。。

我最后的成果是这样:

链接: http://pan.baidu.com/s/1i5yrpml 密码: 68mg

这是android上的java代码,大家可以参考下

返回顶部
顶部