Python破译12306图像验证码!据说12306验证码是最难破解的?

476 阅读4分钟

前言

今天是用hackcaptcha库,结合开源的DecryptLogin包打造一个验证码可以自动处理而非手动输入的工具包。 废话不多说,让我们愉快地开始吧~

开发工具

Python版本:3.6.4

相关模块:

requests模块;

opencv-python模块;

numpy模块;

keras模块;

tensorflow模块;

以及一些python自带的模块。

安装python并添加到环境变量,pip安装需要的相关模块即可。

项目介绍

让我们先来简单介绍一下之前开源的DecryptLogin包,DecryptLogin是一个借助于requests包进行各大网站模拟登录的python第三方包,

pip安装这个包之后,你可以很轻松地实现各大网站的模拟登录操作,例如模拟登录知乎:

from DecryptLogin import login

lg = login.Login()
infos_return, session = lg.zhihu(username='Your Username', password='Your Password')

其中infos_return是一个字典对象,用于记录用户登录后的一些信息,而session则是用户登录之后的会话。进行模拟登录的意义在于很多网站的数据必须在用户登录的状态下才能看到,并且很多操作也必须在用户登录的状态下才能进行(例如每日签到等等)。

上面那段代码运行后效果如下:

​​​

换句话说,在默认情况下,DecryptLogin库要求用户手动输入登录时遇到的验证码。

能不能让DecryptLogin自动处理验证码呢?

答案是当然可以,你只需要自己定义一个验证码处理函数,然后在登录的时候作为参数传入就ok了,示例代码如下:

from PIL import Image
from DecryptLogin import login

'''定义验证码识别函数'''
def crackvcFunc(imagepath):
    # 打开验证码图片
    img = Image.open(imagepath)
    # 识别验证码图片
    result = IdentifyAPI(img)
    # 返回识别结果(知乎为数字验证码)
    return result

lg = login.Login()
infos_return, session = lg.zhihu(username='Your Username', password='Your Password', crackvcFunc=crackvcFunc)

上面这些内容其实在项目文档里都有详细的介绍。

hackcaptcha包诞生了,一款主要服务于验证码自动识别的python第三方包,项目文档:

https://hackcaptcha-en.readthedocs.io/zh/latest/

因为开源hackcaptcha的主要目的是解决DecryptLogin库的验证码自动处理问题,所以hackcaptcha目前只支持两种类型的验证码自动处理,即数字(含英文字母)验证码以及12306的点击验证码。当然,以后会随着DecryptLogin库的更新而逐渐加入一些新的支持。你只需要pip安装这个库就可以开始使用它了(安装之前建议先提前在电脑上装好keras和对应版本的tensorflow):

pip install hackcaptcha

对于数字验证码,hackcaptcha直接调用了百度的文字识别API:

https://ai.baidu.com/tech/ocr

用户每天可以免费调用这么多次,个人学习与玩耍使用完全是足够的

具体而言,你需要到上面那个网站上自己注册一个账号,并新建一个应用,从而获取到API Key和Secret Key就行了:​

简单写几行代码就可以实现验证码识别的了:

from hackcaptcha.crackers import WebapisCracker
cracker = WebapisCracker()
infos_return = cracker.digital(imagepath='CAPTCHA IMAGE PATH', webapi_type='baidu', app_id='AppID', api_key='API Key', secret_key='Secret Key')
返回的结果格式为:
{
    'is_success': True,
    'result': 'AFD2',
    'error_msg': ''
}

对于12306的点击验证码,我查阅了网上的做法,一般就是把12306的验证码做一下图片分割:

​然后分别训一个图片分类器和文字分类器就行了。所以我就直接拿来用了。只需要这样调用就行了:

from hackcaptcha.crackers import AlgorithmsCracker
cracker = AlgorithmsCracker()
infos_return = cracker.click(imagepath='CAPTCHA IMAGE PATH', algorithm_type='zt12306', text_model_path='text.h5', object_model_path='object.h5')

返回的结果格式为:

{
    'is_success': True, 
    'result': '1,2,5'
}

其中text.h5和object.h5这两个模型在这可以下载到:

https://github.com/CharlesPikachu/hackcaptcha

我们可以结合DecryptLogin库来看下效果(请注意,下面的代码只适用于DecryptLogin版本号大于等于0.1.29的情况):

from DecryptLogin import login
from hackcaptcha.crackers import AlgorithmsCracker

'''定义验证码识别函数'''
def crackvcFunc(imagepath):
    cracker = AlgorithmsCracker()
    infos_return = cracker.click(imagepath=imagepath, algorithm_type='zt12306', text_model_path='text.h5', object_model_path='object.h5')
    return infos_return['result']

lg = login.Login()
infos_return, session = lg.zt12306(username='用户名', password='密码', crackvcFunc=crackvcFunc)

运行效果:

可以发现我们不再需要自己输入那令人头大的12306验证码,而直接调用训练好的模型进行自动识别输入即可实现12306的模拟登录操作了~

为了感谢读者们,我想把我最近收藏的一些编程干货分享给大家,回馈每一个读者,希望能帮到你们。

干货主要有:

①2000多本Python电子书(主流和经典的书籍应该都有了)

②Python标准库资料(最全中文版)

③项目源码(四五十个有趣且经典的练手项目及源码)

④Python基础入门、爬虫、web开发、大数据分析方面的视频(适合小白学习)

如果你用得到的话可以直接拿走,在我的QQ技术交流群里群号:948351247(纯技术交流和资源共享,广告勿入)以自助拿走
点击这里 领取