python識別驗證碼


對於驗證碼這個問題,通常我們可以采取以下三個途徑來解決該問題: 

1、第一種方法,在被測系統中暫時屏蔽驗證功能。

即臨時修改應用,無論用戶輸入的是什么驗證碼,都認為是正確的。

優點:這種方法最容易實現,對測試結果也不會有太大的影響(當然,這種方式去掉了“驗證驗證碼”這個環節,不過這個環節本來就很難成為系統性能瓶頸)。

缺點:但這種方法有一個致命的問題:如果被測系統是一個實際已上線的系統,屏蔽驗證功能會對已經在運行的業務造成非常大的安全性的風險,因此,對於已上線的系統來說,用這種方式就不合適了;     

2、第二種方法,留一個后門,我們設定一個所謂的“萬能驗證碼”,只要用戶輸入這個“萬能驗證碼”,我們就驗證通過,否則,還是按照原先的驗證方式進行驗證。

這種方法在第一種方法的基礎上稍微進行一些改進。第一種方法帶來了很大的安全性問題,那么我們可以考慮,不取消驗證,但在其中這種方式仍然存在安全性的問題,但由於我們可以通過管理手段將“萬能驗證碼”控制在一個小的范圍內,而且只在性能測試期間保留這個小小的后門,相對第一種方法來說,在安全性方面已經有較大的改進了;     

3、寫一個驗證碼獲取的DLL,在測試腳本中進行調用即可。

驗證碼也在不斷的進步。在獲取驗證碼的時候,我們需要根據驗證碼的難易程度進行。  

 

識別驗證碼:需要使用到pillow,pytesseract、tesseract-ocr.

 

pillow

PIL (Python Image Library) 是 Python 平台處理圖片的標准庫,兼具強大的功能和簡潔的 API。但是目前PIL最新版本是1.1.7(PIL官方網站:http://www.pythonware.com/products/pil/

該版本只支持python2.4、2.5、2.6、2.7。看了網上相關資料后,使用了Pillow。 Pillow 庫則是 PIL 的一個分支,維護和開發活躍,Pillow 兼容 PIL 的絕大多數語法,推薦使用。

 

Pillow的Github主頁:https://github.com/python-pillow/Pillow

Pillow的文檔(對應版本v3.0.0):https://pillow.readthedocs.org/en/latest/handbook/index.html

Pillow的文檔中文翻譯(對應版本v2.4.0):http://pillow-cn.readthedocs.org/en/latest/

 

Pillow的安裝:

方法一:在pycharm環境中直接安裝。

 方法二:使用pip進行安裝:pip install Pillow

 pytesseract

pytesseract安裝

方法一;

在pycharm環境中直接安裝。

方法二:pip install pytesseract

 

真實案例的使用

 

代碼如下:

from selenium import webdriver
import time
from PIL import Image
import pytesseract
driver=webdriver.Chrome()
driver.get("http://www.xxx.com/index.html#/user/login")
time.sleep(3)
driver.find_element_by_id('userName').send_keys("iotqy")#輸入登錄賬戶
driver.find_element_by_id("password").send_keys("123456")#輸入登錄密碼

driver.save_screenshot('e://hbgj_login.png')#截取當前網頁,該網頁有我們需要的驗證碼
yzm=driver.find_element_by_xpath('//*[@id="root"]/div/div[1]/div[2]/div/form/div[1]/span/span/span[2]/div') #定位驗證碼
location=yzm.location#獲取驗證碼x,y軸坐標
size=yzm.size#獲取驗證碼的長寬
rangle=(int(location['x']),int(location['y']),int(location['x']+size['width']),int(location['y']+size['height']))#截取的位置坐標
i=Image.open('e://hbgj_login.png') #打開截圖
frame4=i.crop(rangle)#使用Image的crop函數,從截圖中再次截取我們需要的區域
frame4.save("e://yzm.jpg")#將截取到的驗證碼保存為jpg圖片
qq=Image.open("e://yzm.jpg")#打開jpg驗證碼圖片
text=pytesseract.image_to_string(qq).strip()#使用image_to_string識別驗證碼
driver.find_element_by_name("code").send_keys(text)#將識別的圖片驗證碼信息輸入到驗證碼輸入文本框中

driver.find_element_by_xpath('//*[@id="root"]/div/div[1]/div[2]/div/form/div[3]/div/div/span/button').click()#點擊登錄按鈕

=====================================================================================================================================

出現的問題:

1、KeyError: 'RGBA'

   OSError: cannot write mode RGBA as JPEG

解決辦法:將截取到的驗證碼由jpg格式改為png格式。

改動如下:

 

 2、上訴改動后,出現新的錯誤

FileNotFoundError: [WinError 2] 系統找不到指定的文件。

pytesseract.pytesseract.TesseractNotFoundError: tesseract is not installed or it's not in your path

解決辦法:安裝tesseract-ocr

 OCR(Optical Character Recognition, 光學字符識別) 軟件

安裝包含兩個部分:ORC引擎本身以及對應語言的訓練數據

github地址:   https://github.com/tesseract-ocr/tesseract

windows:

The latest installer can be downloaded here: tesseract-ocr-setup-3.05.01.exe and tesseract-ocr-setup-4.00.00dev.exe (experimental).

下載安裝包tesseract-ocr-setup-3.05.01.exe,安裝到默認路徑:C:\Program Files (x86)\Tesseract-OCR

安裝tesseract-ocr完成后:處理方式中任選一。

①處理方法一:把安裝路徑(C:\Program Files (x86)\Tesseract-OCR)添加到環境變量PATH中去

②處理方法二:修改pytesseract.py文件,指定tesseract.exe安裝路徑

tesseract_cmd = 'C:\\Program Files (x86)\\Tesseract-OCR\\tesseract.exe‘

③處理方法三:在實際運行代碼中指定

pytesseract.pytesseract.tesseract_cmd = 'C:\\Program Files (x86)\\Tesseract-OCR\\tesseract.exe'

 OCR自動識別-識別驗證碼圖片,識別過程:截取登錄頁面->獲取驗證碼的位置坐標->打開截圖->從截圖中截取驗證碼的區域->使用pytesseract工具識別驗證碼


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM