Python自動化實現(xiàn)多缺口滑塊驗證
一、多缺口滑塊驗證的技術(shù)原理
多缺口滑塊驗證是傳統(tǒng)滑塊驗證的升級版,通過設(shè)置多個干擾項增加識別難度:
技術(shù)難點分析:
- 多個相似缺口的干擾
- 缺口邊緣模糊處理
- 背景紋理干擾
- 非線性的移動軌跡檢測
- 時間限制和失敗重試機制
二、核心工具庫介紹
1. dddocr - 深度學習驗證碼識別
pip install dddocr # 安裝命令
特性優(yōu)勢:
- 基于CNN的缺口識別模型
- 支持多種滑塊類型
- 識別精度高達95%+
- 無需額外標注訓練
2. Selenium - 瀏覽器自動化
pip install selenium
配套組件:
- ChromeDriver:匹配Chrome瀏覽器版本
- undetected_chromedriver:繞過自動化檢測
- WebDriver Manager:自動管理瀏覽器驅(qū)動
三、完整實現(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 driver
2. 圖像處理與缺口識別
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() # 識別多個缺口位置 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坐標最小的缺口(通常是最左側(cè)的正確缺口) target_gap = min(valid_gaps, key=lambda x: x['target'][0]) return target_gap return None
3. 智能移動軌跡生成
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)確保準確到達 overshoot = current - distance if overshoot > 0: track.append(-round(overshoot)) return track
4. 自動化驗證執(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)) # 添加隨機抖動 action.move_by_offset(random.randint(-3, 3), random.randint(-3, 3)).perform() time.sleep(0.1) action.release().perform()
四、多缺口識別策略優(yōu)化
1. 多重過濾機制
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_gaps
2. 上下文關(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])
五、完整工作流實現(xiàn)
def solve_slide_captcha(driver, max_retry=3): """處理滑塊驗證主函數(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. 保存驗證圖片 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. 計算移動距離(考慮縮放比例) 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. 驗證結(jié)果檢查 time.sleep(2) if "驗證成功" in driver.page_source: return True except Exception as e: print(f"Attempt {retry_count+1} failed: {str(e)}") retry_count += 1 # 點擊刷新按鈕 driver.find_element(By.CLASS_NAME, "captcha-refresh").click() time.sleep(1) return False
六、反檢測對抗策略
1. 瀏覽器指紋偽裝
def mask_browser_fingerprint(driver): # 修改WebGL供應商 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});" ) # 修改時區(qū) driver.execute_script( "Object.defineProperty(Intl.DateTimeFormat.prototype, 'resolvedOptions', {" " value: function() {" " return { timeZone: 'Asia/Shanghai' };" " }" "});" )
2. 行為模式偽裝
def human_like_mouse_movement(driver, element): """模擬人類鼠標移動路徑""" action = ActionChains(driver) location = element.location_once_scrolled_into_view # 生成隨機起始點 start_x = random.randint(100, 300) start_y = random.randint(300, 500) # 移動到元素上方隨機點 action.move_by_offset(start_x, start_y).perform() time.sleep(random.uniform(0.2, 0.5)) # 隨機曲線路徑 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))
七、高級應用場景
1. 多類型驗證碼統(tǒng)一處理
def universal_captcha_solver(driver): """通用驗證碼處理框架""" 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. 分布式驗證碼破解系統(tǒng)
八、常見問題解決方案
問題1:缺口識別錯誤率高
解決方案:
# 圖像增強預處理 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): # 隨機插入微停頓 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]
九、項目優(yōu)化與擴展
1. 模型持續(xù)訓練
def collect_training_data(): """收集失敗案例用于模型改進""" if not solve_slide_captcha(driver): save_failed_case(bg_image, gap_image, gap_position) # 定期使用新數(shù)據(jù)訓練模型 retrain_dddocr_model()
2. 驗證碼類型識別
def identify_captcha_type(driver): """自動識別驗證碼類型""" 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"
十、法律與倫理聲明
重要注意事項:
- 本文技術(shù)僅限學習交流使用
- 禁止用于非法破解和商業(yè)用途
- 尊重網(wǎng)站防護系統(tǒng)的合法權(quán)益
- 測試使用自有網(wǎng)站或授權(quán)平臺
- 遵守《網(wǎng)絡安全法》相關(guān)規(guī)定
合法使用場景:
- 企業(yè)內(nèi)部系統(tǒng)自動化測試
- 授權(quán)后的網(wǎng)站性能測試
- 安全防護系統(tǒng)的漏洞驗證
- 學術(shù)研究和技術(shù)交流
結(jié)語:技術(shù)發(fā)展趨勢
隨著AI對抗的升級,滑塊驗證技術(shù)也在持續(xù)進化:
- 三維滑塊驗證:增加Z軸深度識別
- 動態(tài)變形缺口:缺口形狀實時變化
- 行為生物特征:基于鼠標動力學分析
- 多模態(tài)驗證:結(jié)合滑塊+點擊+語音
- 區(qū)塊鏈驗證:去中心化驗證機制
本文實現(xiàn)的Python+dddocr解決方案,通過以下關(guān)鍵技術(shù)點突破多缺口驗證:
- 基于深度學習的缺口識別
- 擬人化移動軌跡生成
- 瀏覽器指紋偽裝技術(shù)
- 智能失敗重試機制
- 分布式破解架構(gòu)設(shè)計
到此這篇關(guān)于Python自動化實現(xiàn)多缺口滑塊驗證的文章就介紹到這了,更多相關(guān)Python多缺口滑塊驗證內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python小例子-縮進式編碼+算術(shù)運算符+定義與賦值
這篇文章主要給大家分享一些python學習小例子,內(nèi)容包括縮進式編碼風格、算術(shù)運算符、定義與賦值,需要的小伙伴可以參考一下2022-04-04Python 相對路徑報錯:"No such file or 
如果你取相對路徑不是在主文件里,可能就會有相對路徑問題:"No such file or directory",由于python 的相對路徑,相對的都是主文件所以會出現(xiàn)Python 相對路徑報錯,今天小編給大家?guī)砹送昝澜鉀Q方案,感興趣的朋友一起看看吧2023-02-02django 實現(xiàn)手動存儲文件到model的FileField
這篇文章主要介紹了django 實現(xiàn)手動存儲文件到model的FileField,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03利用Opencv中Houghline方法實現(xiàn)直線檢測
這篇文章主要為大家詳細介紹了利用Opencv中的Houghline方法進行直線檢測,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-02-02