国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

selenium+opencv實現(xiàn)模擬登陸(滑塊驗證碼)

這篇具有很好參考價值的文章主要介紹了selenium+opencv實現(xiàn)模擬登陸(滑塊驗證碼)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

很多網站登錄登陸時都要用到滑塊驗證碼,在某些場景例如使用爬蟲爬取信息時常常受到阻礙,想著用opencv的模板匹配試試能不能實現(xiàn)模擬登陸。本來覺得網上資料多應該還蠻容易,但實際上手還是搞了蠻久,在這里記錄一下整個流程,網站無所謂主要是要有滑動驗證碼:

selenium+opencv實現(xiàn)模擬登陸(滑塊驗證碼)

環(huán)境

python 3.9, selenium和Opencv相關依賴,用于抓取圖片的requests包,具體安裝這里不多講了,其中selenium用的火狐版本。

selenium登錄網站

整體流程就是這個樣子:訪問網站->點擊登錄->輸入賬號密碼->搞定滑塊驗證->登錄網站,其中最大的難點是滑塊驗證碼,但在此之前我們當然要先讓selenium自動打開網站把賬號密碼輸好,我們通過find_element()方法定位輸入框之后執(zhí)行操作,元素的各個屬性F12就可以找到:

selenium+opencv實現(xiàn)模擬登陸(滑塊驗證碼)

代碼如下:

options = webdriver.FirefoxOptions()
driver = webdriver.Firefox(options=options)
driver.get('網址')
driver.find_element("link text", "登錄").click()
name = driver.find_element("id", "name-input")
name.send_keys("賬號######") # 輸入賬號
pw = driver.find_element("id", "password-input")
pw.send_keys("密碼#########") # 輸入密碼
driver.find_element("id", "submit").click() # 提交

requests抓取驗證碼圖片


為了做后續(xù)處理我們需要把滑塊驗證碼相關圖片抓到本地,網上關于滑塊驗證碼這塊很多都是用原圖和有缺口的圖對比來確定缺口位置的,但是我并沒有找到原圖,這里用到的是有缺口的背景圖和滑塊圖,如下:

滑塊圖:?

selenium+opencv實現(xiàn)模擬登陸(滑塊驗證碼)

?有缺口的背景圖:

selenium+opencv實現(xiàn)模擬登陸(滑塊驗證碼)


這里爬圖是selenium定位之后用requests包爬的,注意驗證碼和登陸界面不在一個iframe里,selenium記得切到對應iframe才能定位到圖片,代碼如下:

driver.switch_to.frame('tcaptcha_iframe')
 # 切換iframe
img = driver.find_element("id", "slideBg").get_attribute('src')
headers = {
    'Accept': "application/json, text/plain, */*",
    'User-Agent': "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36"
} # 請求頭
r = requests.get(img, headers=headers)
with open('img.png', 'wb') as f:
    f.write(r.content)
block = driver.find_element("id", "slideBlock").get_attribute('src')
r = requests.get(block, headers=headers)
with open('block.png', 'wb') as f:
    f.write(r.content)

?OpenCV識別缺口位置


接下來就是重點,如何確定缺口位置來定位滑動驗證碼該往哪滑。這里主要用到OpenCV的模板匹配。 首先對滑塊也就是稍后匹配時用到的模板進行處理,這里主要就是把形狀輪廓提取出來然后去掉多余的東西,先把原圖變成灰度圖:

tpl_gray = cv2.cvtColor(tpl, cv2.COLOR_BGR2GRAY)

selenium+opencv實現(xiàn)模擬登陸(滑塊驗證碼)


可以看到邊緣有一圈陰影部分,我們需要把周圍這圈去掉,遍歷找到黑色像素點把它變成和周圍一樣。

width, height = tpl_gray.shape
    for h in range(height):
        for w in range(width):
            if tpl_gray[w, h] == 0:
                tpl_gray[w, h] = 96

?處理后變成了這樣,然后把中間主體部分涂黑,也就是將圖片二值化。

binary = cv2.inRange(tpl_gray, 96, 96)  # 二值化
kernel = np.ones((8, 8), np.uint8)
template = cv2.morphologyEx(binary, cv2.MORPH_OPEN, kernel) # 去白色噪點

?處理完畢得到理想的模板圖:

selenium+opencv實現(xiàn)模擬登陸(滑塊驗證碼)

?接下來對帶有缺口的背景圖進行處理,這個過程稍微麻煩一點,不過思路還是比較清晰的,還是先轉化成灰度圖再二值化,這里有一個問題,不同驗證碼圖片之間差距很大,有的顏色很顯眼,有的卻很清淡,比如下面這兩差別太大了,這就導致在二值化的過程中很難有一個固定的參數(shù)。

selenium+opencv實現(xiàn)模擬登陸(滑塊驗證碼)

selenium+opencv實現(xiàn)模擬登陸(滑塊驗證碼)

?這里我根據(jù)圖片的平均灰度值設定了幾個區(qū)間,對不同區(qū)間的驗證碼圖片傳入不同參數(shù)進行二值化:

def avg_mean(img):
    mean_val, _, _, _ = cv2.mean(img)
    print("平均灰度:", mean_val)
    return mean_val

def match(img):
    gauss = cv2.GaussianBlur(img, [5, 5], 0)
    img_gray = cv2.cvtColor(gauss, cv2.COLOR_BGR2GRAY)
    cv2.imshow("111", img_gray)
    if avg_mean(img) > 140: # 二值化
        ret, target = cv2.threshold(img_gray, 105, 255, cv2.THRESH_BINARY)
    elif avg_mean(img) > 102:
        ret, target = cv2.threshold(img_gray, 95, 255, cv2.THRESH_BINARY) 
    else:
        ret, target = cv2.threshold(img_gray, 85, 255, cv2.THRESH_BINARY)

?處理過的結果大概像這樣:

selenium+opencv實現(xiàn)模擬登陸(滑塊驗證碼)

?效果還是不錯的,清晰的凸顯了缺口位置,最后把背景圖和模板傳入opencv的模板匹配方法,記錄下匹配到的坐標即可。

result = cv2.matchTemplate(target, template, cv2.TM_CCOEFF_NORMED)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
left_up = max_loc
print(left_up)
right_down = (left_up[0] + height, left_up[1] + width)
cv2.rectangle(img, left_up, right_down, (0, 0, 255), 2)
cv2.imshow('res', img)

?這里框出來看看效果:

selenium+opencv實現(xiàn)模擬登陸(滑塊驗證碼)

?模擬拖動滑塊

識別出位置之后就要算出滑塊移動了多少距離,我們可以看到滑塊初始狀態(tài)距離邊緣有26個像素:

selenium+opencv實現(xiàn)模擬登陸(滑塊驗證碼)

?同時抓下來的圖片相比在網頁中放大了一倍,所以真實滑動距離是:?

(left_up - 26*2)/2

于是用selenium的actionchains模擬拖動滑塊:

def drag_block(l):
    drag = driver.find_element("id", "tcaptcha_drag_button")
    ActionChains(driver).click_and_hold(on_element=drag).perform()
    ActionChains(driver).move_to_element_with_offset(to_element=drag, xoffset=l, yoffset=0).perform()
    ActionChains(driver).release().perform()

?這樣整個流程就搞定了,理論上這樣簡單粗暴的自動拖過去在很多時候會不奏效,還需要模擬人手動拖動,不過因為我做測試的時候直接就成功了,所以沒寫下去,整體思路大概是加速減速停幾秒或者中間觸發(fā)幾個mouse_up(),mouse_down()事件。

腳本示例:

下面是測試時用到的腳本,selenium部分和主函數(shù),拿某個CTF靶場做的測試,僅供參考,根據(jù)實際網站不同肯定得改改:

import time
import requests

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains

import block_loc


def drag_block(l):
    drag = driver.find_element("id", "tcaptcha_drag_button")
    ActionChains(driver).click_and_hold(on_element=drag).perform()
    ActionChains(driver).move_to_element_with_offset(to_element=drag, xoffset=l, yoffset=0).perform()
    ActionChains(driver).release().perform()


def login_in(username, password):
    headers = {
        'Accept': "application/json, text/plain, */*",
        'User-Agent': "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36"
    }
    driver.get('網址')
    driver.find_element("link text", "登錄").click()
    name = driver.find_element("id", "name-input")
    name.send_keys(username)
    pw = driver.find_element("id", "password-input")
    pw.send_keys(password)
    driver.find_element("id", "submit").click()
    time.sleep(2)
    driver.switch_to.frame('tcaptcha_iframe')
    img = driver.find_element("id", "slideBg").get_attribute('src')
    r = requests.get(img, headers=headers)
    with open('img.png', 'wb') as f:
        f.write(r.content)
    block = driver.find_element("id", "slideBlock").get_attribute('src')
    r = requests.get(block, headers=headers)
    with open('block.png', 'wb') as f:
        f.write(r.content)


if __name__ == '__main__':
    options = webdriver.FirefoxOptions()
    driver = webdriver.Firefox(options=options)
    user = "##########"
    pw = "############"
    login_in(user, pw)
    image = "img.png"
    tpl = "block.png"
    length = block_loc.match(image, tpl)
    print(length)
    drag_block(length)

?Opencv部分:文章來源地址http://www.zghlxwxcb.cn/news/detail-413511.html

import cv2
import numpy as np


def avg_mean(img):
    mean_val, _, _, _ = cv2.mean(img)
    print("平均灰度:", mean_val)
    return mean_val


def match(image, temp):
    img = cv2.imread(image)
    tpl = cv2.imread(temp)
    tpl_gray = cv2.cvtColor(tpl, cv2.COLOR_BGR2GRAY)
    # cv2.imshow("111", tpl_gray)
    width, height = tpl_gray.shape
    for h in range(height):
        for w in range(width):
            if tpl_gray[w, h] == 0:
                tpl_gray[w, h] = 96
    binary = cv2.inRange(tpl_gray, 96, 96)
    kernel = np.ones((8, 8), np.uint8)
    template = cv2.morphologyEx(binary, cv2.MORPH_OPEN, kernel)
    # cv2.imshow('tpl', template)
    print(img.shape)
    gauss = cv2.GaussianBlur(img, [5, 5], 0)
    img_gray = cv2.cvtColor(gauss, cv2.COLOR_BGR2GRAY)
    # cv2.imshow("111", img_gray)
    if avg_mean(img) > 140:
        ret, target = cv2.threshold(img_gray, 105, 255, cv2.THRESH_BINARY) # 二值化
    elif avg_mean(img) > 102:
        ret, target = cv2.threshold(img_gray, 95, 255, cv2.THRESH_BINARY)  # 二值化
    else:
        ret, target = cv2.threshold(img_gray, 80, 255, cv2.THRESH_BINARY)
    # cv2.imshow('target', target)
    result = cv2.matchTemplate(target, template, cv2.TM_CCOEFF_NORMED)
    min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
    left_up = max_loc
    print(left_up)
    right_down = (left_up[0] + height, left_up[1] + width)
    cv2.rectangle(img, left_up, right_down, (0, 0, 255), 2)
    # cv2.imshow('res', img)
    length = (left_up[0] - 26*2)/2
    return length

到了這里,關于selenium+opencv實現(xiàn)模擬登陸(滑塊驗證碼)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯(lián)網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 用Selenium實現(xiàn)滑塊驗證碼登錄

    用Selenium實現(xiàn)滑塊驗證碼登錄

    現(xiàn)在很多網站的登錄,都采用了拖動圖片滑塊的驗證碼方式來進行驗證登錄,比如嗶哩嗶哩和京東等。在使用爬蟲等自動化程序時,如何通過滑塊驗證,就成了需要解決的問題。 這里通過大名鼎鼎的ddddocr圖片識別庫,和模擬瀏覽器操作的selenium庫來實現(xiàn) 安裝瀏覽器driver 首先

    2024年01月22日
    瀏覽(17)
  • 微博模擬登陸的方法 + 圖靈圖像圖片驗證碼識別平臺 識別驗證碼(97%正確率)Python + Selenium+Chrome

    微博模擬登陸的方法 + 圖靈圖像圖片驗證碼識別平臺 識別驗證碼(97%正確率)Python + Selenium+Chrome

    最近遇到一個問題,需要頻繁切換賬號登陸微博,但是需要識別微博的驗證碼,比較麻煩。而且因為需要24h不間斷的操作,所以沒法使用人工打碼平臺,而且打碼平臺也比較貴,延遲又高。最后找到了一個可以機器識別出來的,延遲只有0.1s,而且準確率超級高。 首先看一下

    2024年02月04日
    瀏覽(24)
  • python+selenium繞過滑塊驗證,實現(xiàn)自動登錄

    python+selenium繞過滑塊驗證,實現(xiàn)自動登錄

    實現(xiàn)taobao自動化登錄,當用webdriver打開淘寶時,滑塊驗證一直失敗,手動滑都會失敗。因為淘寶會檢測window.navigator.webdriver,控件檢測到你是selenium進入,所以就會彈出滑塊驗證。只需要繞過檢測就能實現(xiàn)自動登錄 驗證了兩種方法可以跳過: 第一種是給瀏覽器加啟動參數(shù),開

    2024年02月12日
    瀏覽(107)
  • 爽,我終于實現(xiàn)了selenium圖片滑塊驗證碼!【附代碼】

    爽,我終于實現(xiàn)了selenium圖片滑塊驗證碼!【附代碼】

    因為種種原因沒能實現(xiàn)愿景的目標,在這里記錄一下中間結果,也算是一個收場吧。這篇文章主要是 用selenium解決滑塊驗證碼的個別案列。 思路: 用selenium打開瀏覽器指定網站 將殘缺塊圖片和背景圖片下載到本地 對比兩張圖片的相似地方,計算要滑動的距離 規(guī)劃路線,移動

    2024年02月04日
    瀏覽(18)
  • 爽,我終于實現(xiàn)了selenium圖片滑塊驗證碼【附代碼】

    爽,我終于實現(xiàn)了selenium圖片滑塊驗證碼【附代碼】

    因為種種原因沒能實現(xiàn)愿景的目標,在這里記錄一下中間結果,也算是一個收場吧。這篇文章主要是 用selenium解決滑塊驗證碼的個別案列。 思路: 用selenium打開瀏覽器指定網站 將殘缺塊圖片和背景圖片下載到本地 對比兩張圖片的相似地方,計算要滑動的距離 規(guī)劃路線,移動

    2024年02月04日
    瀏覽(16)
  • 使用selenium驅動瀏覽器時攜帶cookie實現(xiàn)模擬登陸

    使用selenium驅動瀏覽器時攜帶cookie實現(xiàn)模擬登陸

    selenium可以幫助我們驅動瀏覽器打開網頁,并進行一些特定的操作。但是現(xiàn)在越來越多的網站,也會識別selenium,并且限制了訪問條件,比如:必須登錄。 在selenium中,get_cookies()方法可以幫助我們獲取cookie。這里以知乎為例演示一下使用。 這里用到的瀏覽器驅動對象為?unde

    2024年04月14日
    瀏覽(47)
  • Selenium圖片滑塊驗證碼

    Selenium圖片滑塊驗證碼

    因為種種原因沒能實現(xiàn)愿景的目標,在這里記錄一下中間結果,也算是一個收場吧。這篇文章主要是用selenium解決滑塊驗證碼的個別案列。 思路: 用selenium打開瀏覽器指定網站 將殘缺塊圖片和背景圖片下載到本地 對比兩張圖片的相似地方,計算要滑動的距離 規(guī)劃路線,移動

    2024年02月13日
    瀏覽(97)
  • 用selenium解決滑塊驗證碼

    用selenium解決滑塊驗證碼

    因為種種原因沒能實現(xiàn)愿景的目標,在這里記錄一下中間結果,也算是一個收場吧。這篇博客主要是用selenium解決滑塊驗證碼的個別案列。 思路: 用selenium打開瀏覽器指定網站 將殘缺塊圖片和背景圖片下載到本地 對比兩張圖片的相似地方,計算要滑動的距離 規(guī)劃路線,移動

    2024年02月01日
    瀏覽(26)
  • selenium處理各類滑塊驗證碼

    selenium處理各類滑塊驗證碼

    這種只要用鼠標點擊并移動指定距離就可以完成驗證(x軸) 這種是點擊滑塊會彈出白色方塊和暗灰色方塊,只要將白色方塊移動覆蓋暗灰色方塊便能通過,白色方塊是一張圖片,暗灰色方塊是通過style樣式設計的,我們可以根據(jù)它們之間style的left計算差異值從而得到滑塊滑動

    2024年02月16日
    瀏覽(90)
  • 使用selenium解決滑塊驗證的問題

    使用自動化測試時有些網站會使用滑塊來阻止,所以如何解決滑塊問題已經成為自動化測試不可或缺的,今天以網易易盾網站的滑塊舉例:https://dun.163.com/trial/sense 要解決滑塊問題的關鍵就是匹配滑塊在背景圖中的位置所以使用python中的numpy庫來實現(xiàn)獲取滑塊在背景的坐標,獲

    2024年02月12日
    瀏覽(27)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包