首页 > 其他分享 >TypeScript实现极验滑动验证码破解

TypeScript实现极验滑动验证码破解

时间:2025-01-19 23:21:56浏览次数:1  
标签:move TypeScript const await driver 极验 验证码 return async

本文将介绍如何使用TypeScript和Selenium WebDriver来实现极验滑动验证码的自动识别与破解。我们将详细讲解每一步的实现,包括模拟点击、识别滑动缺口、计算位移以及模拟拖动滑块。

识别思路
模拟点击切换为滑动验证,并显示验证界面。
识别滑动缺口的位置,计算位移。
模拟拖动滑块。更多内容访问ttocr.com或联系1436423940
若认证失败,重复调用。
实现步骤与代码
初始化
首先,初始化Selenium WebDriver对象并配置参数。极验验证码测试页面的网址如下:

typescript

import { Builder, By, until, WebDriver } from 'selenium-webdriver';
import { promises as fs } from 'fs';
import Jimp from 'jimp';

const BORDER = 6;
const URL = 'https://www.geetest.com/type/';

class CrackGeetest {
private driver: WebDriver;

constructor() {
    this.driver = new Builder().forBrowser('chrome').build();
}

async open() {
    await this.driver.get(URL);
}

async close() {
    await this.driver.quit();
}

async changeToSlide() {
    const slideOption = await this.driver.wait(until.elementLocated(By.css('.products-content ul > li:nth-child(2)')), 10000);
    await slideOption.click();
}

async getGeetestButton() {
    const button = await this.driver.wait(until.elementLocated(By.css('.geetest_radar_tip')), 10000);
    await button.click();
}

async waitPic() {
    await this.driver.wait(until.elementLocated(By.css('.geetest_popup_wrap')), 10000);
}

async getScreenshot(): Promise<Buffer> {
    const screenshot = await this.driver.takeScreenshot();
    return Buffer.from(screenshot, 'base64');
}

async getPosition() {
    const img = await this.driver.findElement(By.className('geetest_canvas_img'));
    const location = await img.getRect();
    return location;
}

async getSlider() {
    const slider = await this.driver.wait(until.elementLocated(By.className('geetest_slider_button')), 10000);
    return slider;
}

async getGeetestImage(filename: string) {
    const { x, y, width, height } = await this.getPosition();
    const screenshot = await this.getScreenshot();
    const image = await Jimp.read(screenshot);
    image.crop(x, y, width, height);
    await image.writeAsync(filename);
    return image;
}

async deleteStyle() {
    await this.driver.executeScript('document.querySelectorAll("canvas")[2].style=""');
}

isPixelEqual(img1: Jimp, img2: Jimp, x: number, y: number): boolean {
    const threshold = 60;
    const pixel1 = Jimp.intToRGBA(img1.getPixelColor(x, y));
    const pixel2 = Jimp.intToRGBA(img2.getPixelColor(x, y));
    return Math.abs(pixel1.r - pixel2.r) < threshold &&
           Math.abs(pixel1.g - pixel2.g) < threshold &&
           Math.abs(pixel1.b - pixel2.b) < threshold;
}

async getGap(img1: Jimp, img2: Jimp): Promise<number> {
    const left = 60;
    for (let i = left; i < img1.bitmap.width; i++) {
        for (let j = 0; j < img1.bitmap.height; j++) {
            if (!this.isPixelEqual(img1, img2, i, j)) {
                return i;
            }
        }
    }
    return left;
}

getTrack(distance: number): number[] {
    const track = [];
    let current = 0;
    const mid = distance * 3 / 5;
    const t = 0.2;
    let v = 0;
    distance += 14;

    while (current < distance) {
        let a;
        if (current < mid) {
            a = 2;
        } else {
            a = -1.5;
        }
        const v0 = v;
        v = v0 + a * t;
        const move = v0 * t + 0.5 * a * t * t;
        current += move;
        track.push(Math.round(move));
    }
    return track;
}

async moveToGap(slider: WebDriver, tracks: number[]) {
    await this.driver.actions().clickAndHold(slider).perform();
    for (const move of tracks) {
        await this.driver.actions().move({ x: move, y: 0 }).perform();
    }
    const backTracks = [-1, -1, -2, -2, -3, -2, -2, -1, -1];
    for (const move of backTracks) {
        await this.driver.actions().move({ x: move, y: 0 }).perform();
    }
    await this.shakeMouse();
    await this.driver.actions().release().perform();更多内容联系1436423940
}

async shakeMouse() {
    await this.driver.actions().move({ x: -3, y: 0 }).perform();
    await this.driver.actions().move({ x: 2, y: 0 }).perform();
}

async crack() {
    try {
        await this.open();
        await this.changeToSlide();
        await this.getGeetestButton();
        await this.waitPic();
        const slider = await this.getSlider();
        const image1 = await this.getGeetestImage('captcha1.png');
        await this.deleteStyle();
        const image2 = await this.getGeetestImage('captcha2.png');
        const gap = (await this.getGap(image1, image2)) - BORDER;
        const track = this.getTrack(gap);
        await this.moveToGap(slider, track);
        const success = await this.driver.wait(until.elementTextContains(await this.driver.findElement(By.className('geetest_success_radar_tip_content')), '验证成功'), 10000);
        console.log(success);
    } catch (error) {
        console.error('Failed-Retry', error);
        await this.crack();
    } finally {
        await this.close();
    }
}

}

(async () => {
const crack = new CrackGeetest();
await crack.crack();
})();

标签:move,TypeScript,const,await,driver,极验,验证码,return,async
From: https://www.cnblogs.com/ocr12/p/18680498

相关文章

  • TypeScript开发OFD阅读器指南
    1.项目概述OFD(OpenFixed-layoutDocument)是一种开放版式文档格式,类似于PDF,但具有更高的灵活性和可扩展性。开发一个OFD阅读器需要解析OFD文件的结构,并将其内容渲染到屏幕上。本文将详细介绍如何使用TypeScript开发一个简单的OFD阅读器。开发一款ofdweb阅读器有很大的挑战......
  • R 实现英文数字验证码识别
    R的强大扩展生态使其也能完成OCR任务,我们将结合magick包(图像处理)和tesseract包(OCR)来实现。安装所需包在R环境中,安装以下R包:R更多内容访问ttocr.com或联系1436423940install.packages("magick")install.packages("tesseract")R实现代码编写以下R代码来完......
  • Perl 实现英文数字验证码识别
    我们将通过结合TesseractOCR和ImageMagick工具来实现图像处理和文本识别。安装依赖确保已安装以下工具和模块:TesseractOCR:用于文本识别。ImageMagick:用于图像处理。Perl模块:Image::Magick和Tesseract::OCR。在命令行中执行以下命令:bash安装TesseractOCRsudo......
  • MATLAB 实现英文数字验证码识别
    MATLAB是一个强大的数值计算和图像处理工具,结合其内置的图像处理工具箱和OCR功能,可以轻松完成验证码识别任务。前置准备安装MATLAB确保你的MATLAB版本支持OCR功能(通常需要安装ComputerVisionToolbox)。如果没有,先通过MATLAB的工具箱管理器安装该工具箱。准备验......
  • Python 自动识别验证码的详细指南
    验证码(CAPTCHA)广泛应用于在线表单和注册页面,旨在防止自动化攻击。尽管验证码设计旨在增加机器识别的难度,但借助光学字符识别(OCR)技术,我们仍然可以实现自动化的验证码识别。在本教程中,我们将使用Python编写一个简单的验证码识别程序,利用TesseractOCR引擎结合图像预处理技术提高......
  • Python 实现简单的验证码识别
    验证码是一种常见的验证机制,用来区分用户是人还是程序。在本教程中,我们将使用Python编写一个程序,通过图像处理和OCR技术自动识别英文数字组合的验证码。以下将逐步介绍如何实现这一功能。环境准备安装Python和必要库首先,确保已安装Python。如果未安装,可以前往Python......
  • 使用 Python 实现验证码自动识别
    验证码在防止自动化攻击中扮演了重要角色,而使用OCR(光学字符识别)技术可以实现对验证码内容的自动解析和提取。在本文中,我们将使用Python结合TesseractOCR来完成英文数字验证码的识别任务。环境配置安装Python和依赖库首先,确保您已经安装了Python。若尚未安装,请访问Pyt......
  • 使用 Python 实现验证码识别的简单教程
    验证码是用于验证用户是否为机器人的重要工具。在本教程中,我们将利用Python和TesseractOCR引擎编写一个程序,用于识别英文和数字组成的验证码。通过适当的图像预处理,我们可以有效地提高识别的准确性。环境配置更多内容访问ttocr.com或联系1436423940安装Python和必需库......
  • 用 Python 实现验证码文本识别
    在本文中,我们将使用Python和TesseractOCR引擎,编写一个程序来识别英文数字验证码的内容。通过图像处理技术和光学字符识别(OCR),我们可以快速提取验证码中的文本。环境准备安装Python和依赖库确保已安装Python。如果尚未安装,可以访问Python官网进行下载和安装。接着,我们......
  • 原生支持 TypeScript
    原生支持TypeScript小程序代码包要求代码文件为wxml/wxss/js/json/wxs。如果我们希望使用TypeScript或less去开发小程序,就需要将ts文件或less文件编译成对应的js文件或wxss文件,这个编译过程以前是需要开发者在工具外自行配置。从开发者工具1.05.210910......