本文将使用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