在网页安全中,滑块验证码是一种常见的验证方式,用于防止机器人恶意操作。本文将介绍如何破解网易易盾的滑块验证码。
获取滑块验证码的图片
首先,我们需要从网页中获取滑块验证码的两张图片:背景图和滑块图。通过Selenium WebDriver,我们可以定位到这两张图片的元素,并获取它们的链接。
python
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
def get_captcha_images(driver):
# 等待滑块验证码加载完成
captcha_bg = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.CLASS_NAME, 'yidun_bg-img'))
)
captcha_jigsaw = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.CLASS_NAME, 'yidun_jigsaw'))
)
# 获取滑块验证码图片链接
bg_img_url = captcha_bg.get_attribute('src')
jigsaw_img_url = captcha_jigsaw.get_attribute('src')
# 下载滑块验证码图片
bg_img = Image.open(BytesIO(requests.get(bg_img_url).content))
jigsaw_img = Image.open(BytesIO(requests.get(jigsaw_img_url).content))
return bg_img, jigsaw_img
这段代码使用了Selenium WebDriver来定位验证码图片的元素,并通过其src属性获取图片链接。然后,使用requests库下载图片,并使用PIL库打开这两张图片。
去除待滑动图片的黑边
由于滑块图片可能带有黑色边框,我们需要去除这些边框,以便后续处理。
import cv2
def remove_black_border(img):
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
_, thresh = cv2.threshold(gray, 1, 255, cv2.THRESH_BINARY)
contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
x, y, w, h = cv2.boundingRect(contours[0])
cropped_img = img[y:y+h, x:x+w]
return cropped_img
这段代码使用OpenCV库来去除滑块图片的黑色边框。首先,将图片转换为灰度图,然后使用阈值处理将图片二值化。接下来,使用findContours函数找到轮廓,并使用boundingRect函数获取边框的位置信息。最后,根据边框的位置裁剪原始图片,去除黑色边框。
算出缺口的位置
接下来,我们需要计算滑块图片中缺口的位置,以便后续模拟滑动操作。
python更多内容联系1436423940
import numpy as np
def find_gap_position(bg_img, jigsaw_img):
bg_gray = cv2.cvtColor(bg_img, cv2.COLOR_BGR2GRAY)
jigsaw_gray = cv2.cvtColor(jigsaw_img, cv2.COLOR_BGR2GRAY)
result = cv2.matchTemplate(bg_gray, jigsaw_gray, cv2.TM_CCOEFF_NORMED)
_, _, _, (x, _) = cv2.minMaxLoc(result)
return x
这段代码使用OpenCV库中的模板匹配功能来计算滑块图片中缺口的位置。首先,将背景图和滑块图转换为灰度图,然后使用matchTemplate函数找到滑块图在背景图中的匹配位置,并返回缺口的x坐标。
模拟滑动操作
最后,我们模拟滑动操作,将滑块拖动到正确的位置。
python
def simulate_slide(driver, distance):
slider = driver.find_element_by_class_name('yidun_slider')
ActionChains(driver).click_and_hold(slider).perform()
ActionChains(driver).move_by_offset(distance, 0).perform()
ActionChains(driver).release().perform()