滑动验证码是网站常用的一种人机验证方式,但对于自动化程序来说,识别并拖动滑块并不容易。本文将介绍如何使用Python和Selenium库来实现滑动验证码的破解。
1. 准备工作
首先,我们需要安装Python和Selenium,并下载对应浏览器的WebDriver。在本例中,我们使用Chrome浏览器,所以需要下载Chrome WebDriver。
python
pip install selenium
2. 初始化Selenium
在Python脚本中初始化Selenium WebDriver,并打开目标网页。
python
Copy code
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
class CrackGeetest():
def __init__(self):
self.url = 'https://www.example.com' # 替换成目标网页地址
self.browser = webdriver.Chrome() # 替换成你的浏览器驱动路径
self.wait = WebDriverWait(self.browser, 10)
def open(self):
'''打开网页'''
self.browser.get(self.url)
3. 切换至滑动验证
模拟点击切换为滑动验证,然后点击弹出的验证按钮。
python
def change_to_slide(self):
'''切换为滑动认证'''
label = self.wait.until(
EC.element_to_be_clickable((
By.CSS_SELECTOR, '.geetest_radar_tip')))
return label
def get_geetest_button(self):
'''获取初始认证按钮'''
button = self.wait.until(
EC.element_to_be_clickable((
By.CSS_SELECTOR, '.geetest_radar_tip')))
return button
4. 获取验证图片
等待验证图片加载完成,然后获取验证图片的位置坐标并截图。
python
def wait_pic(self):
'''等待验证图片加载完成'''
self.wait.until(
EC.presence_of_element_located((
By.CSS_SELECTOR, '.geetest_popup_wrap')))
def get_position(self):
'''获取验证图片坐标'''
img = self.wait.until(EC.presence_of_element_located((
By.CLASS_NAME, 'geetest_canvas_img')))
time.sleep(2)
location = img.location
size = img.size
top, bottom = location['y'], location['y'] + size['height']
left, right = location['x'], location['x'] + size['width']
return (top, bottom, left, right)
def get_geetest_image(self, name='captcha.png'):
'''获取验证码图片'''
top, bottom, left, right = self.get_position()
print('验证图片坐标', top, bottom, left, right)
screenshot = self.browser.get_screenshot_as_png()
screenshot = Image.open(BytesIO(screenshot))
captcha = screenshot.crop((left, top, right, bottom))
captcha.save(name)
return captcha
5. 识别缺口位置
通过对比两张验证图片,找出缺口的位置。
python
def get_gap(self, image1, image2):
'''获取缺口偏移量'''
left = 60
for i in range(left, image1.size[0]):
for j in range(image1.size[1]):
if not self.is_pixel_equal(image1, image2, i, j):
left = i
return left
return left
6. 模拟滑块拼合
根据缺口位置模拟滑动滑块至缺口处。
python
def move_to_gap(self, slider, tracks):
'''拖动滑块到缺口处'''
back_tracks = [-1, -1, -2, -2, -3, -2, -2, -1, -1]
ActionChains(self.browser).click_and_hold(slider).perform()
for x in tracks: # 正向
ActionChains(self.browser).move_by_offset(
xoffset=x, yoffset=0).perform()
time.sleep(0.5)
for x in back_tracks: # 逆向
ActionChains(self.browser).move_by_offset(
xoffset=x, yoffset=0).perform()
self.shake_mouse() # 抖动
time.sleep(0.5)
ActionChains(self.browser).release().perform()
7. 主函数
将以上步骤组合起来,并执行主函数。
python
def crack(self):
try:
self.open() # 打开网页
self.wait_pic() # 等待验证图片加载完成
button = self.get_geetest_button() # 获取初始认证按钮
button.click() # 点击弹出的验证按钮
image1 = self.get_geetest_image('captcha1.png') # 获取初始验证图片
slider = self.get_slider() # 获取滑块
slider.click() # 点击滑块,弹出带缺口的验证图片
image2 = self.get_geetest_image('captcha2.png') # 获取带缺口验证图片
gap = self.get_gap(image1, image2) # 获取缺口位置
gap -= BORDER # 修正缺口位置
tracks = self.get_tracks(gap) # 获取滑动轨迹
self.move_to_gap(slider, tracks) # 拖动滑块到缺口处
except Exception as e:
print(e)
finally:
time.sleep(5)
self.browser.quit()
if __name__ == '__main__':
crack = CrackGeetest()
crack.crack()
更多内容联系1436423940