首頁 > 軟體

Python通用驗證碼識別OCR庫之ddddocr驗證碼識別

2022-05-27 18:04:37

前言

相信做自動化測試的同學一定不可忽視的問題就是驗證碼,他幾乎是一個網站登入的標配,當然,我一般是不建議在這上面浪費時間去做識別的。

舉個例子,現在你的目的是進入自己家的房子,房子為了防止小偷進入於是上了一把鎖。我們沒必要花費力氣去研究開鎖技術。去找鎖匠設定一把萬能鑰匙(讓開發設定驗證碼的萬能碼),或者乾脆先去上鎖匠把驗證碼去掉(讓開發暫時遮蔽驗證碼)。嚴格來說識別驗證碼不是我們自動化測試的重點。除非你是驗證碼廠商的員工,破解識別驗證碼是你的工作。

那麼,如果有很簡單的方式去識別驗證碼的話,我們其實就可以不用麻煩開發針對驗證碼做遮蔽開關了。

ddddocr: 帶帶弟弟OCR通用驗證碼識別SDK 就是這樣一款強大驗證碼識別工具。

為什麼我會想到:hhhhhhhh 紅紅火火恍恍惚惚, 哈哈~!

傳統驗證碼

傳統驗證就是數位、字母、漢字等,把背景搞得模糊一些,這些驗證碼在他前面就是個弟弟。

以第一個為例,要想識別他非常容易了。

import ddddocr
ocr = ddddocr.DdddOcr(old=True)
# 第一個驗證截圖儲存:verification_code_1.png
with open("./verification_code_1.png", 'rb') as f:
    image = f.read()
res = ocr.classification(image)
print(res)

執行結果:

iepv

滑動驗證碼

當然,傳統驗證碼現在已經比較少網站在使用了,幾年前開始流行滑動驗證碼,當時,也有類似的識別方案,主要通過selenium模擬滑動。

首先,需要準備兩張圖片

  • 有缺口的圖片

  • 滾軸縫合的圖片

import ddddocr
import cv2

slide = ddddocr.DdddOcr(det=False, ocr=False)

# 滾軸縫合的圖片
with open('./verification_code_2-2.png', 'rb') as f:
    target_bytes = f.read()

# 有缺口的圖片
with open('./verification_code_2-1.png', 'rb') as f:
    background_bytes = f.read()

# 滾軸縫合的圖片
img = cv2.imread("./verification_code_2-2.png")
res = slide.slide_comparison(target_bytes, background_bytes)
print(res)

執行結果

{'target': [17, 78]}

從檔案中沒找到這個座標是滾軸的初始座標還是滑到正確位置的座標。

當然,這種方案想要執行到自動化中還是比較難的,首先我們很難得到滾軸縫合的圖片,除非你將驗證碼的所有圖片和缺口圖片都儲存下來,當驗證碼隨機生成一張圖片後,先截圖和本地儲存的圖片對比,然後,找到對應的滾軸縫合的圖片。通過ddddocr找到元素座標。

總之,太麻煩了,我選擇放棄~!

文字點選驗證碼

這種驗證碼現在也比較常見,我們需要按照順序點選圖片中的文字。

import ddddocr
import cv2

det = ddddocr.DdddOcr(det=True)

# 驗證碼圖片
with open("./verification_code_3.png", 'rb') as f:
    image = f.read()

poses = det.detection(image)
print(poses)

# 驗證碼圖片
im = cv2.imread("verification_code_3.png")

for box in poses:
    x1, y1, x2, y2 = box
    im = cv2.rectangle(im, (x1, y1), (x2, y2), color=(0, 0, 255), thickness=2)

# 結果圖片
cv2.imwrite("result.jpg", im)

執行結果:

[[17, 28, 82, 92], [55, 95, 118, 158], [39, 160, 103, 222]]

這裡給出的座標就是識別的三個文字的圖片座標。

這種方案同樣會面臨兩個問題;

  • 文字的識別順序不一定是要你點選的順序。例如識別出來的文字順序是: 荷葉飯, 驗證碼可能提示你點選的順序是:葉飯荷。

  • 生成的座標只是圖片的座標,不管是web還是app,驗證碼圖片只是螢幕的一部分,除非你擷取整個螢幕。那麼識別率就無法控制了。

總結

  • ddddorc 針對傳統的輸入驗證碼還是很好用的。

  • 針對新型的驗證碼,識別率還行,但是,如何與自動化結合是個難題。

  • OCR技術本來就是以圖片文字識別為主,它並不包含模擬滑鼠點選、滑動、鍵盤輸入等動作。

到此這篇關於Python通用驗證碼識別OCR庫之ddddocr驗證碼識別的文章就介紹到這了,更多相關Python ddddocr驗證碼識別內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com