一、了解滑動驗證碼的工作原理
滑動驗證碼是一種常見的人機驗證方式,它要求用戶在指定時間內完成拖動一個圖片滑塊的操作,以證明該用戶是人而非機器程序。因此,想要打敗滑動驗證碼,首先要了解它的工作原理。具體來說,滑動驗證碼的驗證過程包括以下幾個步驟:
1、在頁面中生成一張含有特定標識的圖片,並將其切分成若干個大小相同的滑塊;
2、用戶在指定時間內,通過滑鼠或手指拖動一個圖片滑塊,將其對齊到頁面中顯示的指定位置上;
3、系統比對用戶滑塊的特定標識和頁面中滑塊的特定標識,如果匹配則視為該用戶是可信的人類用戶,否則認為該用戶是機器程序。
二、破解滑動驗證碼的通用思路
雖然每個滑動驗證碼都會有一定的差異,但是我們可以總結出一些通用的破解思路,具體分為以下幾點:
1、分析滑動驗證圖片標識的生成方式,例如是否基於時間戳、部分採用靜態元素等;
2、分析滑塊位置計算的演算法,例如是否固定或者模糊化,在這個基礎上針對驗證碼做合適的區塊劃分;
3、分析滑塊特徵提取及比對的演算法,例如在目標區域內獲取特徵點、計算哈希等等,針對滑塊位置模糊及雜訊做合適的處理;
4、根據前三點的信息做合適的模擬,並通過模擬來破解滑動驗證碼。
三、破解滑動驗證碼的具體方法
接下來,我們分別從圖片標識、滑塊位置計算和滑塊特徵提取三個方面來具體介紹破解滑動驗證碼的方法。
1、破解圖片標識
滑動驗證碼的圖片標識通常是由一些字元、數字、線條等隨機生成的圖案拼接而成,包括靜態和動態元素。破解滑動驗證碼需要先對圖片進行處理,獲取圖片標識,並將其與後續的任務進行比對。在許多滑動驗證碼中,圖片標識是通過JS生成的。通過使用Selenium這樣的自動化測試工具可以獲取到JS返回內容中標識的值。如果驗證碼的圖片標識是由特定的時間戳生成的,可以先請求驗證碼的頁面獲取到相同時間戳的頁面,並通過正則表達式從頁面html中獲取標識。
“`python
# 使用Selenium來獲取驗證碼圖片標識的值
from selenium import webdriver
driver = webdriver.Chrome(executable_path=’chromedriver.exe’)
driver.get(url)
time.sleep(3)
# 通過JS獲取到圖片標識的值
style = driver.find_element_by_id(‘captcha’).get_attribute(‘style’)
pattern = re.compile(r”background-image: url\((.*?)\);.*background-position: (.*?) (.*?)px;”, re.S)
result = pattern.findall(style)
# result[0][0] 為圖片的url,result[0][1]為圖片x坐標,result[0][2]為圖片y坐標
“`
2、破解滑塊位置計算
滑塊驗證碼的關鍵是如何計算滑塊的位置。一些滑塊位置計算演算法通常是基於時間戳,也有一些演算法會包含一些複雜的邏輯。我們可以通過了解滑塊位置演算法及其模糊化技巧來對其進行破解。
我們可以得到一個運動軌跡,然後根據運動軌跡進行分析。在大多數情況下,滑塊位置計算演算法中的時間戳會出現偏差,因此需要做一些微調來彌補。可以通過對抗式生成網路(GAN)訓練等方法,結合不同的演算法,進行計算。
“`python
# Python 代碼示例
# 模擬獲取下滑滑塊的方法
def get_tracks(distance, seconds):
# 一個軌跡由多個軌跡段組成,每個軌跡段滑動的時間也不同,通過融合軌跡段達到時間累加的效果
# v0 為起始速度,vd 為結束速度,a為加速度,t為時間,S為位移,v為速度。加速部分與減速部分對稱
v0 = 0
vt = 0.5
a = 4
tracks = []
current = 0
mid = distance * 4 / 5
while current < distance:
if current < mid:
a = 4
else:
a = -4
t = random.randint(10, 50) / 100 * (1 + random.random())
s = v0 * t + 0.5 * a * (t ** 2)
vt = vt + a * t
current += s
tracks.append(round(vt * seconds))
return tracks
“`
3、破解滑塊特徵提取
滑動驗證碼通常在滑塊上添加了若干條噪線或者在滑塊周邊加入干擾物,來增加其難度,但這些也是可以破解的。我們可以通過對滑塊進行特徵點提取,計算哈希值等演算法來破解滑塊的特徵識別,可以使用OpenCV等工具庫來提取特徵點(SIFT,SURF,ORB等演算法)。
“`python
# Python 代碼示例
# 使用OpenCV提取特徵點及哈希值
import cv2
import numpy as np
# 提供滑塊圖片和正確位置參數
def process_image(img, pos):
# 灰度化
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 高斯模糊
blur = cv2.GaussianBlur(gray, (3, 3), 0)
# 邊緣提取
canny = cv2.Canny(blur, 100, 200)
# 找輪廓
contours, hierarchy = cv2.findContours(canny, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# 在輪廓中查找正確的輪廓
min_x = pos[0]
max_x = pos[0] + pos[2]
min_y = pos[1]
max_y = pos[1] + pos[3]
for contour in contours:
# 去除小輪廓
if cv2.contourArea(contour) < pos[-1] – 1:
continue
# 查找包含滑塊的輪廓
startX, startY, w, h = cv2.boundingRect(contour)
endX = startX + w
endY = startY + h
if startX max_x or startY max_y:
continue
# cv2.rectangle(canny, (startX, startY), (endX, endY), (0, 255, 0), 5)
# 提取特徵點
img_gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
sift = cv2.xfeatures2d.SIFT_create()
kp, des = sift.detectAndCompute(img_gray[startY:endY, startX:endX], None)
# 判斷特徵點是否符合條件
if len(kp) < 10:
continue
# 需要30個特徵點才能做出決策
m = hashlib.md5()
for point in np.float32([kp[i].pt for i in range(30)]):
m.update(str(point).encode())
return m.hexdigest()
“`
總結
以上是一些簡單的方法,可以欺騙大部分的滑動驗證碼。當然,也可以結合多種方法、多個工具、多個人工參數等技術手段,實現更好的自動破解效果。同時,也需要認識到,打敗滑動驗證碼是一個動態的過程,驗證碼設計者也在不斷升級相應的技術手段,因此,作為破解方,我們也需要不斷更新我們的技術手段,才能保持相對競爭的優勢。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/227738.html