使用Python和Selenium实现滑动验证码破解

滑动验证码是网站常用的一种人机验证方式,但对于自动化程序来说,识别并拖动滑块并不容易。本文将介绍如何使用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

  • 23
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值