15分钟破解网站验证码

摘要:
机器识别验证码的问题相对容易解决。在示例收集工具中,我们使用Wordpress的ReallySimpleCAPTCHA插件来生成验证代码。我们可以使用它批量生成验证码图像。我们可以轻松地批量生成10000个验证码图像和相应的结果。这种训练方法使用较少的样本数据。此方法是在图像中剪切四个字符,因为所有验证码图像都是四个字符。形成单个字符的图片样本,并将两个字符裁剪器放入一张图片中。

 

概述

很多开发者都讨厌网站的验证码,特别是写网络爬虫的程序员,而网站之所以设置验证码,是为了防止机器人访问网站,造成不必要的损失。现在好了,随着机器学习技术的发展,机器识别验证码的问题比较好解决了。

样本采集工具

这里我们采用wordpress的Really Simple CAPTCHA生成验证码的插件,之所以选择这个插件,一个是它的安装量很大,二个是因为它是开源的,我们可以利用它批量的生成验证码图片。

目标估计

我们通过demo网站得知,Really Simple CAPTCHA生成的是包含4个数字或者字母的图片,通过阅读源码得知,这个插件还屏蔽了O和I这两个比较容易混淆的字母,也就是说,还剩下32个字符,看来可以完成。   目前花费了两分钟。

依赖

我们要用到以下的工具和库。

  • python3

  • opencv

  • keras

  • tensorflow

 

创建样本集

为了达到目的,我们首先要准备样本集,样本如下: 

15分钟破解网站验证码第1张

使用Really Simple CAPTCHA插件的源码,我们很方便的批量生成10000个验证码图片和对应的结果,待我们生成完成后,大概如下: 

15分钟破解网站验证码第2张

这地方大家可以根据自己的实际情况修改Really Simple CAPTCHA插件的源码,来生成自己想要的样本集。如果你觉着麻烦,也可以下载我生成好的。

目前为止,我们花了五分钟。

如何训练

我们现在有了样本集了,我们可以直接那图片和对应的结果直接进行神经网络的训练。

15分钟破解网站验证码第3张

 只要我们的样本够多,最终也能达到我们想要的效果。

但我们也可以采用更好的训练方法,这个训练方法使用更少的样本数据,但是结果要比直接训练的方法好很多,我想你已经猜到了,这个方法就是把图片中的四个字符切割开,形成四个样本。这方法之所以可行,是因为所有的验证码图片都是4个字符的。 

15分钟破解网站验证码第4张

10000张图片,一张一张手动用PS去切割,肯定不现实,而且由于图片的横向排列并不是等间距的,字符间的距离大小不一致,手动切割肯定不可能了。

 

15分钟破解网站验证码第5张

其实我们只要画出一个矩形,保证矩形框里只有字符就可以,然后从图片中切出这样的一个矩形,就形成了一个单个字符的图片样本。幸运的是,这个操作opencv已经帮我们实现了,opencv有个函数叫做findContours(),可以按照同样色值的区域裁剪我们想要的矩形。 - 首先准备一个图片:

15分钟破解网站验证码第6张

 - 转换图片为黑白色。这样有字符的地方为黑色,空白为白色,便于opencv裁剪。 

15分钟破解网站验证码第7张

-接下来我们用opencv的findContours函数切割图片。 

 15分钟破解网站验证码第8张

接下来,我们就把图片从左到右进行切割,并存储切割后的图片,以及图片对应的字符。但是实际操作的过程中,我发现一个问题,就是有时候两个字符靠的太近,导致opencv在切割的时候,把两个字符切割刀一个图片里了,比如: 

15分钟破解网站验证码第9张

切割完的效果是:

15分钟破解网站验证码第10张

 如果不解决这个问题,我们的样本集就不准了,那训练出来的模型也就不可能正确了。我的解决方法是,首先设置一个字符宽最大的像素,如果超过这个像素,则认为一个图片中包含了两个字符,然后我们选择把这个图片对半切割,分成两个字符。例如:

15分钟破解网站验证码第11张


 好,我们现在得到了一个验证码图片对应的4个字符的图片,现在我们把所有的样本图片都切割好,然后,把相同的字符对应的图片放到一个文件夹,这么做的目的是尽量多的找出同一个字符的多种样式。结果如下:

15分钟破解网站验证码第12张

到目前为止,我花了10分钟。

训练模型

因为我们只是识别图片对应的数字或者字母,所以我们不需要特别复杂的神经网络算法。识别字符比识别小猫小狗的简单多了。 

  

我这地方使用卷积神经网络,two convolutional layers and two fully-connected layers。 

15分钟破解网站验证码第13张

这地方对卷积神经网络算法就不做详细介绍,感兴趣的同学,可以google学习一下。  

训练完成后,我们需要测试一下。15分钟花完。

总结

整个过程看起来很简单: - 从使用我们上述提到的插件的wordpress网站上下载验证码图片 - 把图片切割成包含单个字符的小图片 - 使用神经网络算法训练模型 - 预测新的验证码图片对应的字符

下面是我的测试: 

15分钟破解网站验证码第14张

代码

https://pan.baidu.com/s/1o94k2k6

 你可以从这得到完整的代码和示例图片,你可以参照README来运行相关的程序。

免责声明:文章转载自《15分钟破解网站验证码》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇HTML 超链接 表格关于在SecureCRT中用pstree命令乱码问题下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Base64和urlencode

https://www.jianshu.com/p/b611e220ef2d Base64 使用base64的初衷。是为了方便把含有不可见字符串的信息用可见字符串表示出来 我们知道在计算机中任何数据都是按ascii码存储的,而ascii码的128~255之间的值是不可见字符。 而在网络上交换数据时,比如说从A地传到B地,往往要经过多个路由设备,由于不同的...

getchar()和scanf()混合使用的坑

最近在混合使用 getchar() 和 scanf() 的时候遇到一个坑,现在记录一下。 代码中使用 getchar() 处理字符输入,用 scanf() 处理数字输入。 getchar() 读取每个字符,包括空格、制表符和换行符; 而 scanf() 在读取数字时则会跳过空格、 制表符和换行符。 比如下面这个程序,读入一个字符和两个数字,然后根据输入的两...

带中文的字符串截取

最近在页面展示的时候遇到这样的场景,文字有可能超长,却又不允许换行。 当然,可以用高超的css来搞定。但如果你想要让多余的文字用“...”来代替,并且要兼容很多浏览器,这种时候用css也会很头疼吧。 1.C#对中文字符串的截取 与英文字符相比,我们把中文字符按两个占位来计算,对于带中文的字符串截取,要面临两个问题: 1.无法截取半个中文字符; 2.对于除...

Doskey命令详解

转自:https://blog.csdn.net/u012993732/article/details/48626921 调用 Doskey.exe,它撤回 Windows XP 命令、编辑命令行并创建宏。 MS-DOS命令语法 doskey {/reinstall | /listsize=size | /macros:[{all | exename}]...

Vue中如何给字符串前面加空格

  背景:        最近再用element UI写一个页面,输入框是必输的话,如果没有输入点提交,需要有个红色的提示信息。但是提示信息没有个输入框对齐,就想用加空格的方法来实现。后来发现通常的加空格的方法都无效       一、效果和代码如下:        二 、 想要的效果是提示信息和输入框对齐,网上没找到很好的方法,可能我加了label-w...

mysql中information_schema.columns字段说明

1. 获取所有列信息(COLUMNS) SELECT  *  FROM information_schema.COLUMNS WHERE  TABLE_SCHEMA='数据库名';  COLUMNS表:提供了关于表中的列的信息。详细表述了某个列属于哪个表。各字段说明如下:   字段 含义 table_schema  表所有者(对于schema的名称...