1. 程式人生 > 其它 >使用muggle_ocr處理selenium登入管理後臺驗證碼問題

使用muggle_ocr處理selenium登入管理後臺驗證碼問題

技術標籤:selenium測試影象識別seleniumpython驗證碼muggle_ocr

在使用selenium登入管理後臺時,會遇到驗證碼問題,若驗證碼相對簡單,則可以使用影象識別開源庫muggle_ocr來識別驗證碼

如果影象有上圖那麼簡單,則可以使用如下程式碼,你只要修改其中的定位元素即可使用。解決思路如下:

1、muggle_ocr自帶有識別4-6位簡單驗證碼的模型,識別上述型別驗證碼的成功率為28%

2、雖然成功率很低,但我們可以通過不停地重新整理、識別、輸入驗證碼,直到驗證碼輸入成功

3、經過多次測試,最多隻需嘗試8次就能登入成功,效果算很不錯了。

4、如果你想提高識別率,則可以進入開源專案

https://github.com/kerlomz/captcha_trainer,自行訓練模型。

from selenium import webdriver
import time
import muggle_ocr
import base64
#登入url
login_url="xxxxxxxxxxxxxx"
browser=webdriver.Chrome()
browser.get(url=login_url)
login_username="xxxxxx"
browser.find_element_by_xpath('//*[@id="app"]/div/form/div[2]/div/div/input').send_keys(login_username)
browser.find_element_by_xpath('//*[@id="app"]/div/form/div[3]/div/div/input').send_keys("xxxxx")
time.sleep(1)
def auto_fill_captcha():
    #要求版本tensorflow==1.15.5,muggle-ocr==1.0.3
    #通過url判斷當前是不是登入頁面,是就執行登入操作,不是就代表登入成功
    print("開始登入.....")
    i=0
    while browser.current_url==login_url:
        if i!=0:
            #重新整理驗證碼並清空驗證碼輸入框
            browser.find_element_by_xpath('//*[@id="app"]/div/form/div[4]/div/img').click()
            browser.find_element_by_xpath("//div[@id='app']/div[@class='login-container']/form//input[@name='code']").clear()
            time.sleep(1)
        # 獲取、填寫驗證碼,點選登入按鈕
        #獲取驗證碼,因為其是base64編碼方式的,需要先轉換為位元組型別,方便後面muggle_ocr使用
        src = browser.find_element_by_xpath('//*[@id="app"]/div/form/div[4]/div/img').get_attribute("src")
        src = src.replace("data:image/jpg;base64,", "")
        missing_padding = 4 - len(src) % 4
        if missing_padding:
            src += '=' * missing_padding
        image = base64.b64decode(src)
        print(image)
        # muggle_ocr中的ModelType.Captcha方法 可識別4-6位驗證碼
        sdk = muggle_ocr.SDK(model_type=muggle_ocr.ModelType.Captcha)
        st = time.time()
        # 呼叫預測函式
        text = sdk.predict(image_bytes=image)
        print(text, time.time() - st)
        #填入驗證碼
        browser.find_element_by_xpath("//div[@id='app']/div[@class='login-container']/form//input[@name='code']").send_keys(
            text)
        #點選登入
        browser.find_element_by_xpath("//div[@id='app']//form//span[.='登入']").click()
        time.sleep(3)
        i+=1
    print("登入成功,總計用了 {} 次".format(i))

靈感來源文章連結,https://www.jianshu.com/p/1e6430b1c4d7

muggle_ocr開源專案https://github.com/kerlomz/captcha_trainer