當前位置:首頁 » 編程語言 » python識別驗證碼

python識別驗證碼

發布時間: 2022-09-28 15:48:37

A. 如何利用python做簡單的驗證碼識別

1摘要

驗證碼是目前互聯網上非常常見也是非常重要的一個事物,充當著很多系統的防火牆功能,但是隨時OCR技術的發展,驗證碼暴露出來的安全問題也越來越嚴峻。本文介紹了一套字元驗證碼識別的完整流程,對於驗證碼安全和OCR識別技術都有一定的借鑒意義。

然後經過了一年的時間,筆者又研究和get到了一種更強大的基於CNN卷積神經網路的直接端到端的驗證識別技術(文章不是我的,然後我把源碼整理了下,介紹和源碼在這裡面):

基於python語言的tensorflow的『端到端』的字元型驗證碼識別源碼整理(github源碼分享)

2關鍵詞

關鍵詞:安全,字元圖片,驗證碼識別,OCR,Python,SVM,PIL

3免責聲明

本文研究所用素材來自於某舊Web框架的網站完全對外公開的公共圖片資源。

本文只做了該網站對外公開的公共圖片資源進行了爬取,並未越權做任何多餘操作。

本文在書寫相關報告的時候已經隱去漏洞網站的身份信息。

本文作者已經通知網站相關人員此系統漏洞,並積極向新系統轉移。

本報告的主要目的也僅是用於OCR交流學習和引起大家對驗證安全的警覺。

4引言

關於驗證碼的非技術部分的介紹,可以參考以前寫的一篇科普類的文章:

互聯網安全防火牆(1)--網路驗證碼的科普

裡面對驗證碼的種類,使用場景,作用,主要的識別技術等等進行了講解,然而並沒有涉及到任何技術內容。本章內容則作為它的技術補充來給出相應的識別的解決方案,讓讀者對驗證碼的功能及安全性問題有更深刻的認識。

5基本工具

要達到本文的目的,只需要簡單的編程知識即可,因為現在的機器學習領域的蓬勃發展,已經有很多封裝好的開源解決方案來進行機器學習。普通程序員已經不需要了解復雜的數學原理,即可以實現對這些工具的應用了。

主要開發環境:

  • python3.5

  • python SDK版本

  • PIL

  • 圖片處理庫

  • libsvm

  • 開源的svm機器學習庫

  • 關於環境的安裝,不是本文的重點,故略去。

    6基本流程

    一般情況下,對於字元型驗證碼的識別流程如下:

  • 准備原始圖片素材

  • 圖片預處理

  • 圖片字元切割

  • 圖片尺寸歸一化

  • 圖片字元標記

  • 字元圖片特徵提取

  • 生成特徵和標記對應的訓練數據集

  • 訓練特徵標記數據生成識別模型

  • 使用識別模型預測新的未知圖片集

  • 達到根據「圖片」就能返回識別正確的字元集的目標

  • 7素材准備

    7.1素材選擇

    由於本文是以初級的學習研究目的為主,要求「有代表性,但又不會太難」,所以就直接在網上找個比較有代表性的簡單的字元型驗證碼(感覺像在找漏洞一樣)。

    最後在一個比較舊的網站(估計是幾十年前的網站框架)找到了這個驗證碼圖片。

    原始圖:

  • def get_feature(img): """

  • 獲取指定圖片的特徵值,

  • 1. 按照每排的像素點,高度為10,則有10個維度,然後為6列,總共16個維度

  • :param img_path:

  • :return:一個維度為10(高度)的列表 """


  • width, height = img.size


  • pixel_cnt_list = []

  • height = 10 for y in range(height):

  • pix_cnt_x = 0 for x in range(width): if img.getpixel((x, y)) == 0: # 黑色點

  • pix_cnt_x += 1


  • pixel_cnt_list.append(pix_cnt_x) for x in range(width):

  • pix_cnt_y = 0 for y in range(height): if img.getpixel((x, y)) == 0: # 黑色點

  • pix_cnt_y += 1


  • pixel_cnt_list.append(pix_cnt_y) return pixel_cnt_list

  • 然後就將圖片素材特徵化,按照libSVM指定的格式生成一組帶特徵值和標記值的向量文

B. 使用Python進行驗證碼識別案例無法驗證通過,SOS

是不是PIL需要的依賴圖像支持沒有下?
試試這個
sudo apt-get install zlib1g-dev
sudo apt-get install libfreetype6-dev
sudo apt-get build-dep python-imaging
能安裝的都安上

C. python怎樣調用第三方平台識別驗證碼

一、pytesseract介紹

1、pytesseract說明

pytesseract最新版本0.1.6,網址:h

Python-tesseract is a wrapper for google's Tesseract-OCR
( ht-ocr/ ). It is also useful as a
stand-alone invocation script to tesseract, as it can read all image types
supported by the Python Imaging Library, including jpeg, png, gif, bmp, tiff,
and others, whereas tesseract-ocr by default only supports tiff and bmp.
Additionally, if used as a script, Python-tesseract will print the recognized
text in stead of writing it to a file. Support for confidence estimates and
bounding box data is planned for future releases.

翻譯一下大意:

a、Python-tesseract是一個基於google's Tesseract-OCR的獨立封裝包;

b、Python-tesseract功能是識別圖片文件中文字,並作為返回參數返回識別結果;

c、Python-tesseract默認支持tiff、bmp格式圖片,只有在安裝PIL之後,才能支持jpeg、gif、png等其他圖片格式;

2、pytesseract安裝

INSTALLATION:

Prerequisites:
* Python-tesseract requires python 2.5 or later or python 3.
* You will need the Python Imaging Library (PIL). Under Debian/Ubuntu, this is
the package "python-imaging" or "python3-imaging" for python3.
* Install google tesseract-ocr from hsseract-ocr/ .
You must be able to invoke the tesseract command as "tesseract". If this
isn't the case, for example because tesseract isn't in your PATH, you will
have to change the "tesseract_cmd" variable at the top of 'tesseract.py'.
Under Debian/Ubuntu you can use the package "tesseract-ocr".

Installing via pip:
See the [pytesseract package page](hi/pytesseract)
```
$> sudo pip install pytesseract

翻譯一下:

a、Python-tesseract支持python2.5及更高版本;

b、Python-tesseract需要安裝PIL(Python Imaging Library) ,來支持更多的圖片格式;

c、Python-tesseract需要安裝tesseract-ocr安裝包,具體參看上一篇博文。

綜上,Pytesseract原理:

1、上一篇博文中提到,執行命令行 tesseract.exe 1.png output -l eng ,可以識別1.png中文字,並把識別結果輸出到output.txt中;

2、Pytesseract對上述過程進行了二次封裝,自動調用tesseract.exe,並讀取output.txt文件的內容,作為函數的返回值進行返回。

二、pytesseract使用

USAGE:
```
> try:
> import Image
> except ImportError:
> from PIL import Image
> import pytesseract
> print(pytesseract.image_to_string(Image.open('test.png')))
> print(pytesseract.image_to_string(Image.open('test-european.jpg'),))

可以看到:

1、核心代碼就是image_to_string函數,該函數還支持-l eng 參數,支持-psm 參數。

用法:
image_to_string(Image.open('test.png'),lang="eng" config="-psm 7")

2、pytesseract里調用了image,所以才需要PIL,其實tesseract.exe本身是支持jpeg、png等圖片格式的。

實例代碼,識別某公共網站的驗證碼(大家千萬別干壞事啊,思慮再三,最後還是隱掉網站域名,大家去找別的網站試試吧……):

View Code

D. 如何利用Python 做驗證碼識別

用python加「驗證碼」為關鍵詞在里搜一下,可以找到很多關於驗證碼識別的文章。我大體看了一下,主要方法有幾類:一類是通過對圖片進行處理,然後利用字型檔特徵匹配的方法,一類是圖片處理後建立字元對應字典,還有一類是直接利用ocr模塊進行識別。不管是用什麼方法,都需要首先對圖片進行處理,於是試著對下面的驗證碼進行分析。
一、圖片處理
這個驗證碼中主要的影響因素是中間的曲線,首先考慮去掉圖片中的曲線。考慮了兩種演算法
第一種是首先取到曲線頭的位置,即x=0時,黑點的位置。然後向後移動x的取值,觀察每個x下黑點的位置,判斷前後兩個相鄰黑點之間的距離,如果距離在一定范圍內,可以基本判斷該點是曲線上的點,最後將曲線上的點全部繪成白色。試了一下這種方法,結果得到的圖片效果很一般,曲線不能完全去除,而且容量將字元的線條去除。
第二種考慮用單位面積內點的密度來進行計算。於是首先計算單位面積內點的個數,將單位面積內點個數少於某一指定數的面積去除,剩餘的部分基本上就是驗證碼字元的部分。本例中,為了便於操作,取了5*5做為單位范圍,並調整單位面積內點的標准密度為11。處理後的效果:
二、字元驗證
這里我使用的方法是利用pytesser進行ocr識別,但由於這類驗證碼字元的不規則性,使得驗證結果的准確性並不是很高。具體哪位大牛,有什麼好的辦法,希望能給指點一下。
三、准備工作與代碼實例
1、PIL、pytesser、tesseract
(1)安裝PIL:下載地址:http:// www. pythonware. com/procts/pil/(2)pytesser:下載地址:http :/ /code. google. com/p/pytesser/,下載解壓後直接放在代碼相同的文件夾下,即可使用。
(3)Tesseract OCR engine下載:http: / / code.google. com/p/tesseract-ocr/,下載後解壓,找到tessdata文件夾,用其替換掉pytesser解壓後的tessdata文件夾即可。
2、具體代碼
復制代碼
#encoding=utf-8
###利用點的密度計算
import Image,ImageEnhance,ImageFilter,ImageDrawimport sys
from pytesser import *
#計算范圍內點的個數
def numpoint(im):
w,h = im.size
data = list( im.getdata() )
mumpoint=0
for x in range(w):
for y in range(h):
if data[ y*w + x ] !=255:#255是白色
mumpoint+=1
return mumpoint
#計算5*5范圍內點的密度
def pointmi(im):
w,h = im.size
p=[]
for y in range(0,h,5):
for x in range(0,w,5):
box = (x,y, x+5,y+5)
im1=im.crop(box)
a=numpoint(im1)
if a<11:##如果5*5范圍內小於11個點,那麼將該部分全部換為白色。
for i in range(x,x+5):
for j in range(y,y+5):
im.putpixel((i,j), 255)
im.save(r'img.jpg')
def ocrend():##識別
image_name = "img.jpg"
im = Image.open(image_name)
im = im.filter(ImageFilter.MedianFilter())enhancer = ImageEnhance.Contrast(im)
im = enhancer.enhance(2)
im = im.convert('1')
im.save("1.tif")
print image_file_to_string('1.tif')
if __name__=='__main__':
image_name = "1.png"
im = Image.open(image_name)
im = im.filter(ImageFilter.DETAIL)
im = im.filter(ImageFilter.MedianFilter())enhancer = ImageEnhance.Contrast(im)
im = enhancer.enhance(2)
im = im.convert('1')
##a=remove_point(im)
pointmi(im)
ocrend()

E. Python有什麼好的庫可以識別驗證碼

要安裝pytesseract庫,必須先安裝其依賴的PIL及tesseract-ocr,其中PIL為圖像處理庫,而後面的tesseract-ocr則為google的ocr識別引擎。

pytesseract安裝
直接使用pip install pytesseract安裝即可,或者使用easy_install pytesseract

Python驗證碼識別代碼:

import pytesseract
from PIL import Image
image = Image.open('vcode.png')
vcode = pytesseract.image_to_string(image)
print (vcode)

F. python tesserocr識別普通驗證碼成功後列印結果為空

和threshold=127這個有關系,變更這個數值就能看出來了,比如調成200

G. 如何用Python+人工識別處理知乎的倒立漢字驗證碼

這給Python爬蟲的模擬登錄帶來了一定的難度,目前網路上的相關資料針對的都是普通的「英文+數字」驗證碼,針對「倒立漢字」驗證碼的文章較少。而且大家普遍採用的是requests庫。經過幾天的研究,我採用urllib.request實現了模擬登陸知乎,現將代碼分享如下:

[python] view plain
# 登錄知乎,通過保存驗證圖片方式
import urllib.request
import urllib.parse
import time
import http.cookiejar

webUrl = "l"#不能寫因為不支持重定向

webheader = {
# 'Accept': 'text/html, application/xhtml+xml, */*',
# 'Accept-Language': 'zh-CN',
# 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko',
'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Mobile Safari/537.36',
# 'User-Agent': 'Mozilla/5.0 (iPod; U; CPU iPhone OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5',
# 'DNT': '1',
# 'Connection': 'Keep-Alive'
}

postData = {
'email': '在這里寫你的賬號',
'captcha_type': 'cn',
'password': '在這里寫你的密碼',
'_xsrf': '',
'captcha': ''
}
localStorePath = "寫你想保存的驗證碼圖片的地址"

if __name__ == '__main__':
#聲明一個CookieJar對象實例來保存cookie
cookie = http.cookiejar.CookieJar()
#創建opener
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)#建立opener對象,並添加頭信息
urllib.request.install_opener(opener)

captcha_url = '?r=%d&type=login&lang=cn' % (time.time() * 1000)
# captcha_url = '/captcha.gif?r=%d&type=login' % (time.time() * 1000)#這樣獲得的是「字母+數字驗證碼」

#這個獲取驗證碼圖片的方法是不行的!
# urllib.request.urlretrieve(captcha_url, localStorePath + 'myCaptcha.gif')

#用urlopen函數保存驗證圖片
req = urllib.request.Request(url=captcha_url,headers=webheader)
content = urllib.request.urlopen(req)
# content = opener.open(req)
captcha_name = 'D:/Python學習/crawler_learning/知乎登錄專題研究/知乎驗證碼圖片/myNewCaptcha.gif'
content = content.read()
with open(captcha_name, 'wb') as f:
f.write(content)

postData['captcha'] = input('請輸入驗證碼')
# postData['_xsrf'] = get_xsrf()
postData['_xsrf'] = ''
print(postData['_xsrf'])

#用urlopen函數傳送數據給伺服器實現登錄
postData_encoded = urllib.parse.urlencode(postData).encode('utf-8')
req = urllib.request.Request(url=webUrl,data=postData_encoded,headers=webheader)
webPage = urllib.request.urlopen(req)
# webPage = opener.open(req)
data = webPage.read().decode('utf-8')

print(data)
with open("D:/知乎伺服器反饋的內容.txt",mode='w',encoding='utf-8') as dataFile:
dataFile.write(data)

幾點思考:
1、首先需要明確如何獲得驗證碼圖片的地址,利用Fiddler抓包獲得的典型的驗證碼圖片的地址如下:

這個「r」代表的是什麼含義呢?經過查看知乎上的js代碼可以確定,這個r指的是毫秒級的時間戳。
2、以驗證碼圖片地址cn為例,不同時間訪問同一個驗證碼圖片地址,得到的驗證碼圖片是不同的,那麼知乎伺服器是如何知道你獲取的是那張驗證碼呢?
我認為是通過sessionID,換句話說,知乎把某個驗證碼圖片給了你,同時知乎記錄下了你的sessionID和這個驗證碼的「正確答案」,這樣將來你輸入驗證碼給知乎後,知乎就能判斷你輸入的驗證碼是否正確了。
由於sessionID保存在cookie之中,所以Python模擬登陸的代碼必須使用cookie。
3、獲取驗證碼圖片的時候,我用的是content =urllib.request.urlopen (req)函數,經過我的驗證,用
urllib.request.urlretrieve函數是不行的,因為urlopen函數可以傳遞headers參數,而這一個參數必須有。

4、獲得了倒立漢字圖片以後,如何確定要傳遞給知乎的captcha是什麼呢?經過Fiddler抓包,
傳遞的參數類似於這樣:
{"img_size":[200,44],"input_points":[[43.44,22.44],[115.72,22.44]]}
經過分析和試驗確定:200指的是圖片長度,44指的是圖片高度,後面的input_points指的是打在倒立漢字上的點的坐標。由於每次出現7個漢字,這7個漢字的坐標是固定的,我全部進行捕獲:
{"img_size":[200,44],"input_points":[[12.95,14.969999999999998],[36.1,16.009999999999998],[57.16,24.44],[84.52,19.17],[108.72,28.64],[132.95,24.44],[151.89,23.380000000000002]]}
然後,問題就簡單了:將圖片保存在本地之後,打開圖片,確定哪幾個漢字倒立,比如說第2個和第6個,那就在上面選取出2和6的坐標輸入即可,即
{"img_size":[200,44],"input_points":[[36.1,16.009999999999998],[132.95,24.44]]}。
5、小竅門:以驗證碼圖片地址

H. 如何用Python+人工識別處理知乎的倒立漢字驗證碼

#登錄知乎,通過保存驗證圖片方式
importurllib.request
importurllib.parse
importtime
importhttp.cookiejar

webUrl="https://www.hu.com/login/email"#不能寫https://www.hu.com/#signin因為不支持重定向

webheader={
#'Accept':'text/html,application/xhtml+xml,*/*',
#'Accept-Language':'zh-CN',
#'User-Agent':'Mozilla/5.0(WindowsNT6.1;WOW64;Trident/7.0;rv:11.0)likeGecko',
'User-Agent':'Mozilla/5.0(Linux;Android6.0;Nexus5Build/MRA58N)AppleWebKit/537.36(KHTML,likeGecko)Chrome/56.0.2924.87MobileSafari/537.36',
#'User-Agent':'Mozilla/5.0(iPod;U;CPUiPhoneOS4_3_3likeMacOSX;en-us)AppleWebKit/533.17.9(KHTML,likeGecko)Version/5.0.2Mobile/8J2Safari/6533.18.5',
#'DNT':'1',
#'Connection':'Keep-Alive'
}

postData={
'email':'在這里寫你的賬號',
'captcha_type':'cn',
'password':'在這里寫你的密碼',
'_xsrf':'',
'captcha':''
}
localStorePath="寫你想保存的驗證碼圖片的地址"

if__name__=='__main__':
#聲明一個CookieJar對象實例來保存cookie
cookie=http.cookiejar.CookieJar()
#創建opener
handler=urllib.request.HTTPCookieProcessor(cookie)
opener=urllib.request.build_opener(handler)#建立opener對象,並添加頭信息
urllib.request.install_opener(opener)

captcha_url='https://www.hu.com/captcha.gif?r=%d&type=login&lang=cn'%(time.time()*1000)
#captcha_url='http://www.hu.com/captcha.gif?r=%d&type=login'%(time.time()*1000)#這樣獲得的是「字母+數字驗證碼」

#這個獲取驗證碼圖片的方法是不行的!
#urllib.request.urlretrieve(captcha_url,localStorePath+'myCaptcha.gif')

#用urlopen函數保存驗證圖片
req=urllib.request.Request(url=captcha_url,headers=webheader)
content=urllib.request.urlopen(req)
#content=opener.open(req)
captcha_name='D:/Python學習/crawler_learning/知乎登錄專題研究/知乎驗證碼圖片/myNewCaptcha.gif'
content=content.read()
withopen(captcha_name,'wb')asf:
f.write(content)

postData['captcha']=input('請輸入驗證碼')
#postData['_xsrf']=get_xsrf()
postData['_xsrf']=''
print(postData['_xsrf'])

#用urlopen函數傳送數據給伺服器實現登錄
postData_encoded=urllib.parse.urlencode(postData).encode('utf-8')
req=urllib.request.Request(url=webUrl,data=postData_encoded,headers=webheader)
webPage=urllib.request.urlopen(req)
#webPage=opener.open(req)
data=webPage.read().decode('utf-8')

print(data)
withopen("D:/知乎伺服器反饋的內容.txt",mode='w',encoding='utf-8')asdataFile:
dataFile.write(data)

熱點內容
蘋果6的速度和安卓哪個一樣 發布:2022-11-29 22:09:15 瀏覽:708
屯上小學的密碼是多少 發布:2022-11-29 22:08:16 瀏覽:369
linux源代碼分析 發布:2022-11-29 22:07:05 瀏覽:944
c語言求素數篩選法 發布:2022-11-29 22:04:56 瀏覽:699
雲主機伺服器和傳統主機服 發布:2022-11-29 22:04:50 瀏覽:702
什麼伺服器能綁定公網IP 發布:2022-11-29 22:00:42 瀏覽:531
安卓圖案鎖怎麼解鎖圖案 發布:2022-11-29 21:59:50 瀏覽:803
人工費制演算法 發布:2022-11-29 21:58:52 瀏覽:786
手機存儲異常怎麼清除 發布:2022-11-29 21:57:53 瀏覽:758
python計量經濟學 發布:2022-11-29 21:57:44 瀏覽:317