如何破解算数验证码?

裸睡的猪

共 1934字,需浏览 4分钟

 · 2021-08-09

作者 | 志斌
来源 |志斌的python笔记


今天来跟大家分享一下如何解决验证码反爬虫中的计算型验证码反爬虫。


01

原理


计算型验证码其实是一种特殊的字符型验证码,只不过在它的基础上增加了数字运算。


计算型验证码在将人类视觉和计算机视觉的差异作为区分用户和电脑的依据的同时,还加上了逻辑运算,从而来增加机器识别的难度。


02

破解


志斌以下面这张验证码为例给大家讲一下如何用用图像识别的方式破解字符验证码。


在之前的这篇文章中,当时介绍了两种实现验证码识别的办法。


今天我们换一个新方式来破解验证码。此次使用的是Ddddocr库。这个库的使用非常的便捷,可以通过下面命令进行安装:

pip install ddddocr

它的参数说明

我们现在书写一下代码,来实战一下,看看效果

import ddddocr
ocr = ddddocr.DdddOcr()
with open('6.jpg', 'rb') as f:
img_bytes = f.read()
res = ocr.classification(img_bytes)
print(res)


成功的将式子识别了出来。然后我们就可以根据式子来进行算数了,代码如下:

if '+' in res:
zhi = int(res.split('+')[0])+int(res.split('+')[1][:-1])
print(zhi)
if '-' in res:
zhi = int(res.split('+')[0])-int(res.split('+')[1][:-1])
print(zhi)
if '*' in res:
zhi = int(res.split('+')[0])*int(res.split('+')[1][:-1])
print(zhi)
if '/' in res:
zhi = int(res.split('+')[0])/int(res.split('+')[1][:-1])
print(zhi)

结果成功的计算了出来。


03

制作代码


from PIL import Image,ImageDraw,ImageFont
import random
def getRandomColor():
# 获取一个随机的rgb格式颜色
r = random.randint(0, 255)
g = random.randint(0, 255)
b = random.randint(0, 255)
return (r,g,b)
def getRandomStr():
# 获取一个随机字符串,其中每个字符也是随机的
num_random = str(random.randint(1,50))
return num_random
text =''
for i in range(3):
if i != 1:
k = getRandomStr()+' '
else:
k = random.choice(['+','-','*','/'])+' '
text += k
text = text+' = '
# 获取一个Image对象,参数分别是:RGB格式,宽120,高40,随机颜色
image = Image.new('RGB',(160,40),(255,255,255))
# 获取一个画笔对象,将图片对象传过去
draw = ImageDraw.Draw(image)
# 获取一个font字体对象,参数是ttf的字体文件的目录,以及字体的大小
font = ImageFont.truetype(r'K:\msyh.ttc',size=24)
# 在图片上写东西,参数是定位、字符串、颜色和字体
draw.text((10,10),text,getRandomColor(),font=font)
image.save('6.jpg')



04

小结


1. 本文详细介绍了计算型验证码反爬虫的原理和破解方法,并教大家如何做一款自己的计算型验证码。

2. 因为计算型验证码是一种特殊的字符型验证码,所以Ddddocr库其实也适用于破解字符型验证码。

3. 相比较于Pytesseract库,Ddddocr库的使用更加便捷且不需要进行环境配置。

4. 本文仅供学习参考,不做它用。


👇更多文章关注裸睡的猪👇






浏览 69
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报