Python自動化實(shí)現(xiàn)多缺口滑塊驗(yàn)證
一、多缺口滑塊驗(yàn)證的技術(shù)原理
多缺口滑塊驗(yàn)證是傳統(tǒng)滑塊驗(yàn)證的升級版,通過設(shè)置多個(gè)干擾項(xiàng)增加識別難度:

技術(shù)難點(diǎn)分析:
- 多個(gè)相似缺口的干擾
- 缺口邊緣模糊處理
- 背景紋理干擾
- 非線性的移動軌跡檢測
- 時(shí)間限制和失敗重試機(jī)制
二、核心工具庫介紹
1. dddocr - 深度學(xué)習(xí)驗(yàn)證碼識別
pip install dddocr # 安裝命令
特性優(yōu)勢:
- 基于CNN的缺口識別模型
- 支持多種滑塊類型
- 識別精度高達(dá)95%+
- 無需額外標(biāo)注訓(xùn)練
2. Selenium - 瀏覽器自動化
pip install selenium
配套組件:
- ChromeDriver:匹配Chrome瀏覽器版本
- undetected_chromedriver:繞過自動化檢測
- WebDriver Manager:自動管理瀏覽器驅(qū)動
三、完整實(shí)現(xiàn)流程
1. 環(huán)境初始化
import time
import dddocr
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver import ActionChains
from selenium.webdriver.support.ui import WebDriverWait
from webdriver_manager.chrome import ChromeDriverManager
???????# 初始化瀏覽器
def init_browser():
options = webdriver.ChromeOptions()
options.add_argument("--disable-blink-features=AutomationControlled")
options.add_experimental_option("excludeSwitches", ["enable-automation"])
driver = webdriver.Chrome(ChromeDriverManager().install(), options=options)
driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})")
return driver2. 圖像處理與缺口識別
def detect_gaps(bg_path, gap_path):
ocr = dddocr.DdddOcr(show_ad=False)
# 讀取背景圖和滑塊圖
with open(bg_path, 'rb') as f:
target_bytes = f.read()
with open(gap_path, 'rb') as f:
background_bytes = f.read()
# 識別多個(gè)缺口位置
results = ocr.slide_match(target_bytes, background_bytes, simple_target=True)
# 過濾低置信度結(jié)果
valid_gaps = [res for res in results if res['confidence'] > 0.7]
# 按位置排序并選擇最可能的缺口
if valid_gaps:
# 選擇X坐標(biāo)最小的缺口(通常是最左側(cè)的正確缺口)
target_gap = min(valid_gaps, key=lambda x: x['target'][0])
return target_gap
return None3. 智能移動軌跡生成
def generate_move_track(distance):
"""生成擬人化移動軌跡"""
track = []
current = 0
mid = distance * 0.8
t = 0.2
v = 0
while current < distance:
if current < mid:
a = 2 # 加速階段
else:
a = -3 # 減速階段
v0 = v
v = v0 + a * t
move = v0 * t + 0.5 * a * t * t
current += move
track.append(round(move))
# 微調(diào)確保準(zhǔn)確到達(dá)
overshoot = current - distance
if overshoot > 0:
track.append(-round(overshoot))
return track4. 自動化驗(yàn)證執(zhí)行
def execute_slide_verification(driver, gap_element, track):
"""執(zhí)行滑塊拖動操作"""
action = ActionChains(driver)
action.click_and_hold(gap_element).perform()
# 分段移動模擬人工操作
for move in track:
action.move_by_offset(move, random.randint(-2, 2)).perform()
time.sleep(random.uniform(0.01, 0.05))
# 添加隨機(jī)抖動
action.move_by_offset(random.randint(-3, 3), random.randint(-3, 3)).perform()
time.sleep(0.1)
action.release().perform()
四、多缺口識別策略優(yōu)化
1. 多重過濾機(jī)制
def filter_valid_gaps(results, bg_width):
"""多維度過濾有效缺口"""
valid_gaps = []
for res in results:
x, y = res['target'][0], res['target'][1]
# 1. 置信度過濾
if res['confidence'] < 0.65:
continue
# 2. 邊界過濾(排除邊緣10%區(qū)域)
if x < bg_width * 0.1 or x > bg_width * 0.9:
continue
# 3. 缺口尺寸過濾
gap_width = res['target'][2] - res['target'][0]
if not (40 <= gap_width <= 70): # 典型缺口寬度范圍
continue
# 4. 與其他缺口距離過濾
if any(abs(x - gap['target'][0]) < 20 for gap in valid_gaps):
continue
valid_gaps.append(res)
return valid_gaps2. 上下文關(guān)聯(lián)分析
def select_most_likely_gap(gaps, previous_gaps=[]):
"""基于歷史記錄選擇最可能缺口"""
if not gaps:
return None
# 優(yōu)先選擇水平位置最近的缺口
if previous_gaps:
last_x = previous_gaps[-1]['target'][0]
return min(gaps, key=lambda x: abs(x['target'][0] - last_x))
# 首次選擇最左側(cè)缺口(80%情況下正確)
return min(gaps, key=lambda x: x['target'][0])
五、完整工作流實(shí)現(xiàn)
def solve_slide_captcha(driver, max_retry=3):
"""處理滑塊驗(yàn)證主函數(shù)"""
retry_count = 0
while retry_count < max_retry:
try:
# 1. 定位元素
bg_element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.CLASS_NAME, "captcha-bg"))
)
gap_element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.CLASS_NAME, "captcha-gap"))
)
# 2. 保存驗(yàn)證圖片
bg_location = bg_element.location
bg_size = bg_element.size
driver.save_screenshot("screenshot.png")
# 3. 裁剪背景圖和滑塊圖
crop_image("screenshot.png", "bg.png",
bg_location['x'], bg_location['y'],
bg_size['width'], bg_size['height'])
# 4. 缺口識別
target_gap = detect_gaps("bg.png", "gap_template.png")
if not target_gap:
raise Exception("No valid gap detected")
# 5. 計(jì)算移動距離(考慮縮放比例)
scale_ratio = bg_size['width'] / target_gap['background'][0]
move_distance = target_gap['target'][0] * scale_ratio - 25
# 6. 生成移動軌跡
track = generate_move_track(move_distance)
# 7. 執(zhí)行滑塊操作
execute_slide_verification(driver, gap_element, track)
# 8. 驗(yàn)證結(jié)果檢查
time.sleep(2)
if "驗(yàn)證成功" in driver.page_source:
return True
except Exception as e:
print(f"Attempt {retry_count+1} failed: {str(e)}")
retry_count += 1
# 點(diǎn)擊刷新按鈕
driver.find_element(By.CLASS_NAME, "captcha-refresh").click()
time.sleep(1)
return False六、反檢測對抗策略
1. 瀏覽器指紋偽裝
def mask_browser_fingerprint(driver):
# 修改WebGL供應(yīng)商
driver.execute_script(
"const getParameter = WebGLRenderingContext.getParameter;"
"WebGLRenderingContext.prototype.getParameter = function(parameter) {"
" if (parameter === 37445) return 'Intel Inc.';"
" if (parameter === 37446) return 'Intel Iris OpenGL Engine';"
" return getParameter(parameter);"
"};"
)
# 修改屏幕分辨率
driver.execute_script(
"Object.defineProperty(screen, 'width', {get: () => 1920});"
"Object.defineProperty(screen, 'height', {get: () => 1080});"
)
# 修改時(shí)區(qū)
driver.execute_script(
"Object.defineProperty(Intl.DateTimeFormat.prototype, 'resolvedOptions', {"
" value: function() {"
" return { timeZone: 'Asia/Shanghai' };"
" }"
"});"
)2. 行為模式偽裝
def human_like_mouse_movement(driver, element):
"""模擬人類鼠標(biāo)移動路徑"""
action = ActionChains(driver)
location = element.location_once_scrolled_into_view
# 生成隨機(jī)起始點(diǎn)
start_x = random.randint(100, 300)
start_y = random.randint(300, 500)
# 移動到元素上方隨機(jī)點(diǎn)
action.move_by_offset(start_x, start_y).perform()
time.sleep(random.uniform(0.2, 0.5))
# 隨機(jī)曲線路徑
points = generate_bezier_curve(
start_x, start_y,
location['x'] + 10, location['y'] + 10,
points=30
)
for point in points:
action.move_by_offset(point[0], point[1]).perform()
time.sleep(random.uniform(0.01, 0.03))七、高級應(yīng)用場景
1. 多類型驗(yàn)證碼統(tǒng)一處理
def universal_captcha_solver(driver):
"""通用驗(yàn)證碼處理框架"""
captcha_type = identify_captcha_type(driver)
if captcha_type == "SLIDE":
return solve_slide_captcha(driver)
elif captcha_type == "TEXT":
return solve_text_captcha(driver)
elif captcha_type == "CLICK":
return solve_click_captcha(driver)
else:
raise Exception("Unsupported captcha type")
2. 分布式驗(yàn)證碼破解系統(tǒng)

八、常見問題解決方案
問題1:缺口識別錯(cuò)誤率高
解決方案:
# 圖像增強(qiáng)預(yù)處理
def enhance_image(image_path):
img = cv2.imread(image_path)
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img = cv2.GaussianBlur(img, (3, 3), 0)
img = cv2.Canny(img, 100, 200)
cv2.imwrite("enhanced.png", img)
return "enhanced.png"
問題2:被檢測為自動化程序
解決方案:
# 使用undetected_chromedriver
import undetected_chromedriver as uc
driver = uc.Chrome(version_main=105)
driver.get('https://target-website.com')
問題3:移動軌跡被識別
解決方案:
# 添加人類特征抖動
def humanize_track(track):
# 隨機(jī)插入微停頓
for _ in range(3):
pos = random.randint(5, len(track)-5)
track.insert(pos, 0)
# 添加垂直抖動
return [(x, random.randint(-1, 1)) for x in track]
九、項(xiàng)目優(yōu)化與擴(kuò)展
1. 模型持續(xù)訓(xùn)練
def collect_training_data():
"""收集失敗案例用于模型改進(jìn)"""
if not solve_slide_captcha(driver):
save_failed_case(bg_image, gap_image, gap_position)
# 定期使用新數(shù)據(jù)訓(xùn)練模型
retrain_dddocr_model()
2. 驗(yàn)證碼類型識別
def identify_captcha_type(driver):
"""自動識別驗(yàn)證碼類型"""
if driver.find_elements(By.CLASS_NAME, "slider-captcha"):
return "SLIDE"
elif driver.find_elements(By.ID, "captcha-image"):
return "TEXT"
elif driver.find_elements(By.CLASS_NAME, "point-captcha"):
return "CLICK"
else:
return "UNKNOWN"
十、法律與倫理聲明
重要注意事項(xiàng):
- 本文技術(shù)僅限學(xué)習(xí)交流使用
- 禁止用于非法破解和商業(yè)用途
- 尊重網(wǎng)站防護(hù)系統(tǒng)的合法權(quán)益
- 測試使用自有網(wǎng)站或授權(quán)平臺
- 遵守《網(wǎng)絡(luò)安全法》相關(guān)規(guī)定
合法使用場景:
- 企業(yè)內(nèi)部系統(tǒng)自動化測試
- 授權(quán)后的網(wǎng)站性能測試
- 安全防護(hù)系統(tǒng)的漏洞驗(yàn)證
- 學(xué)術(shù)研究和技術(shù)交流
結(jié)語:技術(shù)發(fā)展趨勢
隨著AI對抗的升級,滑塊驗(yàn)證技術(shù)也在持續(xù)進(jìn)化:
- 三維滑塊驗(yàn)證:增加Z軸深度識別
- 動態(tài)變形缺口:缺口形狀實(shí)時(shí)變化
- 行為生物特征:基于鼠標(biāo)動力學(xué)分析
- 多模態(tài)驗(yàn)證:結(jié)合滑塊+點(diǎn)擊+語音
- 區(qū)塊鏈驗(yàn)證:去中心化驗(yàn)證機(jī)制
本文實(shí)現(xiàn)的Python+dddocr解決方案,通過以下關(guān)鍵技術(shù)點(diǎn)突破多缺口驗(yàn)證:
- 基于深度學(xué)習(xí)的缺口識別
- 擬人化移動軌跡生成
- 瀏覽器指紋偽裝技術(shù)
- 智能失敗重試機(jī)制
- 分布式破解架構(gòu)設(shè)計(jì)
到此這篇關(guān)于Python自動化實(shí)現(xiàn)多缺口滑塊驗(yàn)證的文章就介紹到這了,更多相關(guān)Python多缺口滑塊驗(yàn)證內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python小例子-縮進(jìn)式編碼+算術(shù)運(yùn)算符+定義與賦值
這篇文章主要給大家分享一些python學(xué)習(xí)小例子,內(nèi)容包括縮進(jìn)式編碼風(fēng)格、算術(shù)運(yùn)算符、定義與賦值,需要的小伙伴可以參考一下2022-04-04
Python 相對路徑報(bào)錯(cuò):"No such file or 
如果你取相對路徑不是在主文件里,可能就會有相對路徑問題:"No such file or directory",由于python 的相對路徑,相對的都是主文件所以會出現(xiàn)Python 相對路徑報(bào)錯(cuò),今天小編給大家?guī)砹送昝澜鉀Q方案,感興趣的朋友一起看看吧2023-02-02
基于Python輕松制作一個(gè)股票K線圖網(wǎng)站
在當(dāng)今這個(gè)人手一個(gè)?Web?服務(wù)的年代,GUI?程序還是沒有?Web?服務(wù)來的香啊。所以本文將用Python制作一個(gè)簡單的股票K線圖網(wǎng)站,感興趣的可以了解一下2022-09-09
django 實(shí)現(xiàn)手動存儲文件到model的FileField
這篇文章主要介紹了django 實(shí)現(xiàn)手動存儲文件到model的FileField,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03
Python獲取服務(wù)器信息的最簡單實(shí)現(xiàn)方法
這篇文章主要介紹了Python獲取服務(wù)器信息的最簡單實(shí)現(xiàn)方法,涉及Python中urllib2庫的使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03
利用Opencv中Houghline方法實(shí)現(xiàn)直線檢測
這篇文章主要為大家詳細(xì)介紹了利用Opencv中的Houghline方法進(jìn)行直線檢測,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-02-02

