使用Go语言破解网易易盾滑动验证码


本文将使用Go语言结合Selenium和OpenCV来实现破解网易易盾滑动验证码的任务。

验证码页面
验证码页面地址:https://dun.163.com/trial/jigsaw

准备工作
安装Go语言环境。
安装ChromeDriver。
安装Selenium和OpenCV库。
代码实现
1. 安装依赖
首先,我们需要安装Go的依赖库,使用如下命令:

sh

go get github.com/tebeka/selenium
go get gocv.io/x/gocv
2. 编写代码
创建一个Go文件,例如main.go,并编写如下代码:

go

package main

import (
    "encoding/base64"
    "fmt"
    "image"
    "image/png"
    "io/ioutil"
    "log"
    "os"
    "strings"
    "time"

    "github.com/tebeka/selenium"
    "gocv.io/x/gocv"
)

// 保存元素截图
func saveElementScreenshot(element selenium.WebElement, filePath string) error {
    base64Image, err := element.Screenshot(true)
    if err != nil {
        return err
    }
    imageData, err := base64.StdEncoding.DecodeString(base64Image)
    if err != nil {
        return err
    }
    return ioutil.WriteFile(filePath, imageData, 0644)
}

// 获取缺口位置
func getGap(bgImagePath, tpImagePath string) (int, error) {
    bgMat := gocv.IMRead(bgImagePath, gocv.IMReadColor)
    tpMat := gocv.IMRead(tpImagePath, gocv.IMReadGrayScale)

    if bgMat.Empty() || tpMat.Empty() {
        return 0, fmt.Errorf("无法读取图像")
    }

    result := gocv.NewMat()
    gocv.MatchTemplate(bgMat, tpMat, &result, gocv.TmSqdiffNormed)
    _, _, minLoc, _ := gocv.MinMaxLoc(result)
    return minLoc.X, nil
}

// 模拟滑动
func simulateDrag(driver selenium.WebDriver, element selenium.WebElement, distance int) error {
    action := driver.Action()
    err := action.ClickAndHold(element).Perform()
    if err != nil {
        return err
    }
    time.Sleep(200 * time.Millisecond)

    moveTrack := []int{}
    currentDistance := 0

    for currentDistance < distance {
        moveDistance := 10
        moveTrack = append(moveTrack, moveDistance)
        currentDistance += moveDistance
    }

    for _, move := range moveTrack {
        err := action.MoveByOffset(move, 0).Perform()
        if err != nil {
            return err
        }
        time.Sleep(10 * time.Millisecond)
    }

    return action.Release(element).Perform()
}

func main() {
    const (
        seleniumPath = "/path/to/selenium-server-standalone.jar"
        geckoDriverPath = "/path/to/chromedriver"
        port = 8080
    )

    opts := []selenium.ServiceOption{
        selenium.Output(os.Stderr),
    }
    service, err := selenium.NewChromeDriverService(geckoDriverPath, port, opts...)
    if err != nil {
        log.Fatalf("Error starting the ChromeDriver server: %v", err)
    }
    defer service.Stop()

    caps := selenium.Capabilities{"browserName": "chrome"}
    driver, err := selenium.NewRemote(caps, fmt.Sprintf("http://localhost:%d/wd/hub", port))
    if err != nil {
        log.Fatalf("Error connecting to the WebDriver server: %v", err)
    }
    defer driver.Quit()

    err = driver.Get("https://dun.163.com/trial/jigsaw")
    if err != nil {
        log.Fatalf("Failed to load page: %v", err)
    }

    time.Sleep(2 * time.Second)

    bgImagePath := "bgImage.png"
    tpImagePath := "tpImage.png"

    bgElement, err := driver.FindElement(selenium.ByCSSSelector, ".geetest_canvas_bg")
    if err != nil {
        log.Fatalf("Failed to find background element: %v", err)
    }
    tpElement, err := driver.FindElement(selenium.ByCSSSelector, ".geetest_canvas_fullbg")
    if err != nil {
        log.Fatalf("Failed to find template element: %v", err)
    }

    err = saveElementScreenshot(bgElement, bgImagePath)
    if err != nil {
        log.Fatalf("Failed to save background image: %v", err)
    }
    err = saveElementScreenshot(tpElement, tpImagePath)
    if err != nil {
        log.Fatalf("Failed to save template image: %v", err)
    }

    gap, err := getGap(bgImagePath, tpImagePath)
    if err != nil {
        log.Fatalf("Failed to get gap: %v", err)
    }

    slider, err := driver.FindElement(selenium.ByCSSSelector, ".geetest_slider_button")
    if err != nil {
        log.Fatalf("Failed to find slider element: %v", err)
    }

    err = simulateDrag(driver, slider, gap)
    if err != nil {更多内容联系1436423940

        log.Fatalf("Failed to simulate drag: %v", err)
    }

    time.Sleep(5 * time.Second)
}
运行脚本
确保已经安装了Go,并在项目根目录下运行以下命令来构建和运行项目:

sh

go run main.go

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值