如何破解算數(shù)驗證碼?

來源 |志斌的python筆記
今天來跟大家分享一下如何解決驗證碼反爬蟲中的計算型驗證碼反爬蟲。
01
原理
計算型驗證碼其實是一種特殊的字符型驗證碼,只不過在它的基礎上增加了數(shù)字運算。
計算型驗證碼在將人類視覺和計算機視覺的差異作為區(qū)分用戶和電腦的依據(jù)的同時,還加上了邏輯運算,從而來增加機器識別的難度。
02
破解
志斌以下面這張驗證碼為例給大家講一下如何用用圖像識別的方式破解字符驗證碼。

在之前的這篇文章中,當時介紹了兩種實現(xiàn)驗證碼識別的辦法。
今天我們換一個新方式來破解驗證碼。此次使用的是Ddddocr庫。這個庫的使用非常的便捷,可以通過下面命令進行安裝:
pip install ddddocr它的參數(shù)說明

我們現(xiàn)在書寫一下代碼,來實戰(zhàn)一下,看看效果
import ddddocr
ocr = ddddocr.DdddOcr()
with open('6.jpg', 'rb') as f:
img_bytes = f.read()
res = ocr.classification(img_bytes)
print(res)

成功的將式子識別了出來。然后我們就可以根據(jù)式子來進行算數(shù)了,代碼如下:
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)結(jié)果成功的計算了出來。

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對象,參數(shù)分別是:RGB格式,寬120,高40,隨機顏色
image = Image.new('RGB',(160,40),(255,255,255))
# 獲取一個畫筆對象,將圖片對象傳過去
draw = ImageDraw.Draw(image)
# 獲取一個font字體對象,參數(shù)是ttf的字體文件的目錄,以及字體的大小
font = ImageFont.truetype(r'K:\msyh.ttc',size=24)
# 在圖片上寫東西,參數(shù)是定位、字符串、顏色和字體
draw.text((10,10),text,getRandomColor(),font=font)
image.save('6.jpg')
04
小結(jié)
1. 本文詳細介紹了計算型驗證碼反爬蟲的原理和破解方法,并教大家如何做一款自己的計算型驗證碼。
2. 因為計算型驗證碼是一種特殊的字符型驗證碼,所以Ddddocr庫其實也適用于破解字符型驗證碼。
3. 相比較于Pytesseract庫,Ddddocr庫的使用更加便捷且不需要進行環(huán)境配置。
4. 本文僅供學習參考,不做它用。
??更多文章關注裸睡的豬??
評論
圖片
表情
