.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.对比两张图片 ...
随机推荐
- 若依(RuoYi )权限管理设计
前言 若依权限管理包含两个部分:菜单权限 和 数据权限.菜单权限控制着我们可以执行哪些操作.数据权限控制着我们可以看到哪些数据. 菜单是一个概括性名称,可以细分为目录.菜单和按钮,以若依自身为例: 目 ...
- MyBatis创建第二个项目
MyBatis创建第二个项目 Mysql文件配置 /* Navicat Premium Data Transfer Source Server : Mybatis Source Se ...
- 使用metricbeat监控system和nginx
下载并解压缩metricbeat metricbeat.yml配置文件设置: setup.kibana: host: "192.168.75.21:5601" output.ela ...
- 在 Fedora 中使用 Cockpit 创建虚拟机
本文向你展示如何在 Fedora 31 上使用安装 Cockpit 所需软件来创建和管理虚拟机.Cockpit 是一个交互式管理界面,可让你在任何受支持的 Web 浏览器上访问和管理系统.随着 vir ...
- Skywalking Swck Agent注入实现分析
项目地址: GitHub - apache/skywalking-swck: Apache SkyWalking Cloud on Kubernetes 项目简介: A bridge project ...
- MatrixOne从入门到实战04——MatrixOne的连接和建表
MatrixOne从入门到实战--MatrixOne的连接和建表 前景回顾 前几篇文章,为大家介绍了MatrixOne这个产品,以及编译.部署MatrixOne的服务. 直通车: MatrixOne从 ...
- Flutter Cocoon 已达到 SLSA 2 级标准的要求
文/ Jesse Seales, Dart 和 Flutter 安全工作组工程师 今年年初,我们发布了 Flutter 2022 产品路线图,其中「基础设施建设」这部分提到:2022 年 Flutte ...
- 2022“杭电杯”中国大学生算法设计超级联赛(6)- 1011 Find different
2022"杭电杯"中国大学生算法设计超级联赛(6)- 1011 Find different 比赛时队友开摆,还剩半个小时,怎么办?? 当然是一起摆 Solution 看到这个题没 ...
- 快速上手Spring项目
通过maven依赖管理导入所需Jar包 注 : spring 需要导入commons-logging进行日志记录 . 我们利用maven , 他会自动下载对应的依赖项 . <dependency ...
- MVC下拉框
<select> @{ foreach (var item in 循环泛型) { <option value="@item.ID">@item.属性名< ...