.NET 6 实现滑动验证码(二)、基本数据
上一节,介绍了滑动验证码的基本情况,也创建了一个.NET 6的工程。本节内容是创建一些基础类。
本节创建的类全部在工程的Model目录下:
CaptchaData.cs
CaptchaData.cs:验证码的数据类实体
namespace SlideCaptcha.Model
{
public class CaptchaData
{
/// <summary>
/// id
/// </summary>
public string Id { get; set; }
/// <summary>
/// 背景图(含凹槽)
/// </summary>
public string BackgroundImage { get; set; }
/// <summary>
/// 滑动块图
/// </summary>
public string SliderImage { get; set; }
public CaptchaData(string id, string backgroundImage, string sliderImage)
{
Id = id;
BackgroundImage = backgroundImage;
SliderImage = sliderImage;
}
}
}
id表示验证码的id值,用于校验验证码,BackgroundImage 是验证码图片base64,包含了凹槽。凹槽模板在templates目录下。SliderImage 是滑块图片。模板在templates下。
CaptchaValidateData.cs
CaptchaValidateData.cs:验证码验证数据实体
namespace SlideCaptcha.Model
{
public class CaptchaValidateData
{
/// <summary>
/// 滑动比例
/// </summary>
public float Percent { get; set; }
/// <summary>
/// 容错值(校验时用,缺口位置与实际滑动位置匹配容错范围)
/// </summary>
public float Tolerant { get; set; }
public CaptchaValidateData(float percent, float tolerant)
{
Percent = percent;
Tolerant = tolerant;
}
}
}
ImageCaptchaInfo.cs
ImageCaptchaInfo.cs:证码图片信息实体
namespace SlideCaptcha.Model
{
public class ImageCaptchaInfo
{
/// <summary>
/// 背景图宽
/// </summary>
public int BackgroundImageWidth { get; set; }
/// <summary>
/// 背景图高
/// </summary>
public int BackgroundImageHeight { get; set; }
/// <summary>
/// 背景图
/// </summary>
public string BackgroundImageBase64 { get; set; }
/// <summary>
/// 滑动块图宽
/// </summary>
public int SliderImageWidth { get; set; }
/// <summary>
/// 滑动块图高
/// </summary>
public int SliderImageHeight { get; set; }
/// <summary>
/// 滑动块图
/// </summary>
public string SliderImageBase64 { get; set; }
}
}
验证码实体类的基类,滑动验证码、旋转验证码、点选验证码、拼接验证码都基于这个类。
Resource.cs
Resource.cs :资源实体类
namespace SlideCaptcha.Model
{
public class Resource
{
public Resource(){}
/// <summary>
/// 资源数据
/// </summary>
public string Data { get; set; }
/// <summary>
/// 资源类型
/// </summary>
public string Type { get; set; }
/// <summary>
/// 构造函数
/// </summary>
/// <param name="type">资源类型</param>
/// <param name="data">资源数据</param>
public Resource(string type,string data)
{
Type = type;
Data = data;
}
}
}
资源数据,Data为要生成验证码图片路径。Type为类型,目前仅为本地文件,后期将扩展URL模式。
SliderImageCaptchaInfo.cs
SliderImageCaptchaInfo.cs:滑动验证码实体类
using SlideCaptcha.Exceptions;
namespace SlideCaptcha.Model
{
public class SliderImageCaptchaInfo : ImageCaptchaInfo
{
/// <summary>
/// 凹槽x坐标
/// </summary>
public int X { get; set; }
/// <summary>
/// 凹槽y坐标
/// </summary>
public int Y { get; set; }
/// <summary>
/// 凹槽位置百分比
/// </summary>
public float Percent
{
get
{
if (BackgroundImageWidth <= 0) return 0;
return 1.0f * X / BackgroundImageWidth;
}
}
public void Check()
{
// 校验
if (this.X <= 0) throw new SlideCaptchaException($"SliderImageCaptchaInfo数据异常: {nameof(X)}小于等于0");
if (this.Y <= 0) throw new SlideCaptchaException($"SliderImageCaptchaInfo数据异常: {nameof(Y)}小于等于0");
if (this.BackgroundImageWidth <= 0) throw new SlideCaptchaException($"SliderImageCaptchaInfo数据异常: {nameof(BackgroundImageWidth)}小于等于0");
if (this.BackgroundImageHeight <= 0) throw new SlideCaptchaException($"SliderImageCaptchaInfo数据异常: {nameof(BackgroundImageHeight)}小于等于0");
if (this.SliderImageWidth <= 0) throw new SlideCaptchaException($"SliderImageCaptchaInfo数据异常: {nameof(SliderImageWidth)}小于等于0");
if (this.SliderImageHeight <= 0) throw new SlideCaptchaException($"SliderImageCaptchaInfo数据异常: {nameof(SliderImageHeight)}小于等于0");
if (string.IsNullOrWhiteSpace(this.BackgroundImageBase64)) throw new SlideCaptchaException($"SliderImageCaptchaInfo数据异常: {nameof(BackgroundImageBase64)}为空");
if (string.IsNullOrWhiteSpace(this.SliderImageBase64)) throw new SlideCaptchaException($"SliderImageCaptchaInfo数据异常: {nameof(SliderImageBase64)}为空");
}
}
}
SlideTrack.cs
·SlideTrack.cs:滑动轨迹·
using SlideCaptcha.Exceptions;
using System;
using System.Collections.Generic;
namespace SlideCaptcha.Model
{
/// <summary>
/// 滑动轨迹
/// </summary>
public class SlideTrack
{
/// <summary>
/// 背景图片宽度(可能经过缩放,不是原始图片宽高)
/// </summary>
public int BackgroundImageWidth { get; set; }
/// <summary>
/// 背景图片高度(可能经过缩放,不是原始图片宽高)
/// </summary>
public int BackgroundImageHeight { get; set; }
/// <summary>
/// 滑块图片宽度(可能经过缩放,不是原始图片宽高)
/// </summary>
public int SliderImageWidth { get; set; }
/// <summary>
/// 滑块图片高度(可能经过缩放,不是原始图片宽高)
/// </summary>
public int SliderImageHeight { get; set; }
/// <summary>
/// 滑动开始时间(可能经过缩放,不是原始图片宽高)
/// </summary>
public DateTime StartTime { get; set; }
/// <summary>
/// 滑动结束时间
/// </summary>
public DateTime EndTime { get; set; }
/// <summary>
/// 轨迹
/// </summary>
public List<Track> Tracks { get; set; }
/// <summary>
/// 滑动比例
/// </summary>
public float Percent
{
get
{
if (this.BackgroundImageWidth <= 0) return -1;
if (this.Tracks.Count <= 0) return -1;
var lastTrack = this.Tracks[this.Tracks.Count - 1];
return 1.0f * lastTrack.X / this.BackgroundImageWidth;
}
}
public void Check()
{
// 校验
if (this.BackgroundImageWidth <= 0) throw new SlideCaptchaException($"SlideTrack数据异常: {nameof(BackgroundImageWidth)}小于等于0");
if (this.BackgroundImageHeight <= 0) throw new SlideCaptchaException($"SlideTrack数据异常: {nameof(BackgroundImageHeight)}小于等于0");
if (this.SliderImageWidth <= 0) throw new SlideCaptchaException($"SlideTrack数据异常: {nameof(SliderImageWidth)}小于等于0");
if (this.SliderImageHeight <= 0) throw new SlideCaptchaException($"SlideTrack数据异常: {nameof(SliderImageHeight)}小于等于0");
if (this.StartTime == DateTime.MinValue) throw new SlideCaptchaException($"SlideTrack数据异常: {nameof(StartTime)}为空");
if (this.EndTime == DateTime.MinValue) throw new SlideCaptchaException($"SlideTrack数据异常: {nameof(EndTime)}为空");
}
public void CheckTracks()
{
if (this.Tracks == null || this.Tracks.Count == 0) throw new SlideCaptchaException($"SlideTrack数据异常: {nameof(Tracks)}为空");
}
}
}
TemplatePair.cs
·TemplatePair.cs:模板类·
namespace SlideCaptcha.Model
{
public class TemplatePair
{
public TemplatePair() { }
/// <summary>
/// 滑块资源
/// </summary>
public Resource Slider { get; set; }
/// <summary>
/// 凹槽资源
/// </summary>
public Resource Notch { get; set; }
/// <summary>
/// 模板类型
/// </summary>
public string TYPE { get; set; }
/// <summary>
/// 构造函数
/// </summary>
/// <param name="slider">滑块资源</param>
/// <param name="notch">凹槽资源</param>
/// <param name="type">末班类型</param>
public TemplatePair(Resource slider, Resource notch,string type)
{
Slider = slider;
Notch = notch;
TYPE = type;
}
/// <summary>
/// 创建模板
/// </summary>
/// <param name="slider">滑块资源</param>
/// <param name="notch">凹槽资源</param>
/// <returns></returns>
public static TemplatePair Create(Resource slider, Resource notch,string type)
{
return new TemplatePair(slider, notch,type);
}
}
}
Track.cs
Track.cs :滑动数据实体类
namespace SlideCaptcha.Model
{
public class Track
{
/// <summary>
/// X轴
/// </summary>
public int X { get; set; }
/// <summary>
/// Y轴
/// </summary>
public int Y { get; set; }
/// <summary>
/// 时间
/// </summary>
public int T { get; set; }
}
}
代码中SlideCaptchaException是自定义错误类。自定义错误类在Extensions文件夹下,这个后面的代码会进行说明。
下载地址:https://pan.baidu.com/s/19mx24FXrnqz9u2mmFqlr6g?pwd=7636
.NET 6 实现滑动验证码(二)、基本数据的更多相关文章
- 爬虫(十二):图形验证码的识别、滑动验证码的识别(B站滑动验证码)
1. 验证码识别 随着爬虫的发展,越来越多的网站开始采用各种各样的措施来反爬虫,其中一个措施便是使用验证码.随着技术的发展,验证码也越来越花里胡哨的了.最开始就是几个数字随机组成的图像验证码,后来加入 ...
- thinkphp整合系列之极验滑动验证码
对于建站的筒子们来说:垃圾广告真是让人深恶痛绝:为了清净:搞个难以识别的验证码吧:又被用户各种吐槽:直到后来出现了极验这个滑动的验证码:这真是一个体验好安全高的方案:官网:http://www.gee ...
- 一步步实现滑动验证码,Java图片处理关键代码
最近滑动验证码在很多网站逐步流行起来,一方面对用户体验来说,比较新颖,操作简单,另一方面相对图形验证码来说,安全性并没有很大的降低.当然到目前为止,没有绝对的安全验证,只是不断增加攻击者的绕过成本. ...
- VUE中使用geetest滑动验证码
一,准备工作:服务端部署 下载文件gt.gs: https://github.com/GeeTeam/gt3-python-sdk 需要说明的是这里的gt.js文件,它用于加载对应的验证JS库. 1. ...
- vue_drf之实现极验滑动验证码
一.需求 1,场景 我们在很多登录和注册场景里,为了避免某些恶意攻击程序,我们会添加一些验证码,也就是行为验证,让我们相信现在是一个人在交互,而不是一段爬虫程序.现在市面上用的比较多的,比较流行的是极 ...
- 使用python实现滑动验证码
首先安装一个需要用到的模块 pip install social-auth-app-django 安装完后在终端输入pip list会看到 social-auth-app-django social- ...
- python验证码识别(2)极验滑动验证码识别
目录 一:极验滑动验证码简介 二:极验滑动验证码识别思路 三:极验验证码识别 一:极验滑动验证码简介 近些年来出现了一些新型验证码,不想旧的验证码对人类不友好,但是这种验证码对于代码来说识别难度上 ...
- selenium篇之滑动验证码
一.介绍 现在出现了一种通过用户鼠标移动滑块来填补有缺口图片的验证码,我们叫做滑动验证码.它的原理很简单,首先生成一张图片,然后随机挖去一块,在页面展示被挖去部分的图片,再通过js获取用户滑动距离,以 ...
- 用Python写一个滑动验证码
1.准备阶段 滑动验证码我们可以直接用GEETEST的滑动验证码. 打开网址:https://www.geetest.com/ ,找到技术文档中的行为验证,打开部署文档,点击Python,下载ZIP包 ...
- 利用selenium库自动执行滑动验证码模拟登陆
破解流程 #1.输入账号.密码,然后点击登陆 #2.点击按钮,弹出没有缺口的图 #3.针对没有缺口的图片进行截图 #4.点击滑动按钮,弹出有缺口的图 #5.针对有缺口的图片进行截图 #6.对比两张图片 ...
随机推荐
- Windows Powershell 对于布尔值的处理
Windows PowerShell中有很多场景需要输入0或者1作为命令的参数.Powershell对于布尔值的逻辑处理究竟是怎样的呢?除了最常用的$True, $False, 1, 0.对于要求输入 ...
- 2. 在 Kubernetes 上安装 Gitlab
总结: 所需要的三个yaml文件的下载地址:https://files.cnblogs.com/files/sanduzxcvbnm/k8s-gitlab.zip Gitlab官方提供了 Helm 的 ...
- 基于python的端口扫描
前言 端口扫描是指某些别有用心的人发送一组端口扫描消息,试图以此侵入某台计算机,并了解其提供的计算机网络服务类型(这些网络服务均与端口号相关).端口扫描是计算机解密高手喜欢的一种方式.攻击者可以通过它 ...
- DeepHyperX代码理解-HamidaEtAl
代码复现自论文<3-D Deep Learning Approach for Remote Sensing Image Classification> 先对部分基础知识做一些整理: 一.局 ...
- golang channel底层结构和实现
一.介绍 Golang 设计模式: 不要通过共享内存来通信,而要通过通信实现内存共享 channel是基于通信顺序模型(communication sequential processes, CSP) ...
- P7113 [NOIP2020] 排水系统 (拓扑排序)
(不想打高精,也不想学习其他大佬的神仙写法,打了90分的错解). 本题容易想到用拓扑排序处理,涉及分数的加法,用long long会超时,不过通分时先除后乘卡一下也可以拿90分. 结构体真是个复杂的东 ...
- Java登录专题-----创建用户(一)
Java登录专题-----创建用户(一) 我来填坑了 创建用户 入参 应该包括: 用户姓名,用户密码,用户手机号,用户所属机构 用户版本号,角色id 出参: 没有 数据结构: JavaBean ...
- Vue3.x+element-plus+ts踩坑笔记
闲聊 前段时间小颖在B站找了个学习vue3+TS的视频,自己尝试着搭建了一些基础代码,在实现功能的过程中遇到了一些问题,为了防止自己遗忘,写个随笔记录一下嘻嘻 项目代码 git地址:vue3.x-ts ...
- JUC(3)
文章目录 1.集合类不安全 2.在高并发情况下arraylist()并不安全 3.高并发下set并不安全 3.测试map(高并发情况下出现问题) 1.集合类不安全 2.在高并发情况下arraylist ...
- 云原生分布式 PostgreSQL+Citus 集群在 Sentry 后端的实践
优化一个分布式系统的吞吐能力,除了应用本身代码外,很大程度上是在优化它所依赖的中间件集群处理能力.如:kafka/redis/rabbitmq/postgresql/分布式存储(CephFS,Juic ...