15 分钟破解网站验证码

作者: xiaochao 原文:http://www.bugcode.cn/break_captcha.html

概述

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

样本采集工具

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

目标估计

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

目前花费了两分钟。

依赖

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

  • python3
  • opencv
  • keras
  • tensorflow

创建样本集

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

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

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

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

如何训练

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

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

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

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

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

首先准备一个图片:

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

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

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

切割完的效果是:

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

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

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

训练模型

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

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

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

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

总结

整个过程看起来很简单:

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

下面是我的测试:

代码

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

  • 英文原文
  • 下载代码

觉得本文对你有帮助?请分享给更多人。

原文发布于微信公众号 - 程序员宝库(chengxuyuanbaoku)

原文发表时间:2018-01-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏绿巨人专栏

机器学习实战 - 读书笔记(04) - 朴素贝叶斯

2977
来自专栏QQ音乐技术团队的专栏

GIF简述及其在QQ音乐的应用

GIF(Graphics Interchange Format)是CompuServe公司在1987年开发的图像文件格式,原义是图像互换格式。GIF是一种基于L...

6990
来自专栏FreeBuf

中文点选验证码之自动识别

某次测试中遇到了汉字点选的验证码,看着很简单,尝试了一下发现有两种简单的识别方法,终于有空给重新整理一下,分享出来。

9094
来自专栏MixLab科技+设计实验室

设计师编程指南之Sketch插件开发 6

往期文章索引: 1 / 入门基本概念、page的相关操作 2 / artboard 、NSFileManager 和 NSString 关于文件及文件夹的相关操...

3035
来自专栏生信宝典

R语言学习 - 火山图

火山图 火山图用于展示基因表达差异的分布,横轴为Log2 Fold Change,越偏离中心差异倍数越大;纵轴为(-1)*Log10 P_adjust,值越大差...

3487
来自专栏有趣的Python

14- 深度学习之神经网络核心原理与算法-TensorBoard使用

1724
来自专栏hotqin888的专栏

golang随机抽奖代码

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hotqin888/article/det...

2872
来自专栏北京马哥教育

Kmeans聚类代码实现及优化

云豆贴心提醒,本文阅读时间6分钟 这篇文章直接给出上次关于Kmeans聚类的篮球远动员数据分析案例,最后介绍Matplotlib包绘图的优化知识。 希望这篇文...

3195
来自专栏IT派

最新|官方发布:TensorFlow 数据集和估算器介绍

TensorFlow 1.3 引入了两个重要功能,您应当尝试一下: 数据集:一种创建输入管道(即,将数据读入您的程序)的全新方式。 估算器:一种创建 Tens...

4335
来自专栏菩提树下的杨过

Matplotlib新手上路(上)

matplotlib是python里用于绘图的专用包,功能十分强大。下面介绍一些最基本的用法: 一、最基本的划线 先来一个简单的示例,代码如下,已经加了注释: ...

29510

扫码关注云+社区