Python3破解滑塊驗證碼的完整方案
一、滑塊驗證碼原理
1.1 驗證機制邏輯
主流網(wǎng)頁滑塊驗證碼由兩張核心圖片組成:完整背景圖、帶缺口的背景圖+獨立滑塊圖。驗證核心邏輯分為兩步:
- 位置校驗:精準計算滑塊需要橫向移動的像素距離,使滑塊與缺口完全重合;
- 行為校驗:檢測滑動速度、軌跡、停頓節(jié)奏,判斷是否為機器機械拖拽。
1.2 固定像素位移+勻速拖拽方案弊端
網(wǎng)上多數(shù)入門教程采用「固定像素位移+勻速拖拽」方案,存在明顯缺陷:
- 固定位移無法適配動態(tài)隨機缺口位置;
- 勻速直線運動軌跡完全不符合真人操作習慣,極易觸發(fā)風控攔截;
- 未處理圖片縮放、模糊干擾,缺口識別準確率極低。
二、技術(shù)選型與環(huán)境準備
本次采用「OpenCV 圖像識別 + Selenium 自動化操控 + 物理軌跡模擬」技術(shù)棧,平衡開發(fā)成本與破解成功率,適配90%以上常規(guī)網(wǎng)頁滑塊驗證碼。
2.1 核心依賴庫
- opencv-python:實現(xiàn)圖像灰度處理、高斯模糊、邊緣檢測、模板匹配,精準定位缺口位置;
- selenium:操控瀏覽器模擬鼠標拖拽行為;
- Pillow:輔助圖片下載、格式預處理;
- numpy:圖像矩陣運算、軌跡坐標計算。
2.2 環(huán)境安裝命令
pip install opencv-python selenium pillow numpy
三、缺口精準定位(OpenCV 方案)
缺口定位是基礎(chǔ),采用邊緣檢測+模板匹配優(yōu)化方案,通過高斯模糊去除背景噪點、Canny算法提取邊緣特征,有效規(guī)避漸變背景、干擾線條導致的識別偏差,適配多數(shù)復雜背景滑塊驗證碼。
3.1 圖像預處理邏輯
讀取完整背景圖與缺口背景圖;
灰度化處理,降低圖像數(shù)據(jù)維度,提升運算速度;
高斯模糊降噪,弱化背景紋理干擾;
Canny邊緣檢測,提取兩張圖片的輪廓差異;
對比輪廓差異,計算缺口橫向偏移像素值。
3.2 完整定位代碼實現(xiàn)
import cv2
import numpy as np
from PIL import Image
def preprocess_image(img_path):
"""圖像預處理:灰度化+高斯模糊+邊緣檢測"""
img = cv2.imread(img_path)
# 灰度化
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 高斯模糊降噪
blur = cv2.GaussianBlur(gray, (5, 5), 0)
# Canny邊緣檢測
edge = cv2.Canny(blur, 50, 150)
return edge
def get_gap_offset(bg_path, gap_bg_path):
"""
計算滑塊需要滑動的偏移距離
:param bg_path: 完整背景圖路徑
:param gap_bg_path: 帶缺口背景圖路徑
:return: 缺口橫向偏移像素值
"""
bg_edge = preprocess_image(bg_path)
gap_edge = preprocess_image(gap_bg_path)
# 圖像差值運算,提取缺口輪廓
diff = cv2.absdiff(bg_edge, gap_edge)
# 尋找輪廓
contours, _ = cv2.findContours(diff, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for contour in contours:
# 篩選符合滑塊尺寸的輪廓
x, y, w, h = cv2.boundingRect(contour)
if 30 < w < 100 and 30 < h < 100:
return x # 返回缺口橫向起始坐標,即滑動偏移量
return 0
四、真人物理滑動軌跡模擬
單純精準定位缺口依然無法通過校驗,平臺風控核心檢測滑動行為特征。機器勻速拖拽、無停頓、無速度波動的行為特征極易被攔截。真人滑動規(guī)律為:先加速、再減速、小幅微調(diào)、末端輕微停頓。
4.1 軌跡生成算法
通過分段函數(shù)生成非線性軌跡,模擬人類手部操作的慣性與微調(diào)行為,同時加入隨機微小停頓,規(guī)避風控檢測。
4.2 軌跡生成代碼
import random
import time
def get_slide_track(distance):
"""
生成真人滑動軌跡
:param distance: 需要滑動的總像素距離
:return: 每一步滑動的像素偏移列表
"""
track_list = []
current = 0
# 初始加速階段(前70%距離)
mid = distance * 0.7
# 加速度、初始速度隨機化,模擬不同人操作習慣
v = 0
a = random.uniform(2, 4)
while current < mid:
v += a
track_list.append(round(v))
current += round(v)
# 末端減速階段(后30%距離)
a = -random.uniform(1, 3)
while current < distance:
v += a
if v < 0.5:
v = 0.5
track_list.append(round(v))
current += round(v)
# 誤差修正:補足最后距離,避免偏移
last = sum(track_list) - distance
if last > 0:
track_list[-1] -= last
elif last < 0:
track_list[-1] += abs(last)
# 加入隨機微小停頓節(jié)點
pause_pos = random.randint(3, len(track_list)-2)
track_list.insert(pause_pos, 0)
return track_list
五、完整自動化流程
結(jié)合圖像定位、軌跡生成、瀏覽器操控,實現(xiàn)端到端自動破解,流程包含:打開頁面、下載驗證碼圖片、計算偏移、模擬滑動、驗證結(jié)果判斷。
完整整合代碼
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.chrome.options import Options
def crack_slide_captcha(url):
# 配置瀏覽器參數(shù),規(guī)避自動化檢測
chrome_options = Options()
chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])
chrome_options.add_experimental_option("useAutomationExtension", False)
driver = webdriver.Chrome(options=chrome_options)
driver.maximize_window()
driver.get(url)
time.sleep(2)
try:
# 1. 定位驗證碼元素,下載背景圖、缺口圖(根據(jù)實際頁面DOM修改選擇器)
# 此處為通用示例,需根據(jù)目標網(wǎng)站調(diào)整圖片元素獲取邏輯
bg_img = driver.find_element("css selector", "div.bg-img")
gap_img = driver.find_element("css selector", "div.gap-img")
# 截圖保存圖片
bg_img.screenshot("bg.png")
gap_img.screenshot("gap.png")
time.sleep(1)
# 2. 計算滑動偏移量
offset = get_gap_offset("bg.png", "gap.png")
# 適配頁面縮放比例
scale = driver.execute_script("return window.devicePixelRatio")
real_offset = offset / scale
# 3. 獲取滑動軌跡
track = get_slide_track(real_offset)
# 4. 模擬真人拖拽
slider = driver.find_element("css selector", "div.slider-btn")
ActionChains(driver).click_and_hold(slider).perform()
time.sleep(random.uniform(0.1, 0.2)) # 按住滑塊短暫停頓
# 分段滑動
for step in track:
ActionChains(driver).move_by_offset(xoffset=step, yoffset=0).perform()
time.sleep(random.uniform(0.005, 0.01))
# 末端微調(diào)+短暫停頓,模擬真人對齊操作
time.sleep(random.uniform(0.2, 0.4))
ActionChains(driver).release().perform()
time.sleep(3)
print("滑塊驗證執(zhí)行完成,可查看結(jié)果")
except Exception as e:
print(f"破解失敗:{str(e)}")
finally:
# driver.quit() # 調(diào)試階段注釋,查看頁面結(jié)果
if __name__ == "__main__":
# 替換為目標帶滑塊驗證碼的頁面地址
target_url = "https://xxx.com/login"
crack_slide_captcha(target_url)
本文技術(shù)方案僅用于個人學習、自動化測試、合規(guī)數(shù)據(jù)采集場景。嚴禁用于非法爬蟲、惡意攻擊、違規(guī)批量操作等違法行為,違規(guī)使用產(chǎn)生的一切后果由使用者自行承擔。
到此這篇關(guān)于Python3破解滑塊驗證碼的完整方案的文章就介紹到這了,更多相關(guān)Python破解滑塊驗證碼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python 動態(tài)獲取當前運行的類名和函數(shù)名的方法
這篇文章主要介紹了python 動態(tài)獲取當前運行的類名和函數(shù)名的方法,分別介紹使用內(nèi)置方法、sys模塊、修飾器、inspect模塊等方法,需要的朋友可以參考下2014-04-04
Python編程使用DRF實現(xiàn)一次性驗證碼OTP
今天講一下如何用 Django REST framework[1](DRF) 來實現(xiàn) OTP,閱讀本文需要一定的 DRF 的基礎(chǔ)知識,有需要的朋友可以借鑒參考下2021-09-09
python簡單幾步獲取各種DOS命令顯示的內(nèi)容詳解流程
python包實現(xiàn)?retrying?重復回調(diào)操作

