導航:首頁 > 編程語言 > python獲取簡訊驗證碼

python獲取簡訊驗證碼

發布時間:2023-03-19 12:29:16

1. 如何利用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()

2. 用python正則表達式怎麼從簡訊中提取驗證碼

a=re.findall(":\d+",str)
for i in a:
i=i[1:]
print i

3. 如何python爬蟲識別驗證碼

  1. 在用爬蟲爬取網站數據時,有些站點的一些關鍵數據的獲取需要使用賬號登錄,這里可以使用requests發送登錄請求,並用Session對象來自動處理相關Cookie。

  2. 另外在登錄時,有些網站有時會要求輸入驗證碼,比較簡單的驗證碼可以直接用pytesser來識別,復雜的驗證碼可以依據相應的特徵自己採集數據訓練分類器。

  3. 以CSDN網站的登錄為例,這里用Python的requests庫與pytesser庫寫了一個登錄函數。如果需要輸入驗證碼,函數會首先下載驗證碼到本地,然後用pytesser識別驗證碼後登錄,對於CSDN登錄驗證碼,pytesser的識別率很高。

4. python selenium 獲取簡訊驗證碼是字元和數字怎麼讀取數字

讀取簡訊需要在相應的手機上讀取呀
由於工作需要,登錄網站需要用到驗證碼。最初是研究過驗證碼識別的,但是總是不能獲取到我需要的那個驗證碼。直到這周五,才想起這事來,昨天順利的解決了。
下面正題:
Python版本:3.4.3
所需要的代碼庫:PIL,selenium,tesseract
先上代碼:
#coding:utf-8
import subprocess
from PIL import Image
from PIL import ImageOps
from selenium import webdriver
import time,os,sys

def cleanImage(imagePath):
image = Image.open(imagePath) #打開圖片
image = image.point(lambda x: 0 if x<143 else 255) #處理圖片上的每個像素點,使圖片上每個點「非黑即白」
borderImage = ImageOps.expand(image,border=20,fill='white')
borderImage.save(imagePath)

def getAuthCode(driver, url="http://localhost/"):
captchaUrl = url + "common/random"
driver.get(captchaUrl)
time.sleep(0.5)
driver.save_screenshot("captcha.jpg") #截屏,並保存圖片
#urlretrieve(captchaUrl, "captcha.jpg")
time.sleep(0.5)
cleanImage("captcha.jpg")
p = subprocess.Popen(["tesseract", "captcha.jpg", "captcha"], stdout=\
subprocess.PIPE,stderr=subprocess.PIPE)
p.wait()
f = open("captcha.txt", "r")

#Clean any whitespace characters
captchaResponse = f.read().replace(" ", "").replace("\n", "")

print("Captcha solution attempt: " + captchaResponse)
if len(captchaResponse) == 4:
return captchaResponse
else:
return False

def withoutCookieLogin(url=""):
driver = webdriver.Chrome()
driver.maximize_window()
driver.get(url)
while True:
authCode = getAuthCode(driver, url)
if authCode:
driver.back()
driver.find_element_by_xpath("//input[@id='orgCode' and @name='orgCode']").clear()
driver.find_element_by_xpath("//input[@id='orgCode' and @name='orgCode']").send_keys("orgCode")
driver.find_element_by_xpath("//input[@id='account' and @name='username']").clear()
driver.find_element_by_xpath("//input[@id='account' and @name='username']").send_keys("username")
driver.find_element_by_xpath("//input[@type='password' and @name='password']").clear()
driver.find_element_by_xpath("//input[@type='password' and @name='password']").send_keys("password")
driver.find_element_by_xpath("//input[@type='text' and @name='authCode']").send_keys(authCode)
driver.find_element_by_xpath("//button[@type='submit']").click()
try:
time.sleep(3)
driver.find_element_by_xpath("//*[@id='side-menu']/li[2]/ul/li/a").click()
return driver
except:
print("authCode Error:", authCode)
driver.refresh()
return driver

driver = withoutCookieLogin("http://localhost/")
driver.get("http://localhost/enterprise/add/")

怎麼獲取我們需要的驗證碼
在這獲取驗證碼的道路上,我掉了太多的坑,看過太多的文章,很多都是教你驗證碼的識別方法,但是沒有說明,怎麼獲取你當前需要的驗證碼圖片。
我的處理方法是:
1.先用selenium打開你需要的登錄的頁面地址url1

2.通過審核元素獲取驗證碼的地址url2(其實最簡單的是右鍵打開新頁面)

3:在url1頁面,輸入地址url2進入url2頁面,然後截屏保存驗證碼頁面

4:處理驗證碼得到驗證碼字元串。然後點擊瀏覽器後退按鈕,返回url1登錄頁面
5:輸入登錄需要的信息和驗證碼

6:點擊登錄
7:驗證登錄後的頁面,判斷是否成功,若不成功則需要重新1-7的操作。
為了保護公司的信息,這個頁面是我本地搭的服務,我在伯樂在線注冊頁面進行測試過這個驗證碼獲得方法,可以通過。(這個驗證碼的處理方法,僅限驗證碼背景是像素點,若驗證碼有橫線需額外處理。)
第一篇博文,不喜勿噴。
驗證碼處理方法參考文獻:
Web Scraping with python.pdf

5. python抓取網頁時是如何處理驗證碼的

python抓取網頁時是如何處理驗證碼的?下面給大家介紹幾種方法:

1、輸入式驗證碼

這種驗證碼主要是通過用戶輸入圖片中的字母、數字、漢字等進行驗證。如下圖:

解決思路:這種是最簡單的一種,只要識別出裡面的內容,然後填入到輸入框中即可。這種識別技術叫OCR,這里我們推薦使用Python的第三方庫,tesserocr。對於沒有什麼背影影響的驗證碼如圖2,直接通過這個庫來識別就可以。但是對於有嘈雜的背景的驗證碼這種,直接識別識別率會很低,遇到這種我們就得需要先處理一下圖片,先對圖片進行灰度化,然後再進行二值化,再去識別,這樣識別率會大大提高。

相關推薦:《Python入門教程》

2、滑動式驗證碼

這種是將備選碎片直線滑動到正確的位置,如下圖:

解決思路:對於這種驗證碼就比較復雜一點,但也是有相應的辦法。我們直接想到的就是模擬人去拖動驗證碼的行為,點擊按鈕,然後看到了缺口的位置,最後把拼圖拖到缺口位置處完成驗證。

第一步:點擊按鈕。然後我們發現,在你沒有點擊按鈕的時候那個缺口和拼圖是沒有出現的,點擊後才出現,這為我們找到缺口的位置提供了靈感。

第二步:拖到缺口位置。

我們知道拼圖應該拖到缺口處,但是這個距離如果用數值來表示?

通過我們第一步觀察到的現象,我們可以找到缺口的位置。這里我們可以比較兩張圖的像素,設置一個基準值,如果某個位置的差值超過了基準值,那我們就找到了這兩張圖片不一樣的位置,當然我們是從那塊拼圖的右側開始並且從左到右,找到第一個不一樣的位置時就結束,這是的位置應該是缺口的left,所以我們使用selenium拖到這個位置即可。

這里還有個疑問就是如何能自動的保存這兩張圖?

這里我們可以先找到這個標簽,然後獲取它的location和size,然後 top,bottom,left,right = location['y'] ,location['y']+size['height']+ location['x'] + size['width'] ,然後截圖,最後摳圖填入這四個位置就行。

具體的使用可以查看selenium文檔,點擊按鈕前摳張圖,點擊後再摳張圖。最後拖動的時候要需要模擬人的行為,先加速然後減速。因為這種驗證碼有行為特徵檢測,人是不可能做到一直勻速的,否則它就判定為是機器在拖動,這樣就無法通過驗證了。

3、點擊式的圖文驗證和圖標選擇

圖文驗證:通過文字提醒用戶點擊圖中相同字的位置進行驗證。

圖標選擇: 給出一組圖片,按要求點擊其中一張或者多張。借用萬物識別的難度阻擋機器。

這兩種原理相似,只不過是一個是給出文字,點擊圖片中的文字,一個是給出圖片,點出內容相同的圖片。

這兩種沒有特別好的方法,只能藉助第三方識別介面來識別出相同的內容,推薦一個超級鷹,把驗證碼發過去,會返回相應的點擊坐標。

然後再使用selenium模擬點擊即可。具體怎麼獲取圖片和上面方法一樣。

4、宮格驗證碼

這種就很棘手,每一次出現的都不一樣,但是也會出現一樣的。而且拖動順序都不一樣。

但是我們發現不一樣的驗證碼個數是有限的,這里採用模版匹配的方法。我覺得就好像暴力枚舉,把所有出現的驗證碼保存下來,然後挑出不一樣的驗證碼,按照拖動順序命名,我們從左到右上下到下,設為1,2,3,4。上圖的滑動順序為4,3,2,1,所以我們命名4_3_2_1.png,這里得手動搞。當驗證碼出現的時候,用我們保存的圖片一一枚舉,與出現這種比較像素,方法見上面。如果匹配上了,拖動順序就為4,3,2,1。然後使用selenium模擬即可。

6. python簡單驗證碼識別的實現過程

demo :
import pytesseract
from PIL import Image
image = Image.open("captcha.png")
print(pytesseract.image_to_string(image))
=================================================
=================================================中文識別
import pytesseract
from PIL import Image
image = Image.open("00.jpg")
print(pytesseract.image_to_string(image,lang='chi_sim'))

有時候文本識別率並不高,建議圖像識別前,先對圖像進行灰度化和 二值化

效果如下(有時候第一次可能識別失敗,可以寫個循環邏輯讓它多識別幾次,一般程序運行1-3次基本會識別成功):

7. python如何在簡訊中提取 驗證碼

如果格式統一的話,那就檢測數據就行了,用個正則表達式,把簡訊裡面的數據內容都提取出來

閱讀全文

與python獲取簡訊驗證碼相關的資料

熱點內容
編程電纜如何重啟 瀏覽:117
myqq命令行發消息 瀏覽:361
日產逍客怎麼使用app升窗 瀏覽:501
安卓系統怎麼快速刪除微信內容 瀏覽:651
csharppython 瀏覽:407
程序員脖子按摩儀 瀏覽:560
小米桌面文件夾亂碼怎麼回事 瀏覽:858
點歌台app怎麼連接 瀏覽:318
大學電腦編程學什麼好 瀏覽:348
上哪裡取消應用加密 瀏覽:172
電氣控制與可編程式控制制器pdf 瀏覽:87
cad圖紙不能跨文件夾粘貼 瀏覽:256
學生雲伺服器主機 瀏覽:889
單片機狀態周期 瀏覽:622
lua中的android 瀏覽:443
加密貴還是植發貴 瀏覽:664
陽光壓縮機繼電器 瀏覽:971
修改阿里雲伺服器密碼 瀏覽:817
lk4102加密晶元 瀏覽:588
怎麼更改app店面 瀏覽:489