手把手教你编写网页图形验证码识别工具
文章目錄
- 前言
- 一、準備工作
- (一)Tesseract-OCR工具下載和安裝
- (二)pip更換國內源
- (三)安裝python第三方庫
- 1、多版本python導致的pip命令沖突問題
- 2、selenium
- 3、pillow
- 4、cv2
- 5、pytesseract
- 6、PySimpleGUI
- (四)安裝谷歌瀏覽器驅動
- 二、思路梳理和各模塊源碼
- (一)輔助模塊一(vcodeIden)
- (二)輔助模塊2(CodeDemo)
- (三)UI界面(程序入口)
- 三、程序打包與發布
- 四、本文參考鏈接
前言
在日常開展滲透測試工作的過程中,經常會看到有些站點的登陸或注冊頁面有圖形驗證碼,它看上去明明是那么簡單而純粹,可以使用自動化識別工具識別出驗證碼的值,可是我手頭上卻沒有一個趁手的工具能將它識別出來,從而導致錯過了多個驗證碼設計缺陷漏洞。因此,為了給程序員多爭取一些加班的機會,決定自己親自動手寫一個。
讀者在充分理解本文代碼和邏輯后,可以在此基礎上進行改寫,以開發出功能更加豐富的程序,比如burp驗證碼識別插件等。
對于本文的程序運行邏輯本人限于精力有限無法深度優化,如果有什么建議,期待讀者能在評論區留下您寶貴的意見。
一、準備工作
(一)Tesseract-OCR工具下載和安裝
先來一波名詞掃盲:
OCR(Optical Character Recognition):光學字符識別,是指電子設備(例如掃描儀或數碼相機)檢查紙上打印的字符,通過檢測內容中暗、亮的分布情況確定其形狀,然后用預定的識別方法將形狀翻譯成對應字符的過程。
Tesseract:開源的OCR識別引擎,初期Tesseract引擎由HP實驗室研發,后來貢獻給了開源軟件業,現由Google進行改進、修改、優化和發布。
該工具可以通過jTessBoxEditor工具進行針對性訓練以提高識別的準確率,但就目前而言,我們可以采用簡單的解決辦法以避免繁瑣的訓練過程,就是通過編寫代碼多次調用這個工具去識別并對識別結果做一個校驗。
?
Tesseract-OCR工具下載地址1:
https://github.com/tesseract-ocr/tesseract
Tesseract-OCR工具備用下載地址:
https://pan.baidu.com/s/11ToSFbsqRNrbVDH-EYW7zg?pwd=6hxp
提取碼:6hxp
也可以百度自行查找下載,網上有很多。
該工具下載好以后,直接安裝即可,但盡可能保證安裝路徑不要出現中文。
安裝完畢后,會見到如下頁面:
將該路徑添加到環境變量中,可以加到PATH中,也可以自己新建一個,像這樣(名字隨便取,windows會自己去找):
(二)pip更換國內源
如果你已經更換過或者打算手動下載安裝本文提到的庫,那么這個步驟可以省略了。本文涉及的某些庫比較大,不更換國內源的話,一來下載速度很慢,二是下載時容易中斷,何必自找麻煩呢?直接更換國內源就可以了。
在命令行輸入(這里使用的是清華源):
國內其他常用源:
阿里云:
豆瓣:
http://pypi.douban.com/simple/中國科學技術大學:
http://pypi.mirrors.ustc.edu.cn/simple/華中科技大學:
http://pypi.hustunique.com/(三)安裝python第三方庫
大家可能會覺得,第三方庫嘛,給我個庫名,隨便pip安裝就可以了,如果是這樣,那你就陷入了慣性思維的誤區。實際上很多時候第三方庫也要看它的版本是否符合你的代碼,有些庫需要本地其他文件的支持,需要手動修改才能使用,盲目安裝會出現各種莫名其妙的報錯,解決起來非常棘手。
下面介紹一下各個庫的安裝和需要注意的點,新手對python的認識過于粗淺,一定會覺得,不就是裝幾個庫嗎,怎么啰里啰嗦,但隨便一個細節不注意,就要debug半天,這正是在幫你提前規避可能出現的問題,老司機應該都懂的,嘻嘻嘻。
1、多版本python導致的pip命令沖突問題
如果電腦上安裝了多個python版本,則首先需要明確你使用pip命令時是在給哪個版本的python安裝,之后編輯器如果使用的不是相應版本的python,則會導致找不到這個庫,而報錯
如果有這種問題,可以參考我的情況:
我電腦上裝了一個python3.10,python2.7另外還裝了一個anaconda,python版本為3.9.7,因此執行pip命令時容易出問題,導致不知道用的是哪個python。
我的解決辦法是,在python3.10.1的安裝目錄中,把python.exe改成python3.exe,在python2.7的安裝目錄中,將python.exe改為python2.exe,這樣在命令行中使用python3即可訪問到3.10版本的python,而直接輸入python,則打開的是anaconda自帶的python3.9.7。
這樣直接使用pip命令就是在給anaconda裝相應的庫,要給python3.10.1裝庫的話,可以使用如下命令:
同理,python2安裝庫則使用如下命令(應該沒什么人會給python裝庫吧?):
python2 -m pip install 庫名還有一種方法,直接利用windows讀取環境變量時的特性也可以巧妙解決pip命令沖突的問題:
首先查看環境變量中PATH的值(系統變量還是用戶變量,你具體打開看,有python相關的內容就可以):
本地搜索pip.exe,可以看到如下內容:
看到pip.exe是在python安裝目錄下的Scripts目錄,而該目錄已經在環境變量中我們已經看到了。當我們在命令行輸入pip時,系統就會在環境變量中按順序從上到下去找,然后運行找到的第一個符合條件的文件,因此只要調整環境變量中,Scripts目錄的相對位置(通過上移和下調改變該目錄的位置),就可以在不修改任何python.exe文件名的情況下,隨心所欲使用指定的pip.exe了。
2、selenium
selenium庫目前最新應該是4.5版本了,使用selenium庫一定要注意某些舊屬性或者方法被棄用的問題。比如,find_element_by_xpath方法在新版本已經被棄用,舊版中使用時也會出現該方法即將被棄用的警告。具體從哪個版本開始棄用我也不清楚,經過測試,4.3和4.5版本肯定是用不了這個方法了。替代的寫法是:
find_element(BY.XPATH,目標xpath值)由于對新版selenium庫相對舊版所做的改動不太清楚,因此保險起見,我使用了舊版的selenium,因此使用如下命令安裝selenium:
pip install selenium==3.3.03、pillow
pillow模塊是基于PIL模塊進行二次開發的,因為PIL模塊本身很早就停止開發了,但pillow庫不是python內置的庫,因此需要單獨安裝一下:
pip install pillow這個庫很重要,安裝完后,最好檢查一下,在命令行輸入:
from PIL import Image若無報錯,則表示安裝成功,如下所示:
4、cv2
CV2指的是OpenCV2(Open Source Computer Vision Library),是一個開源的計算機視覺庫。它有很強大的圖片處理功能,內置了很多圖像處理和計算機視覺方面的通用算法。
注意:安裝的時候要安裝opencv_python,但在導入使用的時候使用cv2。
使用這個庫需要注意版本的問題。截止2022年11月5日,最新版為4.6.0.66,通過測試會發現,以腳本方式運行時,最新版和python3.9.7兼容,但打包成exe文件后運行,出現各種報錯,根據網上的文章嘗試了各種解決辦法,未果。最后看到有個大佬說該庫需要根據相應的python版本來安裝,于是我根據當前使用的python3.9.7版本,通過以下命令安裝opencv-python(直接使用庫名安裝,會安裝為最新版,所以直接指定版本):
可以看到裝這個庫的同時也會自動下載numpy庫,因此后面不需要單獨再裝這個庫。
如果不知道自己的python需要使用哪個相應版本的opencv-python,可以訪問下列鏈接:
https://www.lfd.uci.edu/~gohlke/pythonlibs/#opencv
注意圖中cp后面的兩位數,表示python的版本,比如cp39就表示python3.9系列的版本,可以直接下載相應的whl文件,在本地進行安裝,例如下載4.5.5版本的opencv-python,本地路徑為:
則pip中安裝命令為:
pip install "E:\python_test\opencv_python-4.5.5-cp39-cp39-win_amd64.whl"安裝完畢后在python的編輯器中輸入:
import cv2 print(cv2.__version__)看到版本信息即表示指定版本已經安裝成功:
5、pytesseract
這個庫的安裝比較簡單,直接輸入:
pip install pytesseract由于之前已經設置好環境變量,這里可以不用改任何配置,但是如果想要在別人的電腦上也能運行這個程序,可以采用兩種解決辦法:
- 第一種:目標電腦也安裝Tesseract-OCR工具并也配置好環境變量(具體哪個安裝目錄都可以,最好不要出現中文路徑);
- 第二種:把安裝好的Tesseract-OCR工具直接整個文件夾放在程序的根目錄下,然后在python的Lib\site-packages\pytesseract目錄下找到pytesseract.py并打開:
在第30行代碼處直接指定一個相對路徑(切勿使用絕對路徑,否則離開了本機的環境,程序就找不到該文件了):Tesseract-OCR\tesseract.exe:
這樣以后直接在打包后的dist文件夾里放入Tesseract-OCR文件夾。這樣程序就不需要依賴環境變量了,直接在任意windows系統上都可以運行了。
6、PySimpleGUI
這個庫直接使用pip命令安裝最新版就可以:
pip install PySimpleGUI(四)安裝谷歌瀏覽器驅動
首先確定谷歌瀏覽器的版本:
打開Chrome 瀏覽器,依次點擊瀏覽器右上角的 三個點 - 幫助 - 關于 Google Chrome
接著訪問以下地址:https://registry.npmmirror.com/binary.html?path=chromedriver
里面有很多版本的驅動,其中可能沒有準確對應我們瀏覽器版本的驅動,選擇最接近的版本即可。
然后 Windows 系統下載里面的chromedriver_win32.zip 文件,MacOS 下載 chromedriver_mac64.zip
將下載好的 chromedriver 解壓縮,Windows 系統得到 chromedriver.exe,MacOS 得到 chromedriver,這個就是我們需要的瀏覽器驅動。直接將它放到 Python 所在安裝目錄里即可。
二、思路梳理和各模塊源碼
大家常常會覺得,編寫程序代碼層面是最難的,其實我覺得代碼層面根本提不到什么難字的,真正難的都是在邏輯思維層面,也就是一個問題該如何解決,解決的具體步驟是什么。思路理清楚了以后,最后才是到寫代碼的層面,因此梳理思路是最重要的一個步驟。
卡耐基梅隆大學計算機教授 Jeannette Wing 曾經提出 編程思維(Computational Thinking)的概念,可以總結為如下四點:
- 問題分解: 把現實生活中的復雜問題,逐步拆分成容易解決的小問題;
- 模式識別: 根據已有的知識和經驗,找出新問題和以前解決過的問題的相似性;
- 抽象思維: 將問題里涉及的數據抽象到數據結構(變量、列表、字典等),把數據處理過程可重復執行部分抽象成函數;
- 算法設計: 根據前三步的分析成果,設計步驟,寫出算法,從而解決問題。
在我們這個程序里,首先需要將功能分解為幾個大的部分,明確每個部分解決什么問題,然后
先找到系統的核心功能(驗證碼識別),作為編程的入手點,滿足最基本的需求,然后再逐步迭代優化,讓程序變得越來越智能,越來越完整,最后加入圖形化界面,進而實現程序的打包和發布。
(一)輔助模塊一(vcodeIden)
驗證碼識別是整個程序的核心,需要單獨放在一個模塊中。
這里我畫了一個思維導圖:
源碼如下:
為什么不能直接返回cv2的圖片對象呢,單獨解釋一下:
Image.open()得到的img數據類型是一個Image對象,并不是普通的列表,而cv2.imread()得到的img數據類型是np.array()類型,如果用print把該對象輸出,可以看到一個列表,因此不具有高度和寬度的屬性,而后面我們降噪處理時需要遍歷所有的像素點,這就需要知道圖片的長度和寬度用來控制循環的上限,因此需要先將np.array()類型的圖片保存并以Image庫來打開該圖片,或者將cv2庫讀取的圖片轉化為Image對象。
把numpy.ndarray對象轉化為Image對象的兩種方法:
第一種:
第二種:
直接保存numpy.ndarray圖片對象,再用 Image.open() 去打開,例如:
反過來也是可以的,把Image對象轉化為np.adarray對象:
第一種方法:
第二種方法:
img = Image.open(path) img.save(save_path)image = cv2.imread(image_path, 0)(二)輔助模塊2(CodeDemo)
這個模塊采用面向對象編程,畫了一個思維導圖如下:
源代碼:
這個模塊的代碼相對簡單,大家直接看注釋就可以了,需要提一下的是,windows縮放比例會影響瀏覽器打開頁面后的內容,元素的坐標也會有變化,如不處理會導致坐標錯亂。可以在設置中查看windows的縮放比例,比如:
那么我在程序中就需要設置self.scale的值為1.25
(三)UI界面(程序入口)
這個模塊實際上叫什么名都可以,因為只有它調用別人,沒人調用它。但是名字還是盡量起的有意義一點,讓人一看就懂,我給它起名為GUI。
畫了個思維導圖如下:
這里用的庫是PySimpleGUI,具體用哪個庫可以隨你們喜好,UI庫的用法我就不多寫了,文末會附上該庫的參考文章。
源碼如下:
程序界面:
這里不方便公布測試網址來測試,大家自行測試了哈。請看測試結果:
驗證碼原始圖片:
處理結果:
可以看到程序已經成功識別目標驗證碼。
三、程序打包與發布
當上述源碼在本地運行調試完畢后,就可以打包發布了。
首先檢查工作目錄下三個模塊是否都在一起:
然后找到Tesseract-OCR工具的安裝目錄,將整個文件夾復制到工作目錄中:
盡管我們只使用了幾個模塊,但打包時,程序會自動將所有模塊(包括自帶和第三方全部模塊)統統打包,因此直接打包的話,文件會很大。為了避免出現這個問題,首先在開始菜單中找到AnacondaPrompt(anaconda) 選項,接著在打開的命令行窗口中依次執行以下命令:
#創建虛擬環境,指定虛擬環境的名字和python版本 conda create -n 1103 python==3.9 #激活虛擬環境 conda activate 1103 #只安裝當前python程序涉及的模塊 pip install PySimpleGUI pip install pyinstaller pip install selenium==3.3.0 pip install pytesseract pip install opencv-python==4.5.1.48 pip install pillow #先關閉虛擬環境 conda deactivate現在,在anaconda的根目錄中,依次展開以下文件夾:
envs\1103\Lib\site-packages\pytesseract
打開pytesseract.py文件,定位到第30行代碼:
用這行代碼替換掉原始代碼
如圖所示:
接著繼續在開始菜單中找到**AnacondaPrompt(anaconda)**選項,打開,并依次輸入如下命令:
完畢:
打包完成后,在dist文件夾里會生成一個GUI.exe文件,此時把Tesseract-OCR復制到這個文件夾中:
接著修改一下圖標,你們用什么工具都可以,我這里用Restorator 2018來改,該工具的下載地址為:
https://pan.baidu.com/s/1hVAwsUHIgJVrh6TR0TFOyA?pwd=c6dy
提取碼:c6dy
這個工具的使用也比較簡單,我就不多說了,給你們看最終的效果:
到此,此工具的開發和打包發布的流程已經全部結束,現在這個工具已經可以擺脫本機的環境,在其他windows上獨立運行了。
本程序目前還沒有經過大量的測試,對于可能出現的bug,大家可以自行測試,有問題可在評論區與我交流,謝謝!
四、本文參考鏈接
Tesseract-OCR相關名詞解釋:https://www.jianshu.com/p/3326c7216696
cv2庫介紹:https://blog.csdn.net/cnds123/article/details/126547307
PySimpleGUI庫介紹:https://blog.csdn.net/W295723987/article/details/126611877?spm=1001.2014.3001.5506
pytesseract使用問題解決方案:https://blog.csdn.net/weixin_41644725/article/details/95344924?spm=1001.2014.3001.5506
總結
以上是生活随笔為你收集整理的手把手教你编写网页图形验证码识别工具的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql1044什么意思_MySQL:
- 下一篇: 固体理论格林函数介绍