图形验证码了解一下?真的很简单,为什么这么多人会觉得难?

图形验证码了解一下?真的很简单,为什么这么多人会觉得难?

 

图形验证码了解一下?真的很简单,为什么这么多人会觉得难?

 

实现

大致了解下cookie,不至于那么不清不楚;那就继续拉;

一般来说,每次访问网址,浏览器都会把cookie发送给服务器,而验证码就是和这个cookie绑定在一起的;

举个例子:

  • 现在有网址T,有用户A和B两个人同事访问T
  • T给A返回的验证码是X,给B返回的验证码是Y,这两个验证码都正确
  • 如果A输入B的验证码,是验证不通过的

那服务器怎么区分A和B?那就是用cookie;

cookie是标示唯一身份的,比如有些网站,登录一次后会自动登录,但是如果清除了cookie,就无法自动登录了,而且这cookie是个别人不一样的;

说到这里,服务器后台生成验证码的流程就很容易理解了:

  • 先随机生产一个随机字符串
  • 然后和cookie绑定
  • 再写到图片上返回给你

那,怎么生成一个图片验证码?

生成图片验证码

图形验证码了解一下?真的很简单,为什么这么多人会觉得难?

 

效果图:

图形验证码了解一下?真的很简单,为什么这么多人会觉得难?

 

验证码就这样生成啦~

验证码的获取

回到一开始的网站:http://icp.alexa.cn/index.php

打开后发现,网页自动就显示验证码了,有办法获取到这个验证码吗?F12刷新一波试试

图形验证码了解一下?真的很简单,为什么这么多人会觉得难?

 

有一个这样的请求,点击后的确就是验证码的图片了;

图形验证码了解一下?真的很简单,为什么这么多人会觉得难?

 

链接如下:

http://www.alexa.cn/api/icp/vcode?host=hcainfo&flag=f419510445e39e61cc32a7efd7552ed1&R=0.37766116804135375

从链接分析,有3个参数:

图形验证码了解一下?真的很简单,为什么这么多人会觉得难?

 

1)没有host这个值就获取不到验证码;

2)及时有host,值不对也是获取不到验证码;

3)那是不是说明,验证码是跟这个值绑定的?

url参数就到这里了,接下来请求头吧~

没太特别,直接把整个请求头copy过来用就行了:

import requestsfrom PIL import Imageimport iogetCode_url = "http://www.alexa.cn/api/icp/vcode?host=hcainfo&flag=f419510445e39e61cc32a7efd7552ed1&R=0.37766116804135375"header = { "Referer":"http://icp.alexa.cn/", "User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36"}response = requests.get(getCode_url,headers=header).contentimage = Image.open(io.BytesIO(response))image.show()

这上面的代码,好像没什么特别,应该不需要说明的;

运行的结果就是:

图形验证码了解一下?真的很简单,为什么这么多人会觉得难?

 

整体的代码:

import requestsfrom PIL import Imageimport iodef getCode(url): print("获取验证码") getCode_url = "http://www.alexa.cn/api/icp/vcode?host=jlcainfo&flag=61684048f21350aa2767b82315a0f487&R=0.5917477648057996" header = { "Referer":"http://icp.alexa.cn/", "User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36" } response = requests.get(getCode_url,headers=header).content image = Image.open(io.BytesIO(response)) print("获取验证码成功") image.show()def checkcode(url,code): print("开始检查验证码") checkcode_url = "http://www.alexa.cn/home/index/query?token=1a63a83b2xwDdXlEmmIldi-Cx729izemOE54BDjY8jnT-JCvU3Atg0W1gCrBVbMSs-O&flag=61684048f21350aa2767b82315a0f487&host=jlcainfo&flag&domain=qq.com&type=icp&type=icp&vcode="+code header = { "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8", "Accept-Encoding":"gzip, deflate", "Accept-Language":"zh-CN,zh;q=0.9", "Connection":"keep-alive", "Cookie":"SL_GWPT_Show_Hide_tmp=1; SL_wptGlobTipTmp=1; exi_query_history=nseyfqfp4SgNKMagNO-DctlkEDqameDvLLDbwUIuYCiHNkoLJPniHTUs0RIAq5jNEZ8ojjeoe8W8y1Df6vuMiy8r-H37690i99d0LZ3iyTWMVmstIOcGqb5H-DY1k2Gn3FNdj02TwpVtlca1b1lrvrdSfE-HbUGwP3Lfex0D9Hzeu48-N", "Host":"www.alexa.cn", "Referer":"http://icp.alexa.cn", "Upgrade-Insecure-Requests":"1", "User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36" } response = requests.get(checkcode_url,headers=header) print(response.content) print(response.status_code)if __name__ == "__main__": getCode("qq.com") code = input("请输入验证码:") checkcode("qq.com",code)

本来是想弄个,自动拉取验证码图片,手动输入后自动拉取结果,但是执行的时候,还是被网站识别出来了,想了很久还没想明白,算了留下了一个烂摊子吧~

图形验证码了解一下?真的很简单,为什么这么多人会觉得难?

 

进群:125240963  即可获取源码!

猜你喜欢

转载自www.cnblogs.com/PY147/p/9187441.html
今日推荐