首页 > 其他分享 >使用Go语言破解滑块验证码的完整流程

使用Go语言破解滑块验证码的完整流程

时间:2024-10-11 11:24:33浏览次数:8  
标签:distance return 滑块 err nil fmt 验证码 Go png

在本文中,我们将通过 Go 语言破解滑块验证码,逐步讲解如何计算滑块移动距离、生成轨迹并提交验证请求。

  1. 下载验证码图片
    使用 Go 的 net/http 库来获取验证码图片,并保存到本地。

package main

import (
"fmt"
"io/ioutil"
"net/http"
"os"
)

func downloadImage(url string, filePath string) error {
resp, err := http.Get(url)
if err != nil {
return err
}
defer resp.Body.Close()

body, err := ioutil.ReadAll(resp.Body)
if err != nil {
	return err
}

err = ioutil.WriteFile(filePath, body, 0644)
if err != nil {
	return err
}

fmt.Printf("Downloaded image from %s\n", url)
return nil

}

func main() {
downloadImage("https://captcha.com/bg.png", "background.png")
downloadImage("https://captcha.com/fg.png", "foreground.png")
}
2. 计算滑块移动距离
为了计算滑块移动的距离,我们需要将前景图片和背景图片进行对比。Go 语言的 image 库可以帮助我们处理图像操作。

package main

import (
"fmt"
"image"
"image/jpeg"
"os"

"golang.org/x/image/draw"

)

func calculateDistance(bgPath, fgPath string) (int, error) {
bgFile, err := os.Open(bgPath)
if err != nil {
return 0, err
}
defer bgFile.Close()

fgFile, err := os.Open(fgPath)
if err != nil {
	return 0, err
}
defer fgFile.Close()

bgImg, err := jpeg.Decode(bgFile)
if err != nil {
	return 0, err
}

fgImg, err := jpeg.Decode(fgFile)
if err != nil {
	return 0, err
}

bounds := bgImg.Bounds()
for x := 0; x < bounds.Max.X; x++ {
	for y := 0; y < bounds.Max.Y; y++ {
		bgPixel := bgImg.At(x, y)
		fgPixel := fgImg.At(x, y)
		if !isPixelSimilar(bgPixel, fgPixel) {
			fmt.Printf("Slide distance is %d\n", x)
			return x, nil
		}
	}
}

return 0, nil

}

func isPixelSimilar(a, b image.Color) bool {
// 简单的颜色比较
return a == b
}

func main() {
downloadImage("https://captcha.com/bg.png", "background.png")
downloadImage("https://captcha.com/fg.png", "foreground.png")
distance, err := calculateDistance("background.png", "foreground.png")
if err != nil {
fmt.Println("Error calculating distance:", err)
return
}
fmt.Println("Calculated distance:", distance)
}
3. 生成滑动轨迹
滑动轨迹应该是随机的,并且模仿真实用户的行为。在此,我们生成一个轨迹数据,包含 x 坐标的变化和时间延迟。

package main

import (
"fmt"
"math/rand"
"time"
)

func generateTrack(distance int) ([][3]int, int) {
rand.Seed(time.Now().UnixNano())
track := make([][3]int, 0)
current := 0
totalTime := 0

for current < distance {
	move := rand.Intn(3) + 1
	current += move
	if current > distance {
		current = distance
	}
	timeDelay := rand.Intn(20) + 10
	totalTime += timeDelay
	track = append(track, [3]int{current, 0, totalTime})
}

return track, totalTime

}

func main() {
track, timeSpent := generateTrack(100)
fmt.Printf("Generated track: %v\n", track)
fmt.Printf("Time spent: %d ms\n", timeSpent)
}
4. 发送验证请求
我们使用 Go 的 net/http 库发送带有滑动距离和轨迹的验证请求。

package main

import (
"bytes"
"fmt"
"net/http"
"strings"
)

func sendVerification(distance int, track [][3]int) error {
trackStr := make([]string, 0, len(track))
for _, t := range track {
trackStr = append(trackStr, fmt.Sprintf("[%d,%d,%d]", t[0], t[1], t[2]))
}
trackData := strings.Join(trackStr, ",")

data := fmt.Sprintf("distance=%d&track=%s", distance, trackData)
resp, err := http.Post("https://captcha.com/verify", "application/x-www-form-urlencoded", bytes.NewBufferString(data))
if err != nil {
	return err
}
defer resp.Body.Close()

fmt.Println("Verification request sent. Response status:", resp.Status)
return nil

}
更多内容联系1436423940
func main() {
distance := 100
track, _ := generateTrack(distance)
sendVerification(distance, track)
}
5. 主程序整合
最后,我们将所有步骤整合起来,形成一个完整的流程。

package main

func main() {
// 1. 下载验证码图片
downloadImage("https://captcha.com/bg.png", "background.png")
downloadImage("https://captcha.com/fg.png", "foreground.png")

// 2. 计算滑动距离
distance, err := calculateDistance("background.png", "foreground.png")
if err != nil {
	fmt.Println("Error calculating distance:", err)
	return
}

// 3. 生成滑动轨迹
track, _ := generateTrack(distance)

// 4. 发送验证请求
err = sendVerification(distance, track)
if err != nil {
	fmt.Println("Error sending verification:", err)
}

}

标签:distance,return,滑块,err,nil,fmt,验证码,Go,png
From: https://www.cnblogs.com/ocr1/p/18458036

相关文章

  • ArgoCD + ArgoCD Image Updater 部署实现
    部署思路踩坑整理1、ArgoCD和ArgoCDImageUpdater是2个不同的程序。"ArgoCDImageUpdater小工具"没有集成在ArgoCD中需要单独部署。2、单独的ArgoCD能够实现基于git仓库变更作为应用部署的事实来源[参考子页:argocd根据镜像tag变化实现自动发布的2种方式];ArgoCD+"ArgoCD......
  • 基于django的民宿预定管理系统的设计与实现---附源码60197
    目录摘要1绪论1.1选题背景与意义1.2国内外研究现状1.3论文结构与章节安排2系统分析2.1可行性分析2.1.1经济可行性分析2.1.2技术可行性分析2.1.3操作可行性分析2.2系统流程分析2.2.1系统开发流程2.2.2用户登录流程2.2.3系统操作流程2.2.......
  • MongoDB集群的启动和关闭顺序
    分片(Shard)环境中的启动和关闭1.启动这个具体的参照分片的配置,启动的顺序是configserver->副本集/分片(shardX)->->mongos2.关闭因为mongos是分片架构最前端的入口,所以关闭顺序:mongos->副本集/分片(shardX)->configserver单实例:直接关闭db.getSiblingDB(“admin”).shutdow......
  • python+django+uniapp高校社团管理系统 微信小程序 a4z3n
    目录项目介绍具体实现截图开发者工具介绍技术路线解决的思路性能/安全/负载方面开发语言以及框架介绍数据库设计python-flask核心代码部分展示python-django核心代码部分展示详细视频演示源码获取项目介绍主要是对于申请入社工作调研,以及对申请入社信息采集、存储、......
  • 一个使用Oracle GoldenGate实现数据复制的例子
    OracleGoldenGate是一种数据复制和实时数据集成软件,用于在不同数据库之间进行数据同步和复制。以下是一个使用OracleGoldenGate实现数据复制的例子:假设我们有两个Oracle数据库实例:源数据库(source)和目标数据库(target),我们希望将源数据库中的某个表的数据实时复制到目标数据库......
  • 基于django+vue+Vue个性化图书借阅系统【开题报告+程序+论文】-计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景在信息化高速发展的今天,图书馆作为知识传播与学习的重要场所,面临着读者需求多样化、图书资源海量化的挑战。传统的图书借阅系统往往采用一......
  • 基于django+vue+Vue个体商户的仓库管理系统【开题报告+程序+论文】-计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景在当今快速发展的商业环境中,个体商户作为市场经济的重要组成部分,面临着日益激烈的竞争和复杂多变的市场需求。传统的仓库管理方式往往依赖......
  • 计算机毕业设计 Python医疗预约与诊断系统的设计与实现 Python毕业设计 Python毕业设
    博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌......
  • 基于django+vue+Vue歌曲发烧友网站【开题报告+程序+论文】-计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景在当今数字化时代,音乐已成为人们生活中不可或缺的一部分,它不仅能抒发情感,还能丰富我们的精神世界。随着互联网的迅猛发展,越来越多的人倾向......
  • 基于django+vue+Vue高校资产管理系统【开题报告+程序+论文】-计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着高等教育的快速发展,高校资产规模日益扩大,种类也日益繁多,包括教学设备、实验器材、图书资料、办公设施等。这些资产不仅是高校进行教学......