.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.对比两张图片 ...
随机推荐
- Kubernetes 调度 - 污点和容忍度详解
当我们使用节点亲和力(Pod 的一个属性)时,它会将Pod吸引到一组节点(作为偏好或硬性要求).污点的行为完全相反,它们允许一个节点排斥一组 Pod. 在 Kubernetes 中,您可以标记(污染) ...
- 1-Mysql数据库简洁命令
1-进入mysql数据库 mysql -u root -p 2-创建数据库 mysql> CREATE DATABASE serurities_master; mysql> USE ser ...
- MySQL 主从同步延迟监控
MySQL5.7和8.0支持通过 replication_applier_status 表获同步延迟时间,当从库出现延迟后,该表中的字段 REMAINING_DELAY 记录延迟秒数,当没有延迟时,该 ...
- NSIS限制程序运行次数和使用日期
#七八年前写着玩的小东西,实际用途不大,但对刚接触nsis的新手来说应该还有一些帮助,包括创建控件,获取系统时间等,与诸位共勉! !system '>blank set/p=MSCF<nu ...
- InetAddress.getLocalHost() 执行很慢?
背景介绍 某次在 SpringBoot 2.2.0 项目的一个配置类中引入了这么一行代码: InetAddress.getLocalHost().getHostAddress() 导致项目启动明显变慢 ...
- 洛谷P1253 [yLOI2018] 扶苏的问题 (线段树)
一道用来练习打标记的好题. 对于区间加和区间赋值两个操作分别用两个标记,分析如何打标记并下传标记(还是比较好分析的). 坑点:查询操作时,我一开始把ans设为-0x3f3f3f3f(调试了好久才发现) ...
- Podman容器技术基础
Podman容器技术基础 目录 Podman容器技术基础 简介 安装 基础命令 简介 Podman 是一个开源的容器运行时项目,可在大多数 Linux 平台上使用.Podman 提供与 Docker ...
- 手写自定义springboot-starter,感受框架的魅力和原理
一.前言 Springboot的自动配置原理,面试中经常问到,一直看也记不住,不如手写一个starter,加深一下记忆. 看了之后发现大部分的starter都是这个原理,实践才会记忆深刻. 核心思想: ...
- 齐博x1如果把万能表单直接插入到内容中去
很多时候,你创建了一个万能表单可能像下面这个情况,在文章中加一个链接叫别人点击填表,其实这个很不人性化,用户也容易忽略. 其实你完全可以像下面这样,把表单直接引用到文章中来.给用户更直观的感觉 那是如 ...
- go-zero docker-compose 搭建课件服务(九):http统一返回和集成日志服务
0.索引 go-zero docker-compose 搭建课件服务(九):http统一返回和集成日志服务 0.1源码地址 https://github.com/liuyuede123/go-zero ...