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

